Мне нужно написать bash script, и он хотел бы разобрать неупорядоченные параметры в формате:
scriptname --param1 <string> --param2 <string> --param3 <date>
Есть ли простой способ сделать это, или я довольно сильно застрял в $1, $2, $3?
Мне нужно написать bash script, и он хотел бы разобрать неупорядоченные параметры в формате:
scriptname --param1 <string> --param2 <string> --param3 <date>
Есть ли простой способ сделать это, или я довольно сильно застрял в $1, $2, $3?
Вы хотите getopts.
while [[ $1 = -* ]]; do
arg=$1; shift # shift the found arg away.
case $arg in
--foo)
do_foo "$1"
shift # foo takes an arg, needs an extra shift
;;
--bar)
do_bar # bar takes no arg, doesn't need an extra shift
;;
esac
done
Хорошим примером того, как реализовать короткие и длинные переключатели бок о бок, является mcurl:
Bash имеет функцию getops, как упоминалось ранее, что может решить ваши проблемы.
Если вам нужно что-то более сложное, bash также поддерживает позиционные параметры (упорядоченные $1... $9, а затем ${10}.... ${n}), вам придется придумать собственную логику для обработки этого ввода. Один простой способ - поставить переключатель/регистр внутри цикла for, итерации по параметрам. Вы можете использовать либо один из двух специальных bash варов, которые обрабатывают ввод: $* или [email protected].
#!/bin/bash
# Parse the command-line arguments
while [ "$#" -gt "0" ]; do
case "$1" in
-p1|--param1)
PARAM1="$2"
shift 2
;;
-p2|--param2)
PARAM2="$2"
shift 2
;;
-p3|--param3)
PARAM3="$2"
shift 2
;;
-*|--*)
# Unknown option found
echo "Unknown option $1."
exit 1
;;
*)
CMD="$1"
break
;;
esac
done
echo "param1: $PARAM1, param2: $PARAM2, param3: $PARAM3, cmd: $CMD"
Когда я выполняю это:
./<my-script> --param2 my-param-2 --param1 myparam1 --param3 param-3 my-command
выводит то, что вы ожидаете:
param1: myparam1, param2: my-param-2, param3: param-3, cmd: my-command