我在使用bash脚本时遇到了一些麻烦,也许有人可以帮助我。
在我的脚本中,我使用如下循环动态定义变量:
somecolors="red yellow green blue" # read out of a file, may vary
for color in $(echo $somecolors); do
# Actually, here is more code that generates the value I
# want to set for this variable, that is being written
# into "$value"
declare use_color_$color=$value
done
结果是定义了四个变量:
use_color_red=1
use_color_yellow=1
use_color_green=1
use_color_blue=1
到目前为止一切顺利。但是我怎么能动态阅读这些呢?我想起诉" for"环。例如:
for color in $(echo $colors); do
echo $use_color_${color}
done
但这不起作用。
如何将两个变量名称组合成一个?
提前致谢!
答案 0 :(得分:3)
更好地使用索引和关联数组。以这种方式引用和取消引用变量变量确实是错误的。
somecolors=(red yellow green blue)
declare -A use_color
for color in "${colors[@]}"; do
use_color[$color]=$value ## Or do you mean use_color[$color]=$color?
done
授予$value == 1
,当您执行echo "${use_color[red]}"
时,您将获得1
。
一种变化:
declare colors=(red yellow green blue)
declare -A use_color
use_color[red]=1
use_color[yellow]=1
use_color[green]=1
use_color[blue]=1
for color in "${colors[@]}"; do
echo "use_color[$color]=${use_color[$color]}"
done
输出:
use_color[red]=1
use_color[yellow]=1
use_color[green]=1
use_color[blue]=1
类似地:
declare -A use_color=([red]=1 [yellow]=1 [green]=1 [blue]=1)
for color in "${!use_color[@]}"; do
echo "use_color[$color]=${use_color[$color]}"
done
输出:
use_color[yellow]=1
use_color[red]=1
use_color[blue]=1
use_color[green]=1
答案 1 :(得分:3)
最干净的方法是使用变量替换。 ${!varabc}
形式的变量将匹配以varabc
开头的所有先前定义的变量。在你的情况下:
#!/bin/bash
use_color_red=1
use_color_yellow=1
use_color_green=1
use_color_blue=1
for i in ${!use_color@}; do
printf " name: %-16s value: %d\n" $i ${!i}
done
exit 0
输出:
name: use_color_blue value: 1
name: use_color_green value: 1
name: use_color_red value: 1
name: use_color_yellow value: 1