Bash 엄격 모드는 다음과 같이 정의됩니다.
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
http://redsymbol.net/articles/unofficial-bash-strict-mode/
다음 Bash 스크립트에서 위치 매개변수의 구문 분석을 고려하세요.
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
usage() {
echo ""
echo "usage:"
echo "$0 [options]"
echo " -r | --redirect-uri: redirect uri"
echo " -a | --app-role: app role id"
echo " -h | --help: help"
echo ""
}
redirect_uri=""
app_role=""
while [ "$1" != "" ]; do
case $1 in
-r | --redirect-uri)
shift
redirect_uri="$1"
;;
-a | --app-role)
shift
app_role="$1"
;;
-h | --help)
usage
exit 0
;;
*)
usage
exit 1
;;
esac
shift
done
...
이는 다음과 같은 오류에는 적용되지 않습니다.
$ ./app.sh -r https://example.net:8080/auth/callback -a 53b37b21-2c6e-4731-a5e5-15b98052c686
./app.sh: line 18: $1: unbound variable
while
그 이유는 조건의 최종 확인이 정의되지 shift
않았기 때문이라고 생각합니다 $1
.
Bash 엄격 모드를 사용할 때 while
스크립트를 충돌시키지 않고 명령문에서 매개변수 구문 분석을 종료하려면 어떻게 해야 합니까?
답변1
루프의 마지막 반복 후에는 나타나지 않는 정의되지 않은 상태에서 액세스 unbound variable
하려고 하기 때문에 오류가 발생합니다 . 따라서 문제의 명령은 사용하는 테스트입니다 .$1
while
while
[ "$1" != "" ]
대신 다음과 같은 것을 사용하십시오.
[ "${1+set}" = set ]
또는
[ -n "${1+set}" ]
매개변수 확장은 기존 변수인 경우 (null이 아닌 값이 있는지 여부에 관계없이) ${parameter+word}
로 확장됩니다 . 이 단어는 임의로 선택되었지만 어떤 면에서는 그 목적을 암시합니다.word
parameter
set
$#
위치 매개변수의 개수가 저장되는지 테스트할 수도 있습니다 .
[ "$#" -ne 0 ]
또는
[ "$#" -gt 0 ]
목록에서 처리하고 제거해야 하는 위치 매개변수가 있는 한 이러한 산술 테스트는 정확합니다.
nounset
이들 변형 중 하나는 쉘 옵션( )에 의해 부과된 제한과의 충돌을 방지합니다 set -u
.