私はこのBashスクリプトを持っています
for i in 1 2 3
do
for j in 4 5 6
do
echo "hello_$i_$j"
done
done
しかしそれは印刷します
hello_4
こんにちは_5
こんにちは_6
3回、(ご想像のとおり)私はhello_1_4、hello_1_5などが必要です。
アンダースコアのみ、またはドル記号のみのエスケープは機能しません。何か案は?
ありがとう!
コードの先頭に次の行を追加します:set -u
。次に、再実行して、何が得られるかを確認します。
変数i_
がバインドされていない、つまりどこにも定義されていないというエラー。では、なぜbashがこの変数i_
について話しているのですか?どこにも定義していません。エコーステートメントをよく見てください。"hello_$i_$j"
は有効な変数名識別子文字であるため、$ iが変数i_
と見なされた後のアンダースコアは_
です。
したがって、bashがそうしないようにするには、変数名を中括弧{}
で囲む必要があります。たとえば、echo "Hello_${i}_${j}"
中括弧は、変数名が_
に波及して当接するのを防ぎます。注:$j
は区切りの目的で使用されるため、変数"
の中括弧はオプションです。