命令分组(&&,||,...)

时间:2015-03-30 16:41:09

标签: bash syntax operator-precedence

我们目前在/ home / student /目录中。我们执行以下命令:

pwd; (ls) || { cd .. && ls student/; }  && cd student || cd / && cd ;

执行的命令是: pwd,ls,cd student,cd /,cd

以下是我的想法:

  • 执行pwd,因为它是第一个命令

  • (ls)在子shell中执行,因为命令是分开的 与";"

  • ||右侧的代码由于上的代码,因此没有执行 左边的||被执行

到目前为止,一切都很清楚,我想。但我不知道为什么要执行其他命令?如果有人可以为我分解,我会很感激。

2 个答案:

答案 0 :(得分:13)

&&||的运算符优先顺序是从左到右。

因此:

pwd; (ls) || { cd .. && ls student/; }  && cd student || cd / && cd ;

......等同于......

pwd; { { { (ls) || { cd .. && ls student/; }; } && cd student; } || cd /; } && cd ; }

......以图形方式打破这一点:

pwd; {                                      # 1
       {                                    # 2
         { (ls) ||                          # 3
                   { cd .. &&               # 4
                              ls student/;  # 5
                   };                       # 6
         } && cd student;                   # 7
       } || cd /;                           # 8
     } && cd ;                              # 9
  1. pwd无条件地发生
  2. (仅限分组)
  3. ls无条件地发生(在子shell中)。
  4. 如果(3)失败,则会发生
  5. cd ..
  6. 如果(3)失败并且(4)成功,则会发生
  7. ls student/
  8. (仅限分组)
  9. 如果(3)成功或两者(4)和(5)都成功,则会发生
  10. cd student
  11. 如果[(3)和(4)或(5)中的一个失败]或[(7)失败],则会发生
  12. cd /
  13. 如果(7)发生并成功,或(8)发生并成功,则发生
  14. cd

  15. 使用显式分组操作符是明智的,可以避免让自己感到困惑。避免将代码编写为难以阅读,因为这更加明智。

答案 1 :(得分:5)

  

(ls)在子shell中执行,因为命令是分开的   与";"

由于括号,

ls在子shell中执行。括号引入子壳。

  

但我不知道为什么要执行其他命令?

与您可能熟悉的其他编程语言不同,bash不会优先&&优先于||。它们具有相同的优先权,并从左到右进行评估。

如果您有a || b && c,则在其他语言中,这将被视为a || {b && c;}。如果a为真,那么bc都不会被评估。

但是,在bash中,它被解析为{a || b;} && c(严格的从左到右的优先顺序),因此当a为真时b被跳过但{{1}仍在评估中。