Escape_$(アンダースコアとドル記号)

Escape_$(アンダースコアとドル記号)

このBashスクリプトがあります

for i in 1 2 3
do
    for j in 4 5 6
    do
        echo "hello_$i_$j"
    done
done

しかし印刷されます

hello_4
hello_5
hello_6

3回、そして(おそらく)私は欲しいhello_1_4hello_1_5、等。

アンダースコアをエスケープしたり、ドル記号のみを使用したりすると機能しません。どんなアイデアがありますか?

ありがとうございます!

答え1

set -uコードの上部に次の行を追加します。その後、再度実行して何を得るかを確認します。

変数はunbound errorですi_。つまり、どこにも定義されていません。 bashがこの変数について話しているのはなぜですかi_?あなたはそれをどこにも定義しませんでした。 echo ドアを注意深く見てください。 $iの後の下線は有効な変数名識別子文字であるため、"hello_$i_$j"変数と見なされます。i__

したがって、Bashがこれを防ぐには、変数名を中括弧で囲む必要があります{}。たとえば、echo "Hello_${i}_${j}"中括弧は変数名がオーバーフローして一致するのを防ぎます_。注:変数の中括弧は目的を区別するために使用されるため、$jオプションです。"

関連情報