긴 옵션과 짧은 플래그를 모두 사용하는 bash 스크립트를 만들고 있습니다. 긴 옵션을 원하기 때문에 getopts
. 다음 코드를 사용해 보았습니다.
while test -n "$1"; do
case "$1" in
-o|--override) NO_CHANGE=yes;shift 1;;
-r|--reset) OV_RESET=yes;shift 1;;
-h|--help) hthemehelp;shift 1;;
*) break;;
esac
done
이것은 myscr -o -r
or 처럼 호출할 때 작동 myscr -h
하지만 myscr -or
프로그램을 실행하려고 하면 정상적인 동작이고 실행하면 myscr -or -h
에 도달하기 전에 루프가 종료됩니다 -h
. 정당한 원인 break
으로 교체 하고 정지합니다.continue
myscr -or
myscr -or -h
답변1
사이즈에 맞게 입어보세요:
#!/bin/bash
pleasereset=1
while test -n "$1"; do
pleaseshift=0
[[ pleasereset -eq 1 ]] && thisvar=$1 && pleasereset=0;
case "$thisvar" in
-o*|--override) echo "override!"; pleaseshift=1;;
-r*|--reset) echo "reset!"; pleaseshift=1;;
-h*|--help) echo "help!"; pleaseshift=1;;
*) break ;;
esac
if [[ "$pleaseshift" = "1" ]];
then
testvar=${thisvar##-}
if [[ ${#testvar} -gt 1 ]] && [[ ! ${thisvar} = --* ]];
then
thisvar=-$( echo "$testvar" | cut -c 2- )
else
shift 1; pleasereset=1;
fi
fi
done
특정 사례와 일치하지 않는 첫 번째 매개변수에서 매개변수 구문 분석이 중지되므로 ./foobar.sh -o --help -s -r
에서 를 처리하지 않습니다 -r
. 이는 *) break;;
오류 처리로 줄을 변경하여 조정할 수 있지만 pleaseshift=1
!
답변2
어쩌면 원하는 줄을 추가하는 것으로 충분할 수도 있습니다.
while test -n "$1"; do
case "$1" in
-or|-ro) OV_RESET=yes;NO_CHANGE=yes;shift 1;;
-o|--override) NO_CHANGE=yes;shift 1;;
-r|--reset) OV_RESET=yes;shift 1;;
-h|--help) hthemehelp;shift 1;;
*) break;;
esac
done
또는 더 복잡한 경우에는 해당 블록 외부에 있지만 여전히 while 내부에 있는 case
함수에 블록을 넣을 수 있습니다. 에 대한shift 1
두 배로options ( -or
, -oh
, 긴 옵션 중 하나가 아닌 경우 각 문자에 대해 동일한 함수를 반복적으로 호출할 수 있습니다 case *)
... 방금 긴 옵션으로 처리한 경우 플래그가 필요합니다 $1
. 그러나 이 경우 스크립트 tp를 노출합니다. 인쇄 오류로 인한 잘못된 동작(예: -overrider I will process
-o -v -e -r -d`...라고 쓰는 경우 )