我在shell脚本中理解test
命令时遇到了一些麻烦。
从这段代码中可以看出:
if [ ! "$n_trig" -a "$i_trig" ]
then
usage
echo "Required options -n and -i are not present"
exit 1
fi
我希望if语句中的命令列表可以执行,因为n_trip
和i_trig
都设置为false。但是它不会执行。如果我删除它!
。我不明白为什么。
以下是sh -x ./script
的输出:
+ n_trig=false
+ i_trig=false
+ p_trig=false
+ getopts n:i:p: opt
+ '[' '!' false -a false ']'
答案 0 :(得分:2)
!
运算符仅应用于子表达式"$n_trig"
,而不应用于整个表达式。您可以在测试之外使用它,作为if
命令的一部分:
if ! [ "$n_trig" -a "$i_trig" ]
或者您可以在test
命令中使用括号:
if [ ! \( "$n_trig" -a "$i_trig" \) ]
此外,test "$var"
只测试变量是否为空,它不会将值false
视为false。如果变量可以包含true
或false
,则应执行以下操作:
if ! [ "$n_trig" != true -a "$i_trig" != true ]
答案 1 :(得分:1)
看看这个:How to declare and use boolean variables in shell script?
shell脚本中的布尔值并不是非常可靠,因为不同的shell之间存在很多差异。
那说你的测试不正确,因为!仅适用于第一个值
#!/bin/bash
if [ true != "$n_trig" ] && [ true != "$i_trig" ]
then
usage
echo "Required options -n and -i are not present"
exit 1
fi