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 и gg , -* в docase2 могут?

1 ответ1

2

Но это не то, что он просит, чтобы соответствовать. Проблема не имеет ничего общего с case и все с getopt и set перед ним.

Даже если ваш блок case все еще проверяет тот же $1 , он больше не получает от вас только параметр командной строки. Ранее set команда заменила исходные параметры выводом из программы getopt , которая обычно выглядит как -- "g" .

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .