通过合并另一个变量值(shell)生成变量名称

时间:2013-11-13 14:49:58

标签: arrays shell variables

我有一个包含

的数组
commName[0]="ls"
commName[1]="date"
commName[2]="crontab"
commName[3]="uname"
commName[4]="hostname"

现在数组并不总是包含这些。有时候它可能会有更多的指数。值并不总是ls,date,...它们可以是不同的。最重要的是,我在编码时不知道数组的大小和值。

每个数组值ls,date,...都有自己唯一的地址。例如,ls/home/test/,日期将具有/home/test/test2/等等......这些地址需要存储到稍后将在代码中使用的变量中。所以我应该根据给定的数组

跟随变量
$lsAddress
$dateAddress
$crontabAddress
$unameAddress
$hostnameAddress

因此,我需要一种方法来制作这些变量(请记住我不知道ls,date,uname,....

我的方法就是这个

for ((j=0 ; j<${#commName[@]} ; j++))
do
  set commName[$j]Nick="hi"
  echo $(${commName[$j]}Nick)
done

我期望这样做是为数组的每个索引创建新变量,并将它们设置为hi(仅用于测试目的),然后访问这些新变量。

此外,新创建的变量必须可以在任何地方访问。所以,我不能有一个不断被替换的临时变量。

但是,这种方法不起作用......还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

使用eval。试试这个:

for ((j=0 ; j<${#commName[@]} ; j++))
do
    param=`echo ${commName[$j]}Nick`
    eval "$param=hi1"
    eval "echo \$$param"
done

答案 1 :(得分:1)

使用两个并行数组,以便命令数组中的条目与地址数组中的相应条目匹配。

commName[0]="ls"
commName[1]="date"
commName[2]="crontab"
commName[3]="uname"
commName[4]="hostname"

commAddress[0]="/home/test/"       # ls
commAddress[1]="/home/test/test2"  # date
# etc

然后,当您具有i的特定值时,您知道${commName[i]}${commAddress[i]}会在一起。

我推荐这两个数组,但您也可以考虑使用bash的间接参数扩展。

$ commName[0]="ls"
$ lsAddress="/home/test"
$ name="${commName[0]}Address"
$ echo "${!name}"
/home/test