【问题标题】:Get the value of a variable whose name consists of a variable itself获取名称由变量本身组成的变量的值
【发布时间】:2015-08-31 01:09:49
【问题描述】:

脚本:

#!/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

变量设置为正确的值,但最终的“回声”没有给我变量的值(这是我需要的)。它反而给了我变量名。

【问题讨论】:

标签: bash shell variables for-loop sh


【解决方案1】:

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

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

    echo "${!name}"
done

bash 4.3 引入了 namerefs 来简化这个任务。

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

【讨论】:

  • 像魅力一样工作。谢谢!您可能希望将 $tmp 替换为 $value。
【解决方案2】:

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

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

所以在你的情况下:

eval echo \$"$SID"_fs

【讨论】:

  • 现代 Bash 提供了一些功能,这些功能不再需要使用 eval 来动态或以其他方式扩展名称。举两个例子,nameref 属性和关联数组。
  • 这是您不应使用此参考的原因之一。 eval 在这里是不必要的。
猜你喜欢
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多