2014-10-04 34 views
0

时出现奇怪行为我正在阅读Linux文档项目中的this bash指南。 第81页和82有一个用于测试的短示例脚本选项是否设置:检查shell选项是否设置为[-o OPTION],当OPTION为

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

我没有看到那个-o做你期望的'man test | grep -A1“\ -o”'。 – 2014-10-04 21:52:26

回答

4

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

你与[看到的结果是因为有两个-o运营商在bash的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 ])。结果是正确的。

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

+0

+1。 '! [-o选项]'也是可能的,如果你有一个不理解'[['。 – rici 2014-10-05 05:49:51

+0

@rici'-o'对于选项本身是bash特有的,所以这不太可能。 – 2014-10-05 06:52:25

+0

好点。知道这一点仍然有用!不只是内部括号。 – rici 2014-10-05 06:57:47

相关问题