在下面的示例中,虽然我已将行if true && true
拆分为两行,但它可以正常工作并生成输出hi
。
if true &&
true
then
echo hi
fi
但是在下面的例子中,重定向操作符和文件名被分成两行,我得到一个错误。
wc -l <
/var/log/messages
我得到的错误是,
foo.sh: line 1: syntax error near unexpected token `newline'
foo.sh: line 1: `wc -l <'
我是否可以使用POSIX定义的规则来轻松了解线路延续的有效位置以及它们不在哪里?
答案 0 :(得分:1)
您想要搜索&#34;控制运营商&#34;在POSIX Shell命令语言文档(http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html)
中一些摘录:
A&#34;简单命令&#34;是一系列可选的变量赋值和重定向,按任意顺序,可选地后跟单词和重定向,由控制操作符终止。
管道是由控制操作员分隔的一个或多个命令的序列&#39; |&#39;。
AND-OR列表是由运营商分隔的一个或多个管道的序列&#34;&amp;&amp;&#34;和&#34; ||&#34; 。
列表是由运算符分隔的一个或多个AND-OR列表的序列&#39 ;;&#39;和&#39;&amp;&#39;并可选择由&#39 ;;&#39;,&#39;&amp;&#39;或。
终止。
根据grammar,可以跟随linebreak
的控制运算符是:
&&
和||
|
;
和&
此外,for和while循环,if和case语句,函数定义以及子shell和分组结构可以包含自由数量的换行符。
答案 1 :(得分:0)
容易吗?也许不是。
具体为AND_IF
和io_file
。
%token AND_IF OR_IF DSEMI /* '&&' '||' ';;' */ and_or : pipeline | and_or AND_IF linebreak pipeline | and_or OR_IF linebreak pipeline command : simple_command | compound_command | compound_command redirect_list | function_definition redirect_list : io_redirect | redirect_list io_redirect ; io_redirect : io_file | IO_NUMBER io_file | io_here | IO_NUMBER io_here ; io_file : '<' filename | LESSAND filename | '>' filename | GREATAND filename | DGREAT filename | LESSGREAT filename | CLOBBER filename ; filename : WORD /* Apply rule 2 */