Shell con el orden de entrada de los parámetros es el problema

Shell con el orden de entrada de los parámetros es el problema
     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 shiftdos veces por iteración. Esto es deseable para los --valNcasos, 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 shiften 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.

información relacionada