* и -* в структуре case в bash

* и -* в структуре case в bash
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командазамененыисходные параметры с выходными данными изgetoptпрограмма, которая в целом выглядит как -- "g".

Этот дополнительный --параметр вставляетсяgetoptчтобы указать, что опции заканчиваются в этой точке, и начинаются неопциональные аргументы. Это и есть цельgetoptв любом случае – для сортировки и разделения различных видов аргументов командной строки.

Если добавить эту строку, то это станет очевидным:

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

Связанный контент