Bash中括弧の拡張と変数

Bash中括弧の拡張と変数

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

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つを設定してもう1つ追加したら、後で手動で追加する必要があります。また、照会出力を視点から維持するには、ディレクトリルートで実行する必要があります(./Dir/fileの代わりに./Upload/Dir/file)。

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

答え1

bash文書では、サポート拡張部分:

中かっこ拡張は他の拡張の前に実行され、他の拡張に固有の文字は結果に保持されます。。厳密にテキストです。 Bashは、拡張コンテキストまたは中括弧の間のテキストに構文解析を適用しません。パラメータ拡張との競合を避けるために、文字列 "${"は中括弧拡張に適しているとは見なされません。

もう一つの注意bash

拡張順序は、中括弧拡張、チルダ拡張、パラメータ、変数、算術拡張、コマンド置換です。 (左から右へ完成)、単語分割、ファイル名拡張。

だからあなたに関する限り、bash 見た中かっこ拡張変数を展開する前に、まず中かっこ拡張を実行して結果を生成します{Alpha,Bravo,Charlie}

$find_dir変数の内容を制御できる場合は、次のものを使用できますeval

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

関連情報