Bash

帶有參數輸入順序的外殼是問題

  • February 18, 2016
    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 

這行得通!

你能解釋一下為什麼嗎?

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 中的選項很有用。

引用自:https://unix.stackexchange.com/questions/264152