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



我有一个包含

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(仅用于测试目的),然后访问这些新变量。

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

但是,此方法不起作用...还有其他方法可以做到这一点吗?

使用 eval .试试这个:

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

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

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

最新更新