bash中$ bash的$ {!ENV}等于什么?

时间:2018-12-14 16:41:28

标签: bash sh gitlab-ci

bash中的命令${!ENV}将获取环境变量ENV的值,然后将该值解释为另一个环境变量的名称,然后它将返回right之后的值。

ENV=PATH
echo ${!ENV}

输出:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

为了使现有的Gitlab管道更简洁,我发现了这种行为的用途。但是,我们的Gitlab运行程序使用sh而不是bash运行事物。

bash中${!ENV}等于bash吗?

1 个答案:

答案 0 :(得分:2)

不。 POSIX不要求在Shell中进行这种“间接扩展”。如果您想严格遵守POSIX,您最好做的是eval

ENV=PATH
eval echo "\"$ENV is \$$ENV\""

输出(示例):

PATH is /usr/bin

根据我的经验,在任何地方使用Bash几乎都没有困难,因此,除非您脚踏实地地使用POSIX,否则还应该考虑坚持使用Bash。

请注意,eval是危险的事情。建议您在实际评估字符串之前验证该字符串对eval是安全的,除非该字符串是由您(您的脚本)创建的,而不是一些用户输入的。像这样简单的事情就会起作用:

echo "$ENV" | grep -qi '^[A-Z_][A-Z0-9_]*$'

检查退出值$?。如果为零,则可以安全地评估$ENV。如果为1,则最好更彻底地检查字符串。