разделение аргументов bash-скрипта на «=»

#bash #parameters #sed

#bash #параметры #sed

Вопрос:

У меня есть скрипт bash, в котором вы можете указать параметры с помощью «—option parameter»:

 if [ ${1:0:2} != '--' ] ; then 
    echo -e "Unrecognized option: $1n$requestHelpMessage"; exit 1;
fi
if [ ! $2 ];
    then echo -e "Expected parameter for $1n$requestHelpMessage"; exit 1;
fi
case ${1:2} in
    branch) # do something with $2 here
    batch) # do something with $2 here
    version) # do something with $2 here
    *) # you get the idea
esac
  

И я хочу расширить его, чтобы иметь возможность обрабатывать также «—option= parameter». Есть ли простой способ разделить на «=» без специального обозначения каждого из них?

Комментарии:

1. Просто комментарий, потому что он может быть вам не полезен, но синтаксический анализ аргументов — это боль и изобилует крайними случаями. Лучше просто использовать встроенные в bash getopts.

2. У меня сложилось впечатление, что getopts не так хорош в словах, и мне это нужно, чтобы воспроизвести определенное поведение другого скрипта, поэтому у меня нет свободы использовать буквы

3. Это абсолютно верно. getopts на самом деле не работает для флагов с несколькими символами. Ознакомьтесь с моим ответом ниже об использовании getopt вместо этого.

Ответ №1:

Вместо использования getopt или создания собственной настройки попробуйте использовать «getopt«. Он поддерживает как длинные (слово), так и короткие (символьные) аргументы.

Вот пример его использования:

 get_inputs () {
    set -- $( getopt -u -l class:,desc:,force,host:,help,verbose "c:d:fh:v?" "$@" )

    while [ $# -gt 0 ]; do 
        case "$1" in
            -c|--class)
                CLASS=$2
                shift
                ;;
            -d|--desc)  
                DESCR=$2
                shift
                ;;
            -f|--force)
                FORCE=1
                ;;
            -h|--host)
                HOST=$2
                shift
                ;;
            -v|--verbose)
                VERBOSE=1
                ;;
            --help)
                usage
                exit
                ;;
            *)
                break
                ;;
        esac
        shift
    done
}
  

Комментарии:

1. Конечно, вы должны использовать "$@" при вызове getopt as, иначе пробелы внутри аргументов будут уничтожены.

2. 1, но while [ $# -gt 0 ] не является необходимым — $1 всегда будет содержать -- после параметров, которые в конце попадут во всеобщее обозрение. Вы можете использовать while true так же хорошо.

Ответ №2:

С небольшими изменениями вы можете добиться желаемого:

 if [[ ! $1 =~ "^--?" ]] ; then 
    echo -e "Unrecognized option: $1n$requestHelpMessage"; exit 1;

...

case $1 in
    -*branch) # do something with $2 here
    -*batch) # do something with $2 here
    -*version) # do something with $2 here
    *) # you get the idea
esac
  

Тесты допускают один или несколько - «s в начале $1