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
即使你的案件block 仍然檢查相同的內容$1
,它不再只是從那裡獲取命令列參數。之前的set
命令被取代原始參數與輸出獲取選擇程序,通常看起來像-- "g"
.
此額外--
參數是透過插入的獲取選擇指示選項在此停止,非選項參數開始。這就是整個目的獲取選擇無論如何 - 對不同類型的命令列參數進行排序和分離。
如果添加這一行,它應該變得顯而易見:
while true; do
+ echo "arg 1 is '$1'"
case "$1" in