Парсинг аргумента сценария оболочки

Существует много вопросов об этом виде вещи, но позволяет, предполагают, что мы нацелены на универсальную систему Linux и с getopt и с установленным getopts (не, что мы будем использовать также, но они кажутся популярными),

Как я анализирую обоих долго (-пример | - простую опцию в качестве примера) и короткий argruments (-e | - esimple-пример |-e простой пример)

18
задан Peter Coulton 15 April 2010 в 04:22
поделиться

1 ответ

Вы хотите использовать ] getopt с длинными и короткими параметрами. Пример из рабочего кода:

# Parse arguments
TEMP=$(getopt -n $PROGRAM_NAME -o p:P:cCkhnvVS \
--long domain-password:,pop3-password:\         
,create,cron,kill,help,no-sync-passwords,version,verbose,skip-pop3 \
-- "$@")                                                            

# Die if they fat finger arguments, this program will be run as root
[ $? = 0 ] || die "Error parsing arguments. Try $PROGRAM_NAME --help"       

eval set -- "$TEMP"
while true; do     
        case $1 in 
                -c|--create)
                        MODE="CREATE"; shift; continue
                ;;                                    
                -C|--cron)                            
                        MODE="CRON"; shift; continue  
                ;;                                    
                -k|--kill)                            
                        MODE="KILL"; shift; continue  
                ;;                                    
                -h|--help)                            
                        usage                         
                        exit 0                        
                ;;                                    
                -n|--no-sync-passwords)               
                        SYNC_VHOST=0; shift; continue 
                ;;                                    
                -p|--domain-password)                 
                        DOMAIN_PASS="$2"; shift; shift; continue
                ;;                                              
                -P|--pop3-password)                             
                        POP3_PASS="$2"; shift; shift; continue  
                ;;                                              
                -v|--version)                                   
                        printf "%s, version %s\n" "$PROGRAM_NAME" "$PROGRAM_VERSION"
                        exit 0                                                      
                ;;                                                                  
                -v|--verbose)                                                       
                        VERBOSE=1; shift; continue                                  
                ;;                                                                  
                -S|--skip-pop3)                                                     
                        SKIP_POP=1; shift; continue                                 
                ;;                                                                  
                --)                                                                 
                        # no more arguments to parse                                
                        break                                                       
                ;;                                                                  
                *)                                                                  
                        printf "Unknown option %s\n" "$1"                           
                        exit 1                                                      
                ;;                                                                  
        esac                                                                        
done     

Обратите внимание, die - это функция, которая была определена ранее (не показана).

-n Параметр указывает getopt сообщать об ошибках как имя моей программы, а не как getopt . -o определяет список коротких параметров (: после option указывает на необходимый аргумент), а - long указывает список длинных опций (соответствующих в порядке коротких опций).

Остальное - просто простой переключатель, вызывающий shift соответствующим образом, чтобы переместить указатель аргумента. Обратите внимание, что вызов shift; shift; - это просто упорная привычка. В современном мире shift 2 наверное, хватит.

Современный getopt довольно согласован с новыми платформами, однако вы можете столкнуться с некоторыми проблемами переносимости на старых (примерно до Redhat 9) системах. См. man getopt для получения информации об обратной совместимости. Однако вряд ли вам это понадобится.

Наконец, после синтаксического анализа параметров, вы можете снова вызвать:

eval set -- "$@"

Это переместит указатель аргумента на все остальное, что осталось в командной строке после того, как getopt завершил синтаксический анализ параметров. Затем вы можете просто сдвинуть , чтобы продолжить их чтение.Например, если команда выглядела так:

./foo --option bar file1.txt file2.txt file3.txt

Не забудьте сделать удобную опцию -h / --help , чтобы напечатать ваши новые причудливые опции, когда вы закончите. :) Если вы сделаете этот вывод help2man дружелюбным, у вас будет мгновенная страница руководства для вашего нового инструмента.

Изменить

В большинстве дистрибутивов вы можете найти дополнительный пример кода getopt в / usr / share / doc / util-linux / examples , который должен был быть установлен дефолт.

33
ответ дан 30 November 2019 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: