2014-09-05 73 views
2

比方說,我開始只是item1=('item1' '1' '20')BASH - 一個變量,數組名的部分(部分2)

然後我定義itemnumber=2

我想創建下一個數組作爲item$itemnumber=('item2' '4' '77'),但我得到一個語法錯誤。

之後,我想只是做itemnumber=$((itemnumber+1)),創造item$itemnumber=('item3' '17' '15')

這將使我三件物品1,2和3:

item1=('item1' '1' '20') 
item2=('item2' '4' '77') 
item3=('item3' '17' '15') 

這可能嗎?

+0

其中的bash的釋放,特別是?在4.3和更新的版本中,有一個'namevar'特性(從ksh借用)可以實現更強大的實現。 – 2014-09-22 20:09:29

回答

3

使用declare命令,雖然你需要修改你如何執行任務。

declare -a "item$itemnumber" 
declare "item$itemnumber+=(item$itemnumber 4 77) 

bash 4.3,這是極大的與名爲引用簡化。

itemnumber=0 
declare -n arr=item$itemnumber 
arr+=(item$itemnumber 1 20) 
((itemnumber++)) 
declare -n arr=item$itemnumber 
arr+=(item$itemnumber 4 77) 
((itemnumber++)) 
declare -n arr=item$itemnumber 
arr+=(item$itemnumber 17 15) 

只是增加itemnumber,重置參考,然後使用引用,你會實際的數組。

+0

現在我得到了Bash 4.3,這個命名的參考文件很有用!我的遊戲現在可以進步了。 – Alichino 2014-09-30 08:27:31

5

一種EVAL任務:

itemnumber=1 
((itemnumber += 1)) 
eval "item$itemnumber=('item$itemnumber' '4' '77')" 
eval echo \${item$itemnumber[*]} 
+0

謝謝你,klashxx。這麼簡單:D – Alichino 2014-09-05 09:42:04

1

有點晚了答案,但如果你需要很多次,你可以使用分配

#!/bin/bash 

assign() { eval "$1=($(printf '"%s" ' "[email protected]"))"; } 

itemnum=0 
assign item$((++itemnum)) 1 2 3 4 
assign item$((++itemnum)) 'q w e r' 
assign item$((++itemnum)) a "$itemnum cc" dd 

#show the array members enclosed in '' 
echo "item1:" $(printf "'%s' " "${item1[@]}") 
echo "item2:" $(printf "'%s' " "${item2[@]}") 
echo "item3:" $(printf "'%s' " "${item3[@]}") 

打印

item1: 'item1' '1' '2' '3' '4' 
item2: 'item2' 'q w e r' 
item3: 'item3' 'a' '3 cc' 'dd' 
的功能

或簡單

echo ${item1[@]} 
echo ${item2[@]} 
echo ${item3[@]} 

打印

item1 1 2 3 4 
item2 q w e r 
item3 a 3 cc dd 

,如果你想排除,從陣列(該ITEMNAME)的第一個元素,使用

assign() { var="$1"; shift 1; eval "$var=($(printf '"%s" ' "[email protected]"))"; } 

n=0 
assign item((++n)) 1 2 3 4 
echo "item1 contains only: $item1[@]}" 

打印

item1 contains only: 1 2 3 4 
0

在bash 4.3,一個namevar是一個完美的工具:

set_item() { 
    local itemnumber=$1; shift 
    local -n array_name="item$itemnumber" 
    array_name=("[email protected]") 
} 
set_item 2 1 2 3 4 
set_item 3 2 3 4 5 

...將有同樣的效果......

item2=(1 2 3 4) 
item3=(2 3 4 5)