我的问题是为什么 bash 没有针对第 2 行进行报告,我故意在行末留下了尾随的“以查看它是如何报告这一点的。
我运行一个 bash 脚本并收到此错误:./test: 第 4 行:查找匹配的“”时出现意外的 EOF
#!/usr/bin/bash
echo "this is life
echo "now is the time"
echo "have we reached the end"
我的问题是为什么 bash 没有针对第 2 行进行报告,我故意在行末留下了尾随的“以查看它是如何报告这一点的。
我运行一个 bash 脚本并收到此错误:./test: 第 4 行:查找匹配的“”时出现意外的 EOF
#!/usr/bin/bash
echo "this is life
echo "now is the time"
echo "have we reached the end"
因为该行不包含错误,因为在引号字符串中包含换行符是完全合法的。
事实上,任何字符(但未转义的
"
,标记引用字符串的开始/结束)都可以包含在引用字符串中,如果以某种方式“放”在字符后面;换行符恰好很容易输入(就像任何“普通”字母字符一样),并且 - 值得注意的是 - 甚至不是可以包含在引用字符串1"
中的最奇特的东西。我建议您摆脱字符串只能包含字母、数字和标点符号的思维定势,因为它根本不是这样的,而且意识到这一点对使用命令行/脚本很有帮助。
无论如何,更重要的是,这里是对发生的事情以及为什么您仅在第 4 行收到错误通知的细分:
"
字符;它开始将其后的内容解释为字符串,并且当它偶然发现(如上所述,合法的)换行符时,它会愉快地接受它并开始解析第 3 行作为字符串的延续,该字符串到目前为止包括该"
字符后面的内容,其中包括换行符;"
字符;现在第一个字符串已正确且完整地解析。然后它将该行的其余部分解析为(合法的)未加引号的字符串,直到"
找到下一个字符,此时循环重复:它偶然发现了(如上所述,合法的)换行符,它愉快地接受它并开始解析第 4 行作为字符串的延续,到目前为止仅包含换行符;"
字符;第二个字符串现在已正确且完整地解析。然后,它将该行的其余部分解析为(合法的)未加引号的字符串,直到"
找到下一个字符,此时循环中断;它偶然发现了(同样,如上所述,合法的)换行符,它愉快地吞下它并且... 没有什么可解析的了/已到达 EOF(文件结束)。由于已到达 EOF,最后解析的肯定没有匹配的结束引号 - 因此会抛出"
错误unexpected EOF while looking for matching `"'
事实上,例如,如果将任何其他不可打印字符(ASCII 范围 0-31 - 而不仅仅是这些)粘贴在“”字符之后,它们也可以包含在字符串中。它们实际上与换行符没有什么不同 - 它们都是不可打印的字符 - 恰好换行符可以简单地输入。不可打印字符的另一个例外是制表符,它与换行符非常相似,也可以简单地输入。