在Bash中如何为动态变量设置值?
如何通过间接变量名修改Bash变量的值
我明白你遇到的问题了——你想用变量B里存的变量名(也就是A)来修改A的值,但用管道加eval的方式没生效对吧?让我给你拆解一下原因,再给你几个靠谱的解决方案:
为什么你的原方法不生效?
你写的echo "\$$B=2" | eval之所以没把A改成2,核心问题出在管道创建了子shell:
- 管道的右侧(
eval)会在一个独立的子shell进程里运行 - 子shell里修改的
A变量只在这个子进程里有效,父进程(你当前的shell)根本看不到这个变化 - 所以执行完这条命令后,父shell里的
A还是原来的1
正确的实现方法
方法1:直接给eval传字符串(最直接)
不用管道,直接把要执行的赋值语句作为字符串传给eval,这样eval就在当前shell里执行,修改的是当前shell的变量:
A=1 B='A' eval "${B}=2" # 或者 eval "$B=2",加花括号更严谨 echo $A # 现在输出2
方法2:用declare命令(更安全,避免eval的风险)
如果不想用eval(毕竟eval处理不可信字符串有安全风险),可以用declare命令来实现间接赋值:
A=1 B='A' declare "$B=2" echo $A # 输出2
方法3:用printf -v(Bash 4.0+支持)
这也是一种安全的间接赋值方式,适合给变量赋值字符串:
A=1 B='A' printf -v "$B" '%s' 2 echo $A # 输出2
验证一下
不管用上面哪种方法,执行完后再echo $A,都会输出2,完美达到你的需求。
内容的提问来源于stack exchange,提问作者darioguarascio
相关产品推荐
相关产品推荐

