使用或运算符简化bash if语句

时间:2016-09-15 15:09:33

标签: bash scripting

isCat()  [[ $word = "cat" ]]
isDog()  [[ $word = "dog" ]]
isFish() [[ $word = "fish" ]]
isAny()  { if isCat || isDog || isFish; then return 0; else return 1; fi }

我想简化' isAny'功能如下:

isAny() [[ isCat || isDog || isFish ]]

但我还没知道怎么做。上述尝试不正确,因为' isAny'当所有其他函数计算为false时为true。我以这种方式使用这些功能:

if isCat; then
  echo "cat"
fi
if isAny; then
  echo "any"
fi

2 个答案:

答案 0 :(得分:3)

原因

isAny() [[ isCat || isDog || isFish ]]

...始终为true,即使函数都返回false,也就是检查"isCat""isDog""isFish"是非空字符串 - 是当然,他们总是 - 而不是将它们作为功能运行。

如果你真的试图与几个固定令牌进行比较,case语句是传统的(和POSIX兼容的)方式:

case $word in
  cat|dog|fish) return 0;;
  *) return 1;;
esac

那就是说,如果这是一个非文字的例子:

isAny() { isCat || isDog || isFish; }

...是编写函数的最简单方法。因为它不在[[ ]]中,所以它实际上运行shell命令(您定义的函数),而不是将内容解释为扩展 - test语法。

答案 1 :(得分:2)

shell函数将返回它运行的最后一个命令的退出状态。因此...

IS_ANY() { IS_CAT || IS_DOG || IS_FISH; }

会做到这一点。