如何读出动态声明的bash变量的值?

时间:2014-07-28 08:00:52

标签: bash variables dynamic declare

我在使用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

但这不起作用。

如何将两个变量名称组合成一个?

提前致谢!

2 个答案:

答案 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