不,这不可能通过您尝试的方式进行。首先,[] 不允许出现在名称中(参见手册中的definitions),因此您必须使用类似line${a}position$b 的名称。
一个(mostly frowned upon)选项是使用eval:
#!/bin/bash
for (( a=1; a<=2; a++ )); do
for (( b=1; b<=2; b++ )); do
varname=line${a}position$b
eval $varname=\"This is LINE \$a at POSITION \$b.\"
echo "${!varname}"
done
done
这首先创建用作变量名的字符串varname。对于每个循环,它变为line1position1、line1position2 等等。
然后,在这一行,我们将您的字符串分配给具有该名称的变量:
eval $varname=\"This is LINE \$a at POSITION \$b.\"
引用使得字符串扩展为,例如对于第一个循环,
line1position1="This is LINE $a at POSITION $b."
line1position1 的值变成了This is LINE 1 at POSITION 1.。
要访问这个变量的值,我们必须使用indirect expansion:${!varname}中的!表示varname不是我们想要的变量名,而是扩展为它。
话虽如此,Bash 4.3 引入了namerefs,它可以更优雅地解决这个问题:
#!/bin/bash
for (( a=1; a<=2; a++ )); do
for (( b=1; b<=2; b++ )); do
declare -n refvar=line${a}position$b
refvar="This is LINE $a at POSITION $b."
echo "$refvar"
done
done
这里不需要eval。
两种解决方案的输出如下:
This is LINE 1 at POSITION 1.
This is LINE 1 at POSITION 2.
This is LINE 2 at POSITION 1.
This is LINE 2 at POSITION 2.