在 bash 中为什么这可以正常工作:
$ cat test1.sh
#!/bin/bash
echo "some text" \
"some more text"
$ ./test1.sh
some text some more text
Run Code Online (Sandbox Code Playgroud)
但这失败了
$ 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
Run Code Online (Sandbox Code Playgroud)
我期待两者test1.sh并test2.sh做同样的事情。
未引用的 <backslash> 应保留以下字符的字面值,<newline> 除外。如果 <newline> 跟在 <backslash> 之后,shell 会将其解释为行继续。<backslash> 和 <newline> 应在将输入拆分为标记之前删除。由于转义的 <newline> 已从输入中完全删除并且没有被任何空格替换,因此它不能用作标记分隔符。
这意味着,在您的第一个示例中,shell 实际执行的是
echo "some text" "some more text"
Run Code Online (Sandbox Code Playgroud)
这是echo后跟两个参数的简单命令,在打印到标准输出时使用空格字符连接。
在你的第二个例子中,shell 实际执行的是
text="some text" "some more text"
echo $text
Run Code Online (Sandbox Code Playgroud)
其中第一行被解释为some more text变量赋值之前的简单命令(单个标记,包括空格字符)text="some text";然后,echo $text被执行。
要产生与第一个相同的结果,您的第二个片段可能会更改为
text="some text "\
"some more text"
echo "$text"
Run Code Online (Sandbox Code Playgroud)
另请注意, , 中的双引号echo "$text"需要防止外壳将分词和文件名生成应用于扩展$text(它与您的示例字符串没有区别,但如果它们包含除单个空格之外的空白字符序列,则会/ 或通配符)。