脚本:
#!/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”不会给我变量的值(这就是我要求的)。它改为给我变量名。
答案 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