否定 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 "" ]
...并且由于您指定了 bash,您不妨利用增强的测试结构:
if [[ -n && -n ]]
我知道这是一个简单的问题,但由于 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 "" ]
...并且由于您指定了 bash,您不妨利用增强的测试结构:
if [[ -n && -n ]]