#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