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 루프는 무조건 두 번 이동하기 때문입니다. 두 번째 명령줄의 순서는 행운이었습니다.