Оболочка с порядком ввода параметров является проблемой

     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 

Это работает!

Вы можете объяснить, почему?

-3
18.02.2016, 21:00
2 ответа

Вы безоговорочно вызываете 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.

3
28.01.2020, 05:18

Потому что ваш цикл while-loop безусловно сдвигается дважды, даже если опция не принимает аргумента. Упорядочение второй командной строки - это просто везение.

1
28.01.2020, 05:18

Теги

Похожие вопросы