我有一个包含大量变量的文件。
$ cat message.txt
Hello, ${LOCATION}! You too, ${PERSON} ;)
如果PERSON
未定义,envsubst
则将其替换为空:
$ LOCATION=World envsubst < message.txt
Hello, World! You too, ;)
envsubst
如果文件中的许多环境变量中的任何一个未定义,我如何才能以非零退出代码(或可靠的代码)失败?
答案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
$