Bash 複数行文字列変数の割り当てに失敗しました。

Bash 複数行文字列変数の割り当てに失敗しました。

Bashでこれがうまく機能するのはなぜですか?

$ cat test1.sh
#!/bin/bash
echo "some text" \
"some more text"
$ ./test1.sh
some text some more text

しかし、これは失敗しました。

$ cat test2.sh
#!/bin/bash
text="some text" \
"some more text"
echo $text
$ ./test2.sh
./test2.sh: line 3: some more text: command not found

私は両方とも期待test1.shしてtest2.sh同じことをします。

答え1

引用するPOSIX シェルコマンド言語

引用符のない<backslash>は、<newline>を除く後続の文字のリテラル値を保持します。 <newline>が<backslash>の後に来ると、シェルはそれを行の連続として解釈します。入力をトークンに分割する前に、<backslash>と<newline>を削除する必要があります。エスケープされた<newline>は入力から完全に削除され、スペースで置き換えられないため、トークン区切り文字として使用できません。

これは、最初の例では、シェルが実際に実行する操作が次のようになることを意味します。

echo "some text" "some more text"

echoこれは、標準出力として印刷するときにスペース文字に関連付けられた2つの引数が続く単純なコマンドです。

2番目の例では、シェルが実際に実行する操作は次のとおりです。

text="some text" "some more text"
echo $text

最初の行は、変数の代入が先行する単純なコマンドsome more text(スペース文字を含む単一のトークン)として解釈されtext="some text"実行されecho $textます。

最初と同じ結果を生成するには、2 番目のスニペットを次のように変更できます。

text="some text "\
"some more text"
echo "$text"

echo "$text"また、シェルがトークン化とファイル名の生成を適用しないようにするには、二重引用符が必要です$text(単一の空白および/またはワイルドカード以外の空白文字シーケンスが含まれている場合を除いて、サンプル文字列と変わりません。 )。

答え2

test1.shでecho指定されたすべてのパラメータ("some text"最初のパラメータ"some more text"と2番目のパラメータ)を印刷します。

そして、test2.shは間違った接続方法を使用して文字列を連結し、変数に割り当てようとします。

複数行にわたって文字列を分割するには、次のように閉じる引用符を省略し、次の行に進みます。

text="some text \
some more text"

関連情報