2016-11-02 125 views
0

我想通過以下方式來使用for循環來命名我的變量:嵌套的循環和變量命名

for ((a=1; a<=10; a++)); do 
    for ((b=1; b<=100; b++)); do 
     line[$a]position[$b]="This is LINE $a at POSITION $b." 
     eval echo "${line[a]position[b]}" 
    done 
done 

這是可能的,我的代碼是錯誤的?

回答

0

不,這是不可能的,你試試它的方式。首先,名稱中不允許使用[](請參閱手冊中的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.