bash 的 case 结构中的 * 和 -*

bash 的 case 结构中的 * 和 -*
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 gdocase1 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所有事情都无关。getoptset

即使你的案件块仍然检查相同的内容$1,它不再只是从那里获取命令行参数。较早的set命令被取代原始参数与输出获取选项程序,通常看起来像-- "g"

该额外--参数插入于获取选项表示选项在此结束,非选项参数开始。这就是获取选项无论如何 – 对不同类型的命令行参数进行排序和分离。

如果你添加这一行,它就会变得很明显:

 while true; do
+    echo "arg 1 is '$1'"
     case "$1" in

相关内容