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

Bashブレースの拡張と変数?

この質問にはすでに回答があります :`eval`なしで{}展開内の変数を使用できますか?

(3つの回答)
6年前に閉鎖されました。

検索コマンドがあります:

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

Alpha,Bravo,Charlieを置き換えたい $find_dirを使用

find Directory/{$find_dir} arg1 arg2

ただし、後者はに拡張されます

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

むしろ

find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2

なんで?これはかなり複雑なbashスクリプトの一部であり、ディレクトリが多かれ少なかれ含まれている可能性がありますが、すべてが関連しているわけではありません(したがって、Upload / *のグロビングは機能しません)。したがって、ここで3つセットアップして別のセットアップを行う場合は、後で手動で追加する必要があります。さらに、検索出力の観点を維持するために、ディレクトリのルートから実行する必要があります(./Dir/fileではなく./Upload/Dir/file)。

ただし、変数を使用すると、必要に応じて変数を変更し、スクリプトの他の部分との関連性を保つことができます。

承認された回答:

bashから ドキュメント、ブレース拡張セクション:

中括弧の拡張は他の拡張の前に実行され、
他の拡張に固有の文字は結果に保持されます

厳密にテキストです。 Bashは、拡張のコンテキストまたは中括弧の間のテキストに構文上の解釈を適用しません。

パラメータ拡張との競合を回避するために、文字列「${」は
中括弧拡張の対象とは見なされません。

bashの別のメモ :

展開の順序は、ブレース展開、チルダ展開、
パラメーター、変数、算術展開、およびコマンド置換(左から右に実行)です。 、単語分割、ファイル名
展開。

したがって、あなたの場合、bash 見た 変数展開の前にブレース展開を実行します。最初にブレース展開を実行し、結果を生成します{Alpha,Bravo,Charlie}

$find_dirを制御できる場合 可変コンテンツの場合、evalを使用できます :

eval "find Directory/{$find_dir} arg1 arg2"

Linux
  1. `〜#`はバッシュのチルダ拡張ですか?

  2. Bashで文字列の長さを見つける方法[クイックヒント]

  3. bash で変数を「入れ子にする」

  1. Bash を使用してファイルを検索してコピーする

  2. パターンに一致する最新のファイルを見つけるための Bash 関数

  3. bash のすべてのサブディレクトリにあるすべてのファイルを gzip する方法

  1. より愚かなBashのトリック:変数、検索、ファイル記述子、およびリモート操作

  2. 変数の拡張を延期する方法は?

  3. Bash でファイル拡張子を再帰的に変更する