Bashスクリプトには以下が含まれています。
for i in {a,b}-{1,2}; do
echo $i;
done
印刷
a-1
a-2
b-1
b-2
実行するとき。{a,b}
構造が拡大するにつれて、これが私が期待するものです。
ただし、(他の)スクリプトに次のものが含まれている場合
v={a,b}-{1,2}
echo $v
それは印刷する
{a,b}-{1,2}
これは私が期待したものではありません。私はそれが印刷されると予想しましたa-1 a-2 b-1 b-2
。もちろん、{a,b}
構造は拡張されません。
このように拡張できます。
v=$(echo {a,b}-{1,2})
これらの観察に基づいて、2つの質問があります。 1){a,b}
構成はいつ拡張されますか? 2)$(echo {a,b}-{1,2})
必要に応じて拡張を実行するのに好ましい方法ですか?
ベストアンサー1
これバッシュマニュアル説明する:
SIMPLE COMMAND EXPANSION
When a simple command is executed, the shell performs the following
expansions, assignments, and redirections, from left to right.
[...]
4. The text after the = in each variable assignment undergoes tilde
expansion, parameter expansion, command substitution, arithmetic
expansion, and quote removal before being assigned to the variable.
中括弧の拡張はリストにないため、割り当てでは実行されませんv={a,b}-{1,2}
。 @Wildcardが述べたように、単純な拡張はv=a-1 v=b-1 ...
とにかく意味がありません。
また、を実行すると、echo $v
次のことが適用されます。
EXPANSION
Expansion is performed on the command line after it has been split
into words. [...]
The order of expansions is: brace expansion; tilde expansion,
parameter and variable expansion, arithmetic expansion, and command
substitution (done in a left-to-right fashion); word splitting; and
pathname expansion.
中括弧拡張は変数拡張の前に発生するため、割り当てられた中括弧は$v
拡張されません。
しかし、次のようにすることができます。
$ var_this=foo var_that=bar
$ echo $var_{this,that}
foo bar
$(echo ...)
拡張したい文字列にスペースが含まれていない場合、拡張機能は機能するため、単語分割の問題は発生しません。より良いアプローチは、可能であれば配列変数を使用することです。
たとえば、拡張を配列に保存し、拡張値を使用していくつかのコマンドを実行します。
$ v=( {a,b}-{1,2} )
$ some_command "${v[@]}"