如何在for循环中调用变量作为变量名和变量值

时间:2018-01-21 21:32:14

标签: linux bash variables for-loop

我对Linux中的脚本相对较新(更习惯使用R)但是我正在尝试执行一个脚本,我将一些变量设置为文件路径然后我可以在for循环中调用所以我可以同时调用它们整个脚本中的变量名和变量值。

例如,我将为命令的参数调用变量值(如在文件路径中),但是对于命令的输出,我将调用变量名来写输出。我试图使用下面的花括号来实现这一点。这会有效吗?

非常感谢任何帮助!

#Generate variables with path directories
C1=/path/file1
C2=/path/file2
C3=/path/file3
C4=/path/file4
L1=/path/file1
L2=/path/file2
L3=/path/file3

#Loop through each instance of C for each instance of L (to create L*C number of outputs)
for Cid in C1, C2, C3, C4,
do for Lid in L1, L2, L3,
do
commandA -arg1 $${Cid} -arg2 $${Lid} -output /path/file${Cid}${Lid}
done
done

1 个答案:

答案 0 :(得分:1)

这是使用declare -A声明的关联数组的作业:

#!/usr/bin/env bash

declare -A arr=(
[C1]=/path/file1
[C2]=/path/file2
[L1]=/path/file1
[L2]=/path/file2
)

for index in "${!arr[@]}"; do
    echo "$index:${arr[$index]}"
done
  • ${!arr[@]}:数组的所有索引(C1C2,...)
  • ${arr[$index]}:与给定索引(/path/file1,...)
  • 对应的数组元素

如果您想坚持使用常规变量,可以使用variable indirection

C1=/path/file1
C2=/path/file2
L1=/path/file1
L2=/path/file2

for var in C1 C2 L1 L2; do
    echo "$var:${!var}"
done
  

${!parameter}

     

如果parameter的第一个字符是惊叹号(!),和   parameter不是nameref,它引入了一个变量级别   间接。 Bash使用从其余部分形成的变量的值   parameter作为变量的名称;那么这个变量就是   扩展,该值用于替换的其余部分,   而不是parameter本身的价值。