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
答案 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; }
会做到这一点。