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吗?
答案 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,则最好更彻底地检查字符串。