Unix布尔运算符(&&, - a,||, - o)

Vic*_*ell 49 unix bash shell boolean operators

是否有人可以解释之间的区别&&,||,-a,和-oUnix的运营商?

这两种类型的使用有哪些限制?

是否只是在条件中使用标志时应该使用&&||运算符?

如:

[ "$1" = "yes" ] && [ -r $2.txt ]
Run Code Online (Sandbox Code Playgroud)

与:

[ "$1" = "yes" -a $2 -lt 3 ]
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 123

经验法则:使用-a-o方括号内侧&&||外侧.

理解shell语法和[ 命令语法之间的区别非常重要.

  • &&并且||是shell运营商.它们用于组合两个命令的结果.因为它们是shell语法,所以它们具有特殊的语法意义,不能用作命令的参数.

  • [不是特殊的语法.它实际上是一个名称命令[,也称为test.因为[它只是一个常规命令,所以它使用-a-o运算符.它不能使用&&,||因为那些是命令无法看到的shell语法.

可是等等!Bash的形式有更好的测试语法[[ ]].如果使用双方括号,则可以访问诸如正则表达式和通配符之类的内容.您也可以使用shell运营商如&&,||,<,和>自由的括号内,因为不像[,双括号的形式特殊的shell语法.Bash解析[[自己,所以你可以写出类似的东西[[ $foo == 5 && $bar == 6 ]].

  • 是的,似乎在标准中不推荐使用`-o`和`-a`标志.他们可能会继续工作很长一段时间,但为未来做好准备是件好事. (4认同)
  • 建议的 POSIX 兼容替换 `-a` 是对 `test` 的两个单独调用,并加上 `&amp;&amp;`:`[ expr1 -a expr2 ]` 变为 `[ expr1 ] &amp;&amp; [ expr2 ]`。`-o` 和 `||` 类似。 (2认同)

Bra*_*nam 15

-a和-o是test命令的较旧和/或运算符.&&和|| 是和/或shell的运算符.所以(假设旧壳)在你的第一种情况下,

[ "$1" = 'yes' ] && [ -r $2.txt ]
Run Code Online (Sandbox Code Playgroud)

shell正在评估和条件.在你的第二个案例中,

[ "$1" = 'yes' -a $2 -lt 3 ]
Run Code Online (Sandbox Code Playgroud)

测试命令(或内置测试)正在评估和条件.

当然,在所有现代或半现代的shell中,test命令都内置在shell中,所以实际上并没有任何区别.在现代shell中,if语句可以写成:

[[ $1 == yes && -r $2.txt ]]
Run Code Online (Sandbox Code Playgroud)

这与现代编程语言更相似,因此更具可读性.

  • [[形式更容易使用 - 它处理许多引用问题.例如,在示例中,`$ 1`可以不加引号,即使它可能是空的. (3认同)