我正在阅读Linux文档项目中的this bash指南。 在第81和82页上,有一个简短的示例脚本,用于测试是否设置了选项:
if [ -o noclobber ]
then
echo "Your files are protected against accidental overwriting using redirection."
fi
在尝试否定测试时,我遇到了一些奇怪的行为。对于[ -o OPTION ]
和[ ! -o OPTION ]
启用的所有选项,我的返回值为0。这是一个例子:
$ set -o | grep errex
errexit off
$ [ -o errexit ]; echo $?
1
$ [ ! -o errexit ]; echo $?
0
$ set -o | grep history
history on
$ [ -o history ]; echo $?
0
$ [ ! -o history ]; echo $?
0
答案 0 :(得分:4)
请改用[[ ! -o option ]]
。解析[[ ]]
中的表达式更具可预测性。
您使用[
查看的结果是因为bash -o
内置了两个test
运算符:一元-o option
来检查是否设置一个选项,并设置二进制test1 -o test2
以检查测试是否为真(逻辑或)。
您正在传递test
三个参数,!
,-o
和history
。让我们看看POSIX says about it如何解析三个参数:
3 arguments:
- If $2 is a binary primary, perform the binary test of $1 and $3.
- If $1 is '!', negate the two-argument test of $2 and $3.
(...)
-o
,确实是一个二元运算符,所以它执行$1
和$3
的测试,它变为"非空"检查(例如[ ! ]
和[ history ]
)。结果是正确的。
第二种解释是你所期望的,但是自第一种解释匹配以来它没有被使用。