如何在不使用eval的情况下实现Bash间接赋值?
如何在Bash中实现间接赋值(避免使用eval)?
问题背景
当我们设置间接命令时,直接展开变量就能执行对应的命令:
command="ls -1" $command # 正常执行ls -1
但如果变量存储的是赋值语句:
assignment="a=1"
直接执行$assignment时,Bash会将a=1识别为命令而非赋值操作,抛出错误:
bash: a=1: command not found
需求是实现这种间接赋值,但避免使用eval $assignment。
解决方案
可以使用declare命令来实现,它能够正确解析包含赋值表达式的字符串参数:
assignment="a=1" declare "$assignment" echo $a # 输出 1
原理说明
declare是Bash的内置命令,除了用于声明变量类型(如只读、数组等),它还可以接受完整的赋值表达式字符串作为参数,会按照变量赋值的逻辑去解析执行,而非当成外部命令处理,因此不需要借助eval就能完成间接赋值。
如果是要给环境变量赋值,也可以用export命令替代declare,效果一致:
assignment="PATH=$PATH:/new/dir" export "$assignment"
内容的提问来源于stack exchange,提问作者Delta George
相关产品推荐
相关产品推荐

