POSIX shell的shell脚本中哪些行继续有效以及哪些行无效?

时间:2015-03-05 18:00:09

标签: shell posix

在下面的示例中,虽然我已将行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定义的规则来轻松了解线路延续的有效位置以及它们不在哪里?

2 个答案:

答案 0 :(得分:1)

您想要搜索&#34;控制运营商&#34;在POSIX Shell命令语言文档(http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html

一些摘录:

  

2.9.1 Simple Commands

     
    

A&#34;简单命令&#34;是一系列可选的变量赋值和重定向,按任意顺序,可选地后跟单词和重定向,由控制操作符终止。

  
     

2.9.2 Pipelines

     
    

管道是由控制操作员分隔的一个或多个命令的序列&#39; |&#39;。

  
     

2.9.3 Lists

     
    

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)

容易吗?也许不是。

彻底? 2.10 Shell Grammar

具体为AND_IFio_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 */