我正在寻找一个像这样工作的“in”运算符:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
与使用多个“或”测试相比,这显然是一个更短的语句。
我正在寻找一个像这样工作的“in”运算符:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
与使用多个“或”测试相比,这显然是一个更短的语句。
你可以使用
case
...esac
前任。
使用或
ksh
,您还可以使用扩展的 glob 模式:bash -O extglob
zsh -o kshglob
使用
bash
,ksh93
orzsh
,您还可以使用正则表达式比较:bash 中没有“in”测试,但有 regex 测试(不在 bourne 中):
通常使用变量编写(引用问题较少):
对于较旧的 Bourne shell,您需要使用大小写匹配:
如果您有一组要匹配的固定宠物,则使用 a
case
很好。但是,如果您需要在运行时构建模式,它将无法工作,因为case
它不会解释扩展参数中的交替。这将仅匹配文字字符串
cat|dog|mouse
:但是,您可以使用与正则表达式匹配的变量。只要不引用变量,其中的任何正则表达式运算符都有其特殊含义。
您还可以使用关联数组。
in
检查密钥是否存在于Bash 提供的运算符中是最接近的。虽然语法有点难看:(
${arr[$1]+x}
扩展为x
如果arr[$1]
已设置,否则为空。)您可以在测试中使用
case
语句if
,但代码看起来有点麻烦:或稍短,
这是使用一个
case
子句来为该if
子句进行模式匹配。它引入了不必要的真/假测试。最好只使用
case
:不要这样做:
或这个:
...因为您只是添加了更多危险的东西,只是为了能够
if
在代码中使用语句来代替完全合理的case
语句。grep
方法。-q
避免任何输出到屏幕(比 输入更快>/dev/null
)。-E
对于扩展的正则表达式(cat|dog|mouse)
方面需要这个。^(cat|dog|mouse)$
匹配任何以 ( ) 开头的^
带有 cat、dog 或 mouse ((cat|dog|mouse)
) 的行,然后是行尾 ($
)