Bash
帶有參數輸入順序的外殼是問題
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 中的選項很有用。