在bash中,有没有一种方法可以在变量中替换或嵌套变量?
假设我有两个变量在bash中,有没有一种方法可以在变量中替换或嵌套变量?,bash,Bash,假设我有两个变量 var_one_string=foo var_two_string=bar 我将如何完成这样的事情(伪代码示例) 例1 for i in one two; do echo $var_${i}_string done # Desired output foo bar 例2 for i in one two; do echo $var_$(echo ${i})_string done # Desired output foo bar 我知道这是一种糟糕的替换,我只是想
var_one_string=foo
var_two_string=bar
我将如何完成这样的事情(伪代码示例)
例1
for i in one two; do
echo $var_${i}_string
done
# Desired output
foo
bar
例2
for i in one two; do
echo $var_$(echo ${i})_string
done
# Desired output
foo
bar
我知道这是一种糟糕的替换,我只是想知道是否有办法在另一个变量调用中嵌套字符串
编辑:我能让它工作
var_one_string=foo
var_two_string=bar
for i in $(echo ${!var_*}); do
echo ${!i}
done
foo
bar
基本上,您可以使用
eval
:echo$(eval'$var'''${i}”)
但你也可以使用词汇:
declare -A vars
vars=( ["one"]="number-one" ["two"]="number-two" )
i="one"
echo "${vars[${i}]}"
在
bash
中使用内置的declare
和间接变量扩展。首先将数组中动态性质的元素定义为
#!/bin/bash
list=(one two)
unset count
for var in "${list[@]}"; do
declare var_${var}_string="string"$((++count))
done
现在使用间接展开访问创建的变量
for var in "${list[@]}"; do
dymv="var_${var}_string"
echo "${!dymv}"
done
对于此要求,切勿使用
eval
。可能是危险的,因为不太可能使用有害命令进行代码注入。输入所需的输出。不确定您到底想要什么。添加了所需的输出。除了重复许多其他StackOverflow问题之外,这是。@s3d83d,…顺便说一句,不管是否经常使用,最好使用功能更强大的数据结构来代替间接扩展。(一个关联数组,一个通过nameref和c访问的数字索引数组)。感谢Charles Duffy,我能够让它使用间接扩展。好的,那么数组将使用我的“原始”示例。但是,如果嵌套变量构造更像这样会怎么样;var_one_string=string1;echo$var{i}\u字符串。我将把这个添加到我原来的问题中。好吧,你告诉我我的问题不是我想要的,它是否仍然适用于我更新的问题。(即var_one_string=string1)@s3d83d:查看我的更新哈哈,你在向我展示我对提问的厌恶。再说一遍,我不打算在var集合中创建一个模式。我更新的问题怎么样。@s3d83d:您需要动态地将变量值赋值给declare
。如果脚本向用户请求变量并存储它,可以吗?我更希望它是自治的。到目前为止,用户输入仅限于y/n…。希望将其保留在那里。