변수가 많은 파일이 있습니다.
$ cat message.txt
Hello, ${LOCATION}! You too, ${PERSON} ;)
PERSON
정의되지 않은 경우 envsubst
아무것도 없는 것으로 바꿉니다.
$ LOCATION=World envsubst < message.txt
Hello, World! You too, ;)
envsubst
파일의 많은 환경 변수 중 하나라도 정의되지 않은 경우 0이 아닌 종료 코드(또는 신뢰할 수 있는 코드)로 인해 어떻게 실패할 수 있습니까?
답변1
perl
환경 변수가 정의되지 않은 경우 동일한 작업을 쉽게 수행하고 오류와 함께 종료할 수 있습니다.
perl -pe 's{\$(?|\{(\w+)\}|(\w+))}{$ENV{$1} // die "$& not defined\n"}ge'
답변2
envsubst
이는 요청의 동작을 변경하지 않으므로 이상적이지는 않지만 설정되지 않은 변수를 식별할 수 있습니다. 사용자는 EOF
텍스트에 구분 기호가 나타나지 않는지 확인해야 합니다. 그렇다면 다른 구분 기호를 선택하십시오.
#!/usr/bin/env bash
msg="$( printf 'cat << EOF\n%s\nEOF\n' "$(cat)" )"
bash -u <<< "$msg"
산출:
$ ./test.sh < message.txt || echo fail
bash: line 1: LOCATION: unbound variable
fail
$ LOCATION=World ./test.sh < message.txt || echo fail
bash: line 1: PERSON: unbound variable
fail
$ LOCATION=World PERSON=Ralph ./test.sh < message.txt || echo fail
Hello, World! You too, Ralph ;)
다음은 설정되지 않은 모든 변수를 한 번에 노출하는 대신 한 번에 나열하는 더 긴 버전입니다.
#!/usr/bin/env bash
check_vars() {
# pass a list of variable names on stdin, one to a line
rc=0
while read v
do
if [[ ! "${!v}" ]]
then
printf '%s\n' "$v"
rc=1
fi
done
return $rc
}
envsubst -v "$(cat)" | check_vars
이 버전은 설정되지 않은(또는 null) 변수 목록을 한 줄에 하나씩 출력하며 목록이 비어 있는 경우에만 0으로 종료됩니다.
산출:
$ ./test2.sh < message.txt || echo fail
LOCATION
PERSON
fail
$ PERSON=Ralph ./test2.sh < message.txt || echo fail
LOCATION
fail
$ LOCATION=World ./test2.sh < message.txt || echo fail
PERSON
fail
$ LOCATION=World PERSON=Ralph ./test2.sh < message.txt || echo fail
$