我在大学进行的 shell 脚本测试中被问到了以下问题,但从未给出答案,谷歌也没有什么帮助。
问:用于结束此此处文档的行分隔符是什么?
fff=file
xyz <<\\$fff
...
答案1
此处文档结束的行是
\$fff
来自man bash
此处文档部分:
这里文档的格式是:
<<[-]word
here-document
delimiter
无参数和变量扩展、命令替换、算术扩展或路径名扩展在word上执行。如果word中的任何字符被引用,则分隔符是word删除引号的结果,并且此处文档中的行不会被扩展。如果 word 不加引号,则此处文档的所有行都会进行参数扩展、命令替换和算术扩展,字符序列\newline将被忽略,并且\必须用于引用字符\、$和`。
word
确实经历了引号删除,因此\\$fff
被取消引用为\$fff
.但是,正如手册页所说,没有进行变量扩展,因此它保持这种状态。
这里文档的主体可能会也可能不会进行变量扩展和反斜杠解释。在这种情况下,由于word
包含带引号的字符(即反斜杠),因此参数扩展和反斜杠反引号是不是对此处文档的文本执行。
但是,在变量扩展之前将输入与终止序列进行比较,因此无需在终止行中对\和进行反斜杠转义。$
答案2
终结者是
\$fff
我假设这就是@rici 的意思。正如他的倒数第二段所说,
word
确实经历了引号删除,因此\\$fff
被取消引用为\$fff
.但是,正如手册页所述,没有进行变量扩展,因此它保持这种状态。