我意识到这是一个简单的问题,但由于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!
我不期待任何输出 - 都没有设置参数。我做错了什么?
答案 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" ]