Я создаю скрипт bash, который включает в себя аргументы анализа. Использование было бы:Разбор флага со списком значений
$ ./my_script.sh -a ARG_1 -b ARG_2 [-c LIST_OF_ARGS...]
Использование getopts
Я могу разобрать -a
и -b
и получить соответствующие им значения ARG_1
и ARG_2
. Если и только если пользователь помещает -c
в качестве последнего аргумента, тогда я также могу получить -c
и создать список со всеми значениями в LIST_OF_ARGS...
.
Но я бы не хотел, чтобы пользователь вставлял -c
в качестве последнего флага. Например, было бы здорово, если сценарий может быть вызван следующим образом:
$ ./my_script.sh -b ARG_2 -c V1 V2 V3 -a ARG_1
Вот мой текущий код:
while getopts a:b:c opt
do
case $opt in
a)
A_FLAG=$OPTARG
;;
b)
B_FLAG=$OPTARG
;;
c)
# Handle values as regular expressions
args=("[email protected]")
C_LIST=()
for ((i=$OPTIND-1 ; i <= $#-1 ; i++))
do
C_LIST=("${C_LIST[@]}" ${args[$i]})
done
;;
?)
usage
;;
esac
done
'getopts' не поддерживает опции с несколькими аргументами. Вам необходимо проанализировать аргументы вручную, подсчитать аргументы, которые следуют за '-c' в качестве аргументов для этой опции, до тех пор, пока вы не достигнете другого определенного параметра или конца списка. – chepner
В вашем существующем коде вам было бы лучше написать более простое выражение: 'c) C_LIST = (" $ OPTARG "" $ {@: $ OPTIND} ") ;;' Это будет правильно обрабатывать регистр '-cV1 V2 V3 'и это также намного короче. (Также научитесь использовать '+ =' на массивах.) Это не отвечает на ваш вопрос. – rici