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"