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
这有效!
你能解释一下为什么吗?
答案1
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
您可能还会发现获取选择对于解析 bash 中的选项很有用。
答案2
因为您的 while 循环无条件移位两次,即使选项不带参数也是如此。第二个命令行的顺序只是运气好。