Bash中的布尔运算符(&;,-a,| |,-o)
有人能解释一下Bash中的布尔运算符(&;,-a,| |,-o),bash,shell,unix,boolean,operators,Bash,Shell,Unix,Boolean,Operators,有人能解释一下&、|、-a和-oUnix操作符之间的区别吗 这两种类型的使用都有哪些限制 是否只是在条件中使用标志时应使用&&和| |运算符 例如: [ "$1" = "yes" ] && [ -r $2.txt ] 与: [ "$1" = "yes" -a $2 -lt 3 ] 经验法则:在方括号内使用-a和-o,在方括号外使用&和| 理解shell语法和[命令语法之间的差异非常重要 &&和|是shell运算符。它们用于组合两个命令的结果。因为它们是shell语法,所以它
&
、|
、-a
和-o
Unix操作符之间的区别吗
这两种类型的使用都有哪些限制
是否只是在条件中使用标志时应使用&&
和| |
运算符
例如:
[ "$1" = "yes" ] && [ -r $2.txt ]
与:
[ "$1" = "yes" -a $2 -lt 3 ]
经验法则:在方括号内使用
-a
和-o
,在方括号外使用&
和|
理解shell语法和[
命令语法之间的差异非常重要
和&&
是shell运算符。它们用于组合两个命令的结果。因为它们是shell语法,所以它们具有特殊的语法意义,不能用作命令的参数|
不是特殊语法。它实际上是一个名为[
的命令,也称为[
。因为test
只是一个常规命令,它使用[
和-a
作为and和or运算符。它不能使用-o
和&
,因为这些是命令看不到的shell语法|
但是等等!Bash有一种更奇特的测试语法,它的形式是
[[]]
。如果使用双方括号,您可以访问正则表达式和通配符之类的内容。您还可以在括号内自由使用shell操作符,如&&
,|
,
,因为与[
,双括号形式是特殊的shell语法。Bash解析[[
本身,这样您就可以编写类似[[$foo==5&&$bar==6]
-a和-o是test命令的较旧和/或运算符。
&&和| |是外壳的和/或运算符。
所以(假设是一个旧外壳)在你的第一个案例中
[ "$1" = 'yes' ] && [ -r $2.txt ]
炮弹正在评估爆炸和情况。
在你的第二个案例中
[ "$1" = 'yes' -a $2 -lt 3 ]
test命令(或内置测试)正在评估和条件
当然,在所有现代或半现代shell中,test命令内置于shell中,因此实际上没有任何或多大区别。在现代shell中,可以编写if语句:
[[ $1 == yes && -r $2.txt ]]
它更类似于现代编程语言,因此更具可读性。我想知道什么时候你会选择使用&&和| |作为条件,而不是-a和-o。因此,如果你只是使用[[form?使用[[$foo==5&&$bar==6]]与[$foo==5-a$bar==6]相比,使用[$foo==5-a$bar==6]有什么好处吗是的,
-o
和-a
标志似乎在标准中被弃用。它们可能会继续工作很长一段时间,但为将来做好准备是很好的。建议的与POSIX兼容的-a
替代品是两个单独的调用测试&
:[expr1-a&&expr2]
变为[expr1]&&&[expr2]
。类似地,对于-o
和|
,这是否意味着单括号[form]已被弃用,取而代之的是[[form]表单[[表单更易于使用——它处理许多引用问题。例如,在本例中,$1
可以不被引用,即使它可能是空的。这取决于您是否需要支持旧的shell。所有现代操作系统都有bash(在/bin(linux)、/usr/bin/或其他地方)或/usr/bin/ksh支持[[form.@BradLanam即使是现代嵌入式系统也通常没有bash或ksh。