检查是否使用[-O OPTION]设置了shell选项,当OPTION打开时出现奇怪的行为

时间:2014-10-04 21:36:17

标签: linux bash gnu

我正在阅读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

1 个答案:

答案 0 :(得分:4)

请改用[[ ! -o option ]]。解析[[ ]]中的表达式更具可预测性。

您使用[查看的结果是因为bash -o内置了两个test运算符:一元-o option来检查是否设置一个选项,并设置二进制test1 -o test2以检查测试是否为真(逻辑或)。

您正在传递test三个参数,!-ohistory。让我们看看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 ])。结果是正确的。

第二种解释是你所期望的,但是自第一种解释匹配以来它没有被使用。