我需要这样做:
if [ $X != "dogs" and "birds" and "dogs" ]
then
echo "it's is a monkey"
fi
使用bash脚本。怎么办?
答案 0 :(得分:2)
您需要将每个选项转换为单独的条件表达式,然后将它们与&&
(AND)运算符连接在一起。
if [[ $X != dogs && $X != birds && $X != cats ]]; then
echo "'$X' is not dogs or birds or cats. It must be monkeys."
fi
您也可以使用单个[
... ]
执行此操作,但是您必须为每个比较使用单独的集合,并将&运算符移到它们之外:
if [ "$X" != dogs ] && [ "$X" != birds ] && [ "$X" != cats ]; then
...
fi
请注意,您不需要像dogs
那样围绕单字符串使用双引号,但在单括号版本中您需要围绕参数扩展(变量),例如$X
,因为参数值中的空格将导致语法错误,不带引号。
此外,不需要在shell脚本中使用大写变量名,如X
;最好保留给来自环境的变量,例如$PATH
和$TERM
等等。
OR的shell运算符版本为||
,其工作方式相同。
答案 1 :(得分:2)
你甚至可以认为不同......
if ! [[ $X == dogs || $X == birds || $X == cats ]]; then
echo "'$X' is not dogs or birds or cats... It could be monkeys."
fi
正如思考:
它不是狗而不是猫而不是鸟
与思考
不完全相同它不是..狗或猫或鸟。
这使得case
的方法更加明显;
我认为,在这种情况下,正确的做法是:
case $X in
dogs )
# There may be some part of code
;;
birds )
# There may be some other part
;;
cats )
# There is no need to be something at all...
;;
* )
echo "'$X' is not dogs or birds or cats... It could be monkeys."
;;
esac
或者如果真的不需要处理鸟类,猫或狗的情况:
case $X in
dogs|birds|cats ) ;;
* )
echo "'$X' is not dogs or birds or cats... It could be monkeys."
;;
esac
答案 2 :(得分:1)
我可以在Bash中想到避免多次放入$ X的唯一方法是使用RegEx:
if [[ ! "$X" =~ (dogs|birds|cats) ]]; then
echo "it's is a monkey"
fi
同样,简写:
[[ ! "$X" =~ (dogs|birds|cats) ]] && echo "it's is a monkey"
当你有很长的变量和/或很短的比较时,这很有用。
请记住逃避特殊字符。
答案 3 :(得分:0)
X=$1;
if [ "$X" != "dogs" -a "$X" != "birds" -a "$X" != "dogs" ]
then
echo "it's is a monkey"
fi
最接近你已经拥有的