bash中复合命令和普通命令之间的本质区别是什么?

时间:2016-08-29 05:52:06

标签: bash

我正在学习bash。现在我学习[[...]]命令和((...))命令。它们被称为复合命令,它与正常命令区别开来,如[。我在bash手册中阅读了“复合命令”一文。它们似乎是按照自己的规则运行的。但不幸的是,我想不出为什么他们被称为“复合”。 有人知道,请告诉我。非常感谢你。

1 个答案:

答案 0 :(得分:5)

Bash区分简单命令和复合命令:

  1. 简单命令是带有可选参数和重定向的单个命令。例如:

    $ echo Hello
    Hello
    
  2. 复合命令将一个或多个简单命令组合成一个单独的单元。例如:

    $ { echo Hello; date; }
    Hello
    Sun Aug 28 23:16:03 PDT 2016
    

    复合命令的一个有用功能是应用于复合命令的重定向应用于它包含的每个命令。例如:

    $ { echo info1; echo info2; } >logfile
    $ cat logfile
    info1
    info2
    
  3. 根据man bash,有四种类型的复合命令:

    1. 组: {...;},如上所示,可用于将简单命令组合在一起以形成复合命令。

    2. 子shell: (...)类似于组,但命令在子shell环境中运行。这意味着变量赋值在子shell完成后不能生存。举个例子:

      $ a=0; (a=10; echo "inside=$a"); echo "outside=$a"
      inside=10
      outside=0
      
    3. 算术表达式:在双重内部中,可以执行一系列以逗号分隔的算术计算。例如:

      $ ((a=2, a=10*a, a+=2)); echo "a=$a"
      a=22
      
    4. 测试命令: Bash的测试命令[[...]]的高级形式可以包含多个测试。测试由&&||分隔:

      $ [[ a == b || 3 -gt 2 && 4 -gt 3 ]]; echo $?
      0
      
    5. 文档

      来自man bash

        

      复合命令

           

      复合命令是以下之一。在大多数情况下,列表中   命令的描述可以与命令的其余部分分开   通过一个或多个换行符,可能后面跟一个换行符   分号的地方。

           

      (list)

           

      列表在子shell环境中执行(请参阅命令执行   环境如下)。变量赋值和内置命令   影响shell的环境后不会保持有效   命令完成。返回状态是列表的退出状态。

           

      { list; }

           

      列表只是在当前的shell环境中执行。列表必须以换行符或分号结尾。   这称为组命令。返回状态是退出   清单状态。请注意,与元字符(和)不同,{和}   是保留字,必须出现在保留的地方   允许识别单词。因为他们不会引起一个字   打破,他们必须通过空格或
      分开列表   另一个shell元字符。

           

      ((expression))

           

      根据下述规则评估表达式   在算术评估下。如果表达式的值是   非零,返回状态为0;否则返回   状态是1.这与let"表达"。

      完全相同      

      [[ expression ]]

           

      根据评估结果,返回0或1的状态   条件表达式。表达式由   下面根据条件表达式描述的原色。   不对单词执行单词拆分和路径名扩展   在[[和]]之间;波浪扩展,参数   和变量扩展,算术扩展,命令替换,   执行流程替换和报价删除。   条件运算符(如-f)必须不加引号才能被识别为   初选。

           

      与[[,<和>运算符使用当前语言环境按字典顺序排序。