不,這是不可能的,你試試它的方式。首先,名稱中不允許使用[]
(請參閱手冊中的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
不是我們想要的變量名,但擴展它。
這一切都這樣說,猛砸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.