![bash 的 case 结构中的 * 和 -*](https://linux22.com/image/1567376/bash%20%E7%9A%84%20case%20%E7%BB%93%E6%9E%84%E4%B8%AD%E7%9A%84%20*%20%E5%92%8C%20-*.png)
docase1(){
case "$1" in
-a )
echo "case a" ;;
-b )
echo "case b" ;;
-* )
echo "wrong input" ;;
esac
}
-*
我们可以得出可以匹配-+字符而不是字符的结论。
docase1 -g
wrong input
docase1 -gg
wrong input
docase1 g
docase1 gg
命令docase1 g
和docase1 gg
不会得到任何输出,这意味着 -* 既不能匹配 也不能g
匹配gg
。
docase2(){
OPTS=$(getopt -o ab -- "$@");
if [ $? != 0 ] ; then
echo "wrong" ;
fi;
eval set -- "$OPTS";
while true; do
case "$1" in
-a )
echo "case a" ;
shift ;;
-b )
echo "case b";
shift ;;
-* )
echo "wrong input";
break;;
esac
done
}
为什么-*
docase2 可以匹配字符?
docase2 g
wrong input
docase2 gg
wrong input
为什么同样的表达式-*
会产生不同的效果?
-*
在 docase1 中无法匹配,g
而在 docase2 中可以?gg
-*
答案1
但这并不是要求它匹配的内容。这个问题与它之前的case
所有事情都无关。getopt
set
即使你的案件块仍然检查相同的内容$1
,它不再只是从那里获取命令行参数。较早的set
命令被取代原始参数与输出获取选项程序,通常看起来像-- "g"
。
该额外--
参数插入于获取选项表示选项在此结束,非选项参数开始。这就是获取选项无论如何 – 对不同类型的命令行参数进行排序和分离。
如果你添加这一行,它就会变得很明显:
while true; do
+ echo "arg 1 is '$1'"
case "$1" in