
while (("$#"))
do
opt="$1";
shift;
case "$opt" in
"-c" | "--create") create_flag=1 ;;
"-up" | "--update") update_flag=1 ;;
"-q" | "--query") query_flag=1 ;;
"-csr"| "--createabc") createsr_flag=1 ;;
"-g" | "--getconf") getconfig_flag=1 ;;
"-catt" | "--createandattach") createattach_flag=1 ;;
"-att" | "--attach") attach_flag=1 ;;
"--val1" ) callerId="$1" ;;
"--val2" ) title="$1" ;;
"--val3" ) urgency="$1" ;;
"--val4" ) environment="$1" ;;
"--val5" ) failType="$1" ;;
"--val6" ) jobName="$1" ;;
"--val7" ) jobType="$1" ;;
# usage();;
# "*" )
# OPTIONAL="${opt#*=}";; #take argument
# *) echo >&2 "Invalid option: $@"; exit 1;;
esac
shift
done
бег
script.sh -c --val1 123456
не работает !
script.sh --val1 123456 -c
Это работает !
Можете ли вы объяснить почему?
решение1
Вы безусловно вызываете shift
дважды за итерацию. Это желательно для случаев --valN
, но не для вариантов, которые не принимают следующий аргумент. Вы можете взять общий случай и вложить его в него, чтобы уменьшить дублирование:
case "$opt" in
"-c" | "--create") create_flag=1 ;;
"--val?" )
case "$opt" in
"--val1" ) callerId="$1" ;;
esac
shift
;;
esac
или рассыпать shift
по всем вариантам, которые принимают аргумент вроде:
case "$opt" in
"-c" | "--create") create_flag=1 ;;
"--val1" ) callerId="$1" ; shift ;;
esac
Вы также можете найтиgetoptsполезно для анализа параметров в bash.
решение2
Потому что ваш цикл while безусловно сдвигается дважды, даже когда опция не принимает аргумент. Порядок второй командной строки — это просто удача.