为什么&&什么比bash更好?

时间:2018-01-31 16:09:06

标签: linux bash shell testing man

我已阅读man test并找到:

  

注意:二进制-a和-o本质上是不明确的。使用'测试EXPR1&&   测试EXPR2'或者'测试EXPR1 ||测试EXPR2'代替。

有人可以解释-a-o中含糊不清的内容吗?

英语不是我的母语。据我所知,Kevin Braunsdorf和Matthew Bradburn(本手册页的作者)建议我们使用&&而不是-a只是因为-a可以用作另一个二进制文件中的键,因为-a可能有不同的含义。

因此,当我们使用-a时,logical ANDtest无关。对某人不太清楚,所以人们会这样想:"嗯,那钥匙是什么?我不知道,不确定是logical AND,我必须访问man ..."

我能找到的唯一原因是&&的代码比使用-a的代码更容易为人们阅读(仅作为示例):

使用-a:

if [ -f "${my_var_with_filename}" -a -n "${my_another_array_var_with_filename[2]}" -o -r /just/path/to/file ]
then
...
fi

与&&:

相同
if [ -f "${my_var_with_filename}" ] && [ -n "${my_another_array_var_with_filename[2]}" ] || [ -r /just/path/to/file ]
then
...
fi

就我而言,这两个例子在语法上都很复杂,并且很难用多个条件,变量,数组变量和逻辑运算符来读取bash代码。

所以,我的问题是:

  1. 您是否同意-a中的-otest中的-a(-o)"固有的含糊不清"?

  2. 在多种情况下,您使用的是&&(||)还是-a

  3. 有人明确指出-o&&"含糊不清的&#34 ;?或者它只是作者'意见?他们是否应建议我们仅根据他们在手册页中的意见使用-a而不是{{1}}?

3 个答案:

答案 0 :(得分:3)

让我们坚持严格的POSIX,-a代表逻辑AND的扩展名。现在,考虑命令

test "$1" -a "$2"

您可能认为这会测试$1$2都是非空字符串。但你错了。如果$1 == "!",则您拥有命令

test ! -a "$2"

失败,因为-a不是受支持的一元运算符。

(这是根据POSIX规范本身给出的例子改编的。)

如果这实际上是bash,那就会变得更糟。 -a 是一个有效的一元运算符,所以现在您正在测试$2命名的文件是否存在。

答案 1 :(得分:2)

根据POSIXcreate table STATION( ID int NOT NULL PRIMARY KEY AUTO_INCREAMENT, CITY varchar(21), STATE varchar(2), LAT_N int, LONG_N int ); 是未指明的行为。更别说[ -f file1 -a -f file2 ] / -a构造更长。

-o

SYNOPSIS:

  test [expression]
  [ expression ]

OPERANDS:

... ...

In the following list, $1, $2, $3, and $4 represent the arguments
presented to test:

0 arguments:

    Exit false (1).

1 argument:

    Exit true (0) if $1 is not null; otherwise, exit false.

2 arguments:

      - If $1 is '!', exit true if $2 is null, false if $2 is not null.

      - If $1 is a unary primary, exit true if the unary test is true,
        false if the unary test is false.

      - Otherwise, produce unspecified results.

答案 2 :(得分:-1)

  1. 虽然test二进制文件具有-a和-o标志,但它并不常见。即使在测试命令本身-a is ambiguous内,它也可用于检查文件是否存在或表示二进制AND运算符。

  2. 使用&&和||用于二进制AND和二进制OR。它们更常见,并且正式化为C语言的标准。

  3. 请参阅我对您的第一个问题的回复。即使在test命令本身内,-a也可能含糊不清;使用&&和||代替。