首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果没有定义变量,则使‘`envsubst`’失败

如果没有定义变量,则使‘`envsubst`’失败
EN

Unix & Linux用户
提问于 2022-02-02 21:47:55
回答 2查看 1.3K关注 0票数 6

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

代码语言:javascript
复制
$ cat message.txt
Hello, ${LOCATION}! You too, ${PERSON} ;)

如果未定义PERSON,则envsubst将其替换为nothing:

代码语言:javascript
复制
$ LOCATION=World envsubst < message.txt
Hello, World! You too,  ;)

如果文件中的许多环境变量没有定义,我如何使非零退出代码(或可靠的) envsubst失败?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2022-12-01 21:04:49

这并不理想,因为它不会按照请求改变envsubst的行为,但是它能够识别未设置的变量。用户必须确保分隔符EOF不会出现在文本中。如果是,则选择不同的分隔符。

代码语言:javascript
复制
#!/usr/bin/env bash

msg="$( printf 'cat << EOF\n%s\nEOF\n' "$(cat)" )"

bash -u <<< "$msg"

输出:

代码语言:javascript
复制
$ ./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 ;)

下面是一个更长的版本,它将一次列出所有未设置的变量,而不是一次只公开一个变量:

代码语言:javascript
复制
#!/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退出。

输出:

代码语言:javascript
复制
$ ./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
$
票数 1
EN

Unix & Linux用户

发布于 2022-12-01 20:05:28

perl中,您可以很容易地达到等效的值,如果未定义env,则可以通过错误退出:

代码语言:javascript
复制
perl -pe 's{\$(?|\{(\w+)\}|(\w+))}{$ENV{$1} // die "A1 not defined\n"}ge'
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/689046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档