ファイル名に変数を使用するには?

ファイル名に変数を使用するには?

ファイル名に変数を正しく使用するには?これが私がすることですが、下線に何か問題があるようです。

domain="example"
sub="foo"

if [ -f /opt/nginx/conf.d/com_$domain_$sub.conf ]
  cat <<EOF > /opt/nginx/conf.d/com_$domain_$sub.conf
some multiline
content
EOF
fi

答え1

この場合、Bashはそれをdomain_拡張する変数の名前として解釈します。これは変数の有効な名前です。この名前を拡張することは望むものではありません。名前が終わると予想される場所をBashに知らせる必要があります。${}この場合は、次のようにしてください${domain}

/opt/nginx/conf.d/com_${domain}_${sub}.conf

ここでは誤解する余地がなくても使用しています(シェル変数名には許可されないからです${sub})。不要なところに使っても大丈夫だということをお見せしたいと思います。$sub.conf.${}

この変数は、シェルがそれを名前として扱うときに空のdomain_文字列に展開されます。変数は宣言されていませんが、正式には正常に拡張されました。設定されていない変数の使用は通常エラーではありません。 Invokeset -uとBashは設定されていない変数をエラーとして扱います(set +u必要に応じて回復します)。

設定されていない変数をエラーとして扱うことは、デバッグに役立つだけでなく、防御的なスクリプトにも役立ちます。設定されていない変数を意図的に許可しない限り、無効な値を引き続き使用するよりも設定されていない変数を拡張しようとすると、スクリプトがすぐに失敗する方が一般的です。変数を使用してパス名を指定するとき、「無効な値」とは「無効なファイルを上書きまたは削除する」ことを意味します。

返品正確に引用することを忘れないでください。例の値は引用されていない場合は安全ですが、カスタム引用はまだ問題ありません。 IMOを引用せずにできる場合は、毎回分析するよりも習慣的に引用する方が簡単で、エラーの可能性も少なくなります。

if [ -f "/opt/nginx/conf.d/com_${domain}_$sub.conf" ]

関連情報