
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
correr
script.sh -c --val1 123456
No funciona !
script.sh --val1 123456 -c
Esto funciona !
Puedes explicar porque ?
Respuesta1
Estás llamando incondicionalmente shift
dos veces por iteración. Esto es deseable para los --valN
casos, pero no para las opciones que no requieren un argumento siguiente. Podrías tomar el caso general y anidarlo dentro de él para reducir la duplicación:
case "$opt" in
"-c" | "--create") create_flag=1 ;;
"--val?" )
case "$opt" in
"--val1" ) callerId="$1" ;;
esac
shift
;;
esac
o espolvorear shift
en todas las opciones que toman un argumento como:
case "$opt" in
"-c" | "--create") create_flag=1 ;;
"--val1" ) callerId="$1" ; shift ;;
esac
También puedes encontrargetoptsútil para analizar opciones en bash.
Respuesta2
Porque su ciclo while cambia incondicionalmente dos veces, incluso cuando la opción no acepta un argumento. El orden de la segunda línea de comando es simplemente tener suerte.