옵션이 인식되지 않거나 예상되는 옵션 인수가 발견되지 않을 때 exit
스크립트의 나머지 부분을 건너뛰기 위해 무언가를 호출하는 bash 스크립트가 있습니다.getopts
while getopts ":t:" opt; do
case $opt in
t)
timelen="$OPTARG"
;;
\?) printf "illegal option: -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
:) printf "missing argument for -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
esac
done
# reset of the script
source
스크립트를 bash 쉘에 넣었습니다 . 문제가 발생하면 쉘이 종료됩니다.
exit
나머지 스크립트를 건너뛰고 호출 쉘을 종료하지 않는 것 외에 다른 방법이 있습니까?
교체는 함수 호출처럼 작동 exit
하지 return
않으며 나머지 스크립트가 실행됩니다.
감사해요.
답변1
사용 return
.
return bash 내장 기능은 호출(상위/소스) 스크립트를 중지하지 않고 소스 스크립트를 종료합니다.
남자 배쉬에서 :
return [n]
은 함수가 실행을 중지하고 n으로 지정된 값을 호출자에게 반환하도록 합니다. n이 생략되면 반환되는 상태는 함수 본문에서 마지막으로 실행된 명령의 상태입니다. …return이 함수 외부에서 사용되지만 .(소스) 명령 내에서 사용되면 쉘이 스크립트 실행을 중지하고 n 또는 스크립트 내에서 실행된 마지막 명령의 종료 상태를 스크립트의 종료 상태로 반환합니다.…
답변2
간단히 스크립트를 함수로 래핑하고 return
설명하는 방식으로 사용할 수 있습니다.
#!/bin/bash
main () {
# Start of script
if [ <condition> ]; then
return
fi
# Rest of the script will not run if returned
}
main "$@"
답변3
귀하의 경우:
while getopts ":t:" opt; do
case $opt in
t)
timelen="$OPTARG"
;;
\?) printf "illegal option: -%s\n" "$OPTARG" >&2
echo "$usage" >&2
return 1
;;
:) printf "missing argument for -%s\n" "$OPTARG" >&2
echo "$usage" >&2
return 1
;;
esac
done
테스트 예:
$ cat script1.sh
echo script1
source ./script2.sh
echo script1 ends
$ cat script2.sh
echo script2
while true; do
return
done
echo script2 ends
$ bash script1.sh
script1
script2
script1 ends
직접 소싱도 script2.sh
올바른 작업을 수행합니다(현재 쉘 세션을 종료하지 않고).
$ source script2.sh
script2
답변4
어떤 경우에는 첫 번째 셸에 있지 않는 한 종료를 허용하고 싶기 때문에 다음을 사용합니다.
if [[ $SHLVL -gt 1 ]]; then exit 0; fi