我正在寻找一个“in”运算符,其工作原理如下:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
与使用多个“或”测试相比,这显然是一个简短得多的语句。
答案1
您可以使用case
...esac
$ cat in.sh
#!/bin/bash
case "$1" in
"cat"|"dog"|"mouse")
echo "dollar 1 is either a cat or a dog or a mouse"
;;
*)
echo "none of the above"
;;
esac
前任。
$ ./in.sh dog
dollar 1 is either a cat or a dog or a mouse
$ ./in.sh hamster
none of the above
通过ksh
,bash -O extglob
或zsh -o kshglob
,您还可以使用扩展的 glob 模式:
if [[ "$1" = @(cat|dog|mouse) ]]; then
echo "dollar 1 is either a cat or a dog or a mouse"
else
echo "none of the above"
fi
使用bash
, ksh93
or zsh
,您还可以使用正则表达式比较:
if [[ "$1" =~ ^(cat|dog|mouse)$ ]]; then
echo "dollar 1 is either a cat or a dog or a mouse"
else
echo "none of the above"
fi
答案2
bash 中没有“in”测试,但有正则表达式测试(bourne 中没有):
if [[ $1 =~ ^(cat|dog|mouse)$ ]]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
通常使用变量编写(引用问题较少):
regex='^(cat|dog|mouse)$'
if [[ $1 =~ $regex ]]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
对于较旧的 Bourne shell,您需要使用大小写匹配:
case $1 in
cat|dog|mouse) echo "dollar 1 is either a cat or a dog or a mouse";;
esac
答案3
case
如果您想要匹配一组固定的宠物,那么使用 a就很好。但如果您需要在运行时构建模式,它就不起作用,因为它case
不会解释扩展参数内的交替。
这将仅匹配文字字符串cat|dog|mouse
:
patt='cat|dog|mouse'
case $1 in
$patt) echo "$1 matches the case" ;;
esac
但是,您可以将变量与正则表达式匹配一起使用。只要变量没有被引用,其中的任何正则表达式运算符都有其特殊含义。
patt='cat|dog|mouse'
if [[ "$1" =~ ^($patt)$ ]]; then
echo "$1 matches the pattern"
fi
您还可以使用关联数组。检查某个键是否存在是in
Bash 提供的最接近运算符的事情。虽然语法有点难看:
declare -A arr
arr[cat]=1
arr[dog]=1
arr[mouse]=1
if [ "${arr[$1]+x}" ]; then
echo "$1 is in the array"
fi
答案4
grep
方法。
if echo $1 | grep -qE "^(cat|dog|mouse)$"; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
-q
以避免任何输出到屏幕(比键入更快>/dev/null
)。-E
对于扩展正则表达式(cat|dog|mouse)
方面需要这个。^(cat|dog|mouse)$
匹配^
以 cat、dog 或 mouse ( )开头 ((cat|dog|mouse)
) 且后跟行尾 ($
)的任何行