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
    -o
    作为and和or运算符。它不能使用
    &
    |
    ,因为这些是命令看不到的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。