获取名称由变量本身组成的变量的值

时间:2015-06-15 13:47:23

标签: bash shell variables for-loop sh

脚本:

#!/bin/bash
for SID in db1 db2 db3 db4
do
    "$SID"_fs=$(          
    df -k                           
    | grep "$SID\/data"     
    | tr -s ' '             
    | cut -d' ' -f6         
    | awk  '{print substr($0,length($0),1)}' 
    | sort                          
    | tail -1);
    echo "$SID"_fs
done


./test_sm.sh: line 11: db1_fs=7: command not found
db1_fs
./test_sm.sh: line 11: db2_fs=7: command not found
db2_fs
./test_sm.sh: line 11: db3_fs=3: command not found
db3_fs
./test_sm.sh: line 11: db4_fs=2: command not found
db4_fs

变量设置为正确的值,但最终的“echo”不会给我变量的值(这就是我要求的)。它改为给我变量名。

2 个答案:

答案 0 :(得分:4)

使用declare。以下显示了如何设置变量名称(使用declare)以及如何检索值(使用间接参数扩展)。

for SID in db1 db2 db3 db4
do
    name="${SID}_fs"
    value=$(...)
    declare "$name=$value"

    echo "${!name}"
done

bash 4.3引入了简化此任务的nameref。

for SID in db1 db2 db3 db4
do
    declare -n sid_fs=${SID}_fs
    sid_fs=$(...)
    echo "$sid_fs"
done

您也可以考虑使用关联数组,而不是单个参数。

declare -A fs
for SID in db1 db2 db3 db4; do
    fs[$SID]=$(...)
    echo ${fs[$SID]}
done

答案 1 :(得分:-2)

来自http://www.tldp.org/LDP/abs/html/ivr.html

  

Bash中的间接引用是一个多步骤的过程。首先,取一个变量的名称:varname。然后,引用它:$ varname。然后,引用引用:$$ varname。然后,转义第一个$:\ $$ varname。最后,强制重新评估表达式并赋值:eval newvar = \ $$ varname。

所以在你的情况下:

eval echo \$"$SID"_fs