次の例を考えてみましょう。
$ echo file_{a,b,c}
file_a file_b file_c # brace expansion worked :)
$ export VARIABLE=file_{a,b,c}
$ echo $VARIABLE
file_c # brace expansion didn't work :(
直接エコーすると中かっこ拡張が3つのファイルの名前をすべて印刷しますfile_{a,b,c}
が、同じ式を変数に割り当て、エコーするとfile_cの名前だけを印刷するのはなぜですか?
私の状況に合わせて中括弧で拡張された文字列を変数に割り当てる別の方法はありますか?
答え1
実行しset -x
て何が起こるかを確認してください。
$ set -x
$ export VARIABLE=file_{a,b,c}
+ export VARIABLE=file_a VARIABLE=file_b VARIABLE=file_c
+ VARIABLE=file_a
+ VARIABLE=file_b
+ VARIABLE=file_c
結局、同じ変数に異なる値が割り当てられ、各値は以前の値を上書きします。
中括弧拡張は「リストコンテキスト」でのみ機能するため、単一の文字列を生成するために使用するのは難しいと思います。似たようなことがなければstring=$(echo file_{a,b,c})
。
なしで同じことをするのと同じですexport
。つまり、VARIABLE=file_{a,b,c}
拡張されていない値のみを割り当てますVARIABLE='file_{a,b,c}'
。しかし、そうするならexport VARIABLE=$foo
、$foo
いいえ単語分割を行います。export
などの組み込み関数の割り当てはreadonly
少し奇妙です。 (これはBashにあります。他のシェルはテストしていません。)
ただし、スペースで区切られた文字列(実際には必要な場合)は、一意の値を格納する最良の方法ではないことに注意してください。主にスペースを含むファイル名を保存できないためです。
可能であれば、実行している作業に応じて配列の使用を検討することもできます。
$ arr=( file_{a,b,c} )
$ echo "${arr[1]}"
file_b
$ printf "<%s>\n" "${arr[@]}"
<file_a>
<file_b>
<file_c>