否定Bash中的多个条件

时间:2015-10-08 08:28:47

标签: bash negation

我意识到这是一个简单的问题,但由于bash中的finnicky语法要求,我发现很难得到答案。我有以下脚本:

if ! [ [ -z "$1" ] || [ -z "$2" ] ]; then
  echo "both arguments are set!"
fi

我在没有参数的情况下运行时得到以下输出:

./test: line 3: [: -z: binary operator expected 
both arguments are set!

我不期待任何输出 - 都没有设置参数。我做错了什么?

2 个答案:

答案 0 :(得分:5)

test shell内置[支持参数-a-o,它们分别是逻辑AND和OR。

#!/bin/sh 

if [ -n "$1" -a -n "$2" ]
then echo "both arguments are set!"
fi

在这里,我使用-n来检查字符串是否为非零长度而不是-z,这表明它们 的长度为零,因此必须使用!

“ - n string如果字符串的长度非零,则为True。”

“ - z string如果字符串的长度为零,则为真。”

如果您使用bash,它还支持更强大的测试类型[[]],它可以使用布尔运算符||&&

#!/bin/bash 

if [[ -n "$1" && -n "$2" ]]
then echo "both arguments are set!"
fi

在评论中已经解决了这些样本都没有显示如何否定shell中的多个测试,这是一个例子:

#!/bin/sh 

if [ ! -z "$1" -a ! -z "$2" ]
then echo "both arguments are set!"
fi

答案 1 :(得分:4)

方括号不是bash中的分组构造。 [只是test命令的别名,参数正常解析。 ||是一个分隔命令的shell运算符。

如果要对多个命令进行分组,可以使用()子shell语法。

if ! ([ -z "$1" ] || [ -z "$2" ]);

{ }分组语法:

if ! { [ -z "$1" ] || [ -z "$2" ]; };

或者您可以使用内置test运算符对-o进行一次调用:

if ! [ -z "$1" -o -z "$2" ]