web-dev-qa-db-ja.com

エスケープ_ $(アンダースコアとドル記号)

私はこの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_4hello_1_5などが必要です。

アンダースコアのみ、またはドル記号のみのエスケープは機能しません。何か案は?

ありがとう!

3
Jason

コードの先頭に次の行を追加します:set -u。次に、再実行して、何が得られるかを確認します。

変数i_がバインドされていない、つまりどこにも定義されていないというエラー。では、なぜbashがこの変数i_について話しているのですか?どこにも定義していません。エコーステートメントをよく見てください。"hello_$i_$j"は有効な変数名識別子文字であるため、$ iが変数i_と見なされた後のアンダースコアは_です。

したがって、bashがそうしないようにするには、変数名を中括弧{}で囲む必要があります。たとえば、echo "Hello_${i}_${j}"中括弧は、変数名が_に波及して当接するのを防ぎます。注:$jは区切りの目的で使用されるため、変数"の中括弧はオプションです。

8
Rakesh Sharma