set -u는 bash 스크립트의 heredoc에서 설정되지 않은 값을 찾습니다.

set -u는 bash 스크립트의 heredoc에서 설정되지 않은 값을 찾습니다.

여기서 스크립트를 단순화했습니다.

#!/bin/bash
# test.sh

set -u

### test-script ###
cat <<SCRIPT > ~/test-file-output
#!/bin/bash
set -e

usage() {
  cat <<EOF
Does a thing
EOF
}

for opt in "$@"; do
  case $opt in
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "Invalid option: $opt" >&2
      usage
      exit 1
      ;;
  esac
done
SCRIPT
chmod +x ~/test-file-output

상위 스크립트에 있으므로 heredoc의 하위 스크립트에 있는 var가 하위 스크립트에 설정된 값으로 set -u캡처됩니다 .optopt$@

상위 스크립트 자체의 일부가 아니기 때문에 구분된 문서의 모든 변수와 텍스트를 무시하도록 하는 방법이 있습니까? 내 생각에는 heredoc을 스크립트 구문을 기반으로 구문 분석하는 대신 거대한 문자열로 취급하는 것 같습니다.

답변1

Heredoc은 거대한 문자열이지만 종결자 문자열( SCRIPTyours << SCRIPT)이 인용되지 않으면 다음과 같이 작동합니다.큰따옴표문자열이므로 모든 변수가 확장됩니다. 리디렉션에서 종결자의 일부가 참조되는 경우(예 << "SCRIPT": ), 이는 다음과 같이 작동합니다.아포스트로피문자열이므로 변수 확장이 없습니다.

다음 스크립트를 고려해보세요.

$ cat heredoc.sh 
#!/bin/bash
var=xyz
cat <<EOF
var=$var
EOF

cat <<'EOF'
var=$var
EOF

$ ./heredoc.sh 
var=xyz
var=$var

첫 번째 항목은 EOF인용되지 않았으므로 $var확장됩니다. 두 번째는 문자열에 cat리터럴이 포함 된다는 것입니다 $var.

관련 정보