如果未定义变量,则使 envsubst 失败

如果未定义变量,则使 envsubst 失败

我有一个包含大量变量的文件。

$ 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
$

相关内容