否定 Bash 中的多个条件

Negating multiple conditions in Bash

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

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

当我 运行 它没有参数时,我得到以下输出:

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

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

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

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

if ! ([ -z "" ] || [ -z "" ]);

{ } 分组语法:

if ! { [ -z "" ] || [ -z "" ]; };

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

if ! [ -z "" -o -z "" ]

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

#!/bin/sh 

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

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

否定

" -n string 如果字符串的长度不为零则为真。"

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

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

#!/bin/bash 

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

在评论中提到 none 这些示例显示了如何在 shell 中否定多个测试,这是一个示例:

#!/bin/sh 

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

记住(或学习!)[ 不是 shell 语法的一部分,它是一个命令。

如果你想将多个命令组合在一起,那么你应该使用{ }

if ! { [ -z "" ] || [ -z "" ]; }

请注意,解析器希望在结束前看到行尾或分号 }

郑重声明,我会避免否定并在此处使用 &&

if [ -n "" ] && [ -n "" ]

...并且由于您指定了 ,您不妨利用增强的测试结构:

if [[ -n  && -n  ]]