"Bash 엄격 모드"를 사용할 때 Bash 스크립트의 위치 매개변수를 구문 분석하는 방법은 무엇입니까?

"Bash 엄격 모드"를 사용할 때 Bash 스크립트의 위치 매개변수를 구문 분석하는 방법은 무엇입니까?

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하려고 하기 때문에 오류가 발생합니다 . 따라서 문제의 명령은 사용하는 테스트입니다 .$1whilewhile

[ "$1" != "" ]

대신 다음과 같은 것을 사용하십시오.

[ "${1+set}" = set ]

또는

[ -n "${1+set}" ]

매개변수 확장은 기존 변수인 경우 (null이 아닌 값이 있는지 여부에 관계없이) ${parameter+word}로 확장됩니다 . 이 단어는 임의로 선택되었지만 어떤 면에서는 그 목적을 암시합니다.wordparameterset

$#위치 매개변수의 개수가 저장되는지 테스트할 수도 있습니다 .

[ "$#" -ne 0 ]

또는

[ "$#" -gt 0 ]

목록에서 처리하고 제거해야 하는 위치 매개변수가 있는 한 이러한 산술 테스트는 정확합니다.

nounset이들 변형 중 하나는 쉘 옵션( )에 의해 부과된 제한과의 충돌을 방지합니다 set -u.

관련 정보