2014-09-24 40 views
0

我有一個數組bucket1=('10' '22' 'bucket1')BASH:數組元素成爲一個新的數組的名字

正如你所看到的內容之一是數組的bucket1

現在,我創建了名稱一個新的數組複製bucket1

array1=("${bucket1[@]}") 

現在我改變的要素之一array1

array1[1]='30' 

echo ${array1[@]}10 30 bucket1

現在我要養活那變回陣列bucket1,但不知道array1bucket1創建。相反,我想使用array1的第三個元素,即bucket1

喜歡的東西:

declare -a ${array1[2]}=${array1[@]} 

所以,我結束了新bucket1陣列,包含('10' '30' 'bucket1')

簡而言之: 我想複製一個數組,改變複製的數組,從應用更改原始數組中的複製數組使用複製數組中的一個元素作爲原始數組的名稱。

這可能嗎?

回答

3
bucket1=(10 20 bucket1) 
tmp=("${bucket1[@]}") 
tmp[1]=30 
declare -a "${tmp[2]}"=("${tmp[@]}") 
bash: syntax error near unexpected token `(' 

嗯不起作用。嘗試一個接一個

for i in ${!tmp[@]}; do declare "${tmp[2]}[$i]"="${tmp[i]}"; done 
echo ${bucket1[1]} 
30 

這是ksh93的

$ bucket1=(10 20 bucket1) 
$ nameref tmp=bucket1 
$ tmp[1]=30 
$ echo ${bucket1[1]} 
30 
+1

+1爲了將來的參考,'ksh93'解決方案將在'bash' 4.3中工作,用'declare -n'替換'nameref'。 – chepner 2014-09-24 12:10:10

+0

我不得不將Ubuntu升級到14.04以獲得Bash 4.3。然後,我在chepner的幫助下使用了ksh93解決方案。它的工作原理就是我想要的。乾杯! – Alichino 2014-09-30 08:24:59

-1

試試這個:

unset ${array1[2]} 
declare -a ${array1[2]}="`echo ${array1[@]}`" 

首先我們清除數組,然後回聲的輸出將被存儲在新的數組名。

+0

這個新數組的第一個元素設置爲原始數組的全部內容。 – chepner 2014-09-24 12:10:48

0

容易得多,您可以使用read -ra代替declare這裏:

$> bucket1=('10' '22' 'bucket1') 
$> array1=("${bucket1[@]}") 
$> array1[1]='30 50' 
$> declare -p array1 
declare -a array1='([0]="10" [1]="30 50" [2]="bucket1")' 

$> IFS=$'^G' && read -ra "${array1[2]}" < <(printf "%s^G" "${array1[@]}") 
$> declare -p "${array1[2]}" 
declare -a bucket1='([0]="10" [1]="30 50" [2]="bucket1")' 
$> declare -p bucket1 
declare -a bucket1='([0]="10" [1]="30 50" [2]="bucket1")' 

所有這些declare -p已被用於打印數組內容,並可以通過實際腳本刪除。

^G使用控制輸入Vģ在一起。

+0

從這裏讀取字符串會將數組中包含空格的元素拆分爲新數組中的單獨元素。看看,把bucket1的第一個元素改成像'104'這樣的東西。 – chepner 2014-09-24 12:07:33

+0

我非常瞭解這一點,並提供了這個解決方案作爲概念驗證,因爲OP的輸入在數組元素中沒有空格。 – anubhava 2014-09-24 12:16:15

+0

@chepner:現在檢查更新的答案,以確保它對帶有空格的字符串安全。 – anubhava 2014-09-24 12:23:51

0

通過一些工作,您可以獲取適合在參數declare的參數中使用的數組值。

IFS="=" read _ value <<< "$(set | grep '^array1=')" 
declare -a "${array1[2]}=$value" 

圍繞命令替換引號是必要的變通,其被固定在bash 4.3的錯誤。不過,如果你有一個版本的bash,可以使用指定的引用來簡化這個:

declare -n tmp=${array1[2]} 
tmp=("${array1[@]}") 
相關問題