私のBash環境では、スペースを含む変数を使用し、コマンド置換内でこれらの変数を使用します。
変数を引用する正しい方法は何ですか?そして、これらがネストされている場合、どうすればよいですか?
DIRNAME=$(dirname "$FILE")
または、置換の外で引用しますか?
DIRNAME="$(dirname $FILE)"
またはその両方?
DIRNAME="$(dirname "$FILE")"
またはバックティックを使用しますか?
DIRNAME=`dirname "$FILE"`
これを行う正しい方法は何ですか?また、見積もりが正しく設定されているかどうかを簡単に確認するにはどうすればよいですか?
承認された回答:
最悪から最高の順に:
-
DIRNAME="$(dirname $FILE)"
$FILE
の場合、あなたが望むことをしません 空白(または$IFS
の文字)が含まれている 現在含まれている)またはグロビング文字[?*
。 -
DIRNAME=`dirname "$FILE"`
技術的には正しいですが、バックティックは、ネストする際の複雑さと、内部で発生する余分なバックスラッシュ処理のため、コマンド拡張にはお勧めしません。 -
DIRNAME=$(dirname "$FILE")
正しいですが、これはスカラー(配列ではない)変数への割り当てであるためです。export DIRNAME=$(dirname "$FILE")
など、他のコンテキストでコマンド置換を使用する場合 またはdu $(dirname -- "$FILE")
、拡張の結果に空白またはグロブ文字が含まれている場合、引用符がないと問題が発生します。 -
DIRNAME="$(dirname "$FILE")"
(欠落している--
を除く 、以下を参照)が推奨される方法です。DIRNAME=
を置き換えることができます コマンドとスペースを使用して、他に何も変更せずに、dirname
正しい文字列を受け取ります。
さらに改善するには:
-
DIRNAME="$(dirname -- "$FILE")"
$FILE
の場合に機能します ダッシュで始まります。 -
DIRNAME="$(dirname -- "$FILE" && printf x)" && DIRNAME="${DIRNAME%?x}" || exit
$FILE
でも機能します$()
であるため、のdirnameは改行で終わります。 出力の最後で改行を切り取ります。どちらもdirname
によって追加されます。 および実際のデータの一部である可能性のあるもの。
コマンド拡張は好きなだけネストできます。 $()
を使用 常に新しい引用コンテキストを作成するため、次のようなことができます。
foo "$(bar "$(baz "$(ban "bla")")")"
しない バックティックで試してみたい。