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

使用or运算符简化bash if语句,bash,scripting,Bash,Scripting,我想将“isAny”函数简化为: isCat() [[ $word = "cat" ]] isDog() [[ $word = "dog" ]] isFish() [[ $word = "fish" ]] isAny() { if isCat || isDog || isFish; then return 0; else return 1; fi } 但我不知道该怎么做。上述尝试不正确,因为当所有其他函数的计算结果为false时,“isAny”为true。我以这种方式使用这些函数: is

我想将“isAny”函数简化为:

isCat()  [[ $word = "cat" ]]
isDog()  [[ $word = "dog" ]]
isFish() [[ $word = "fish" ]]
isAny()  { if isCat || isDog || isFish; then return 0; else return 1; fi }
但我不知道该怎么做。上述尝试不正确,因为当所有其他函数的计算结果为false时,“isAny”为true。我以这种方式使用这些函数:

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

shell函数将返回上次运行的命令的退出状态。因此

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

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

if isCat; then
  echo "cat"
fi
if isAny; then
  echo "any"
fi
会成功的。

原因

IS_ANY() { IS_CAT || IS_DOG || IS_FISH; }
…始终为true,即使函数都返回false,这是因为它检查
“isCat”
“isDog”
“isFish”
是否为非空字符串,而不是将它们作为函数运行


如果您确实试图与几个固定令牌进行比较,则使用
case
语句是实现这一点的常规(且符合POSIX)方法:

isAny() [[ isCat || isDog || isFish ]]
也就是说,如果这是一个非文字的例子:

case $word in
  cat|dog|fish) return 0;;
  *) return 1;;
esac
…是编写函数的最简单方法。因为它不在
[[]]
中,它实际上是在运行shell命令(您定义的函数),而不是将内容解释为扩展的-
test
语法

IS_ANY() { IS_CAT || IS_DOG || IS_FISH; }
…始终为true,即使函数都返回false,这是因为它检查
“isCat”
“isDog”
“isFish”
是否为非空字符串,而不是将它们作为函数运行


如果您确实试图与几个固定令牌进行比较,则使用
case
语句是实现这一点的常规(且符合POSIX)方法:

isAny() [[ isCat || isDog || isFish ]]
也就是说,如果这是一个非文字的例子:

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

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

从风格角度看,所有caps函数名都极不寻常。函数定义命令,并且命令在UNIX上通常不都是大写的。
[[IS|CAT|IS|DOG|IS|FISH]
,顺便说一句,它完全等同于
[-n IS|CAT|n IS|DOG|n IS|FISH]
,或者
[-n“IS|CAT”][-n“IS|DOG”][-n“IS|u FISH”]:检查字符串是否为空(或者字符串“IS_DOG”为非空,或者字符串“IS_FISH”为非空)--始终为真(因为
IS_CAT
根据定义是一个六个字符的字符串,因此决不是零字符/空字符串),与运行名为
的函数完全不同的是_CAT
。我使用所有大写字母,因为它使我的脚本更易于查看和阅读。我应该使用命名约定来解决这个问题……这对你来说是可读的,对那些内化了POSIX约定的人来说也是可读的。To那些已经内化了约定的人,all-caps符号意味着您引用的变量对shell或操作系统具有特殊意义——参见的第四段,引用了它们的命名约定,同时要记住,常规shell变量共享一个名称空间。all-caps函数名从一个名称空间来说是极不寻常的列表透视图。函数定义命令,并且命令在UNIX上通常不都是大写的。
[[IS|CAT|isu DOG|isu FISH]
,顺便说一句,它完全等同于
[-n IS|CAT|-n IS|DOG|isu FISH]
,或者
[-n“IS|CAT”].[-n“IS|DOG”][-n”IS| isu FISH”]:它检查字符串是否正确“IS_CAT”是非空的(或者字符串“IS_DOG”是非空的,或者字符串“IS_FISH”是非空的)——始终为真(因为
IS_CAT
根据定义是六个字符的字符串,因此决不是零字符/空字符串),与运行名为
的函数完全不同的是_CAT
。我使用所有大写字母,因为它使我的脚本更易于查看和阅读。我应该使用命名约定来解决这个问题……这对你来说是可读的,对那些内化了POSIX约定的人来说也是可读的。To那些已经内化了约定的人,all caps符号意味着您引用的变量对shell或操作系统具有特殊意义——请参阅的第四段,引用了他们的命名约定,同时请记住,常规shell变量共享一个名称空间。