GNU/Linux >> Linux の 問題 >  >> Linux

Bashで$(コマンド置換)内で引用しますか?

私の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")")")"

しない バックティックで試してみたい。


Linux
  1. Bashの「評価」コマンド?

  2. 「?」を使用したコマンド置換

  3. bash sh - コマンドが見つかりません

  1. bash から apachectl を起動する

  2. bash エクスポート コマンド

  3. Bashのコマンド置換への変数代入の終了コード

  1. Bashトラップコマンドの説明

  2. Bashでのコマンド置換宣言構文–この2つのうちどちらがより適切な方法ですか??

  3. jenkins パイプラインで bash コマンドを実行する