我已阅读man test
并找到:
注意:二进制-a和-o本质上是不明确的。使用'测试EXPR1&& 测试EXPR2'或者'测试EXPR1 ||测试EXPR2'代替。
有人可以解释-a
和-o
中含糊不清的内容吗?
英语不是我的母语。据我所知,Kevin Braunsdorf和Matthew Bradburn(本手册页的作者)建议我们使用&&
而不是-a
只是因为-a
可以用作另一个二进制文件中的键,因为-a
可能有不同的含义。
因此,当我们使用-a
时,logical AND
与test
无关。对某人不太清楚,所以人们会这样想:"嗯,那钥匙是什么?我不知道,不确定是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代码。
所以,我的问题是:
您是否同意-a
中的-o
和test
中的-a(-o)
"固有的含糊不清"?
在多种情况下,您使用的是&&(||)
还是-a
?
有人明确指出-o
和&&
"含糊不清的&#34 ;?或者它只是作者'意见?他们是否应建议我们仅根据他们在手册页中的意见使用-a
而不是{{1}}?
答案 0 :(得分:3)
让我们坚持严格的POSIX,-a
代表逻辑AND的扩展名。现在,考虑命令
test "$1" -a "$2"
您可能认为这会测试$1
和$2
都是非空字符串。但你错了。如果$1 == "!"
,则您拥有命令
test ! -a "$2"
失败,因为-a
不是受支持的一元运算符。
(这是根据POSIX规范本身给出的例子改编的。)
如果这实际上是bash
,那就会变得更糟。 -a
是一个有效的一元运算符,所以现在您正在测试$2
命名的文件不是否存在。
答案 1 :(得分:2)
根据POSIX,create 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)
虽然test
二进制文件具有-a和-o标志,但它并不常见。即使在测试命令本身-a is ambiguous内,它也可用于检查文件是否存在或表示二进制AND运算符。
使用&&和||用于二进制AND和二进制OR。它们更常见,并且正式化为C语言的标准。
请参阅我对您的第一个问题的回复。即使在test
命令本身内,-a也可能含糊不清;使用&&和||代替。