2013-10-17 77 views
29

我的應用程序的數組,初始化像這樣:如何在Bash中複製數組?

depends=(cat ~/Depends.txt) 

當我嘗試分析列表,並將其複製到使用新的陣列,

for i in "${depends[@]}" 
    if [ $i #isn't installed ]; then 
     newDepends+=("$i") 
    fi 
done 

會發生什麼情況是,只有第一依賴的因素在newDepends上結束。

for i in "${newDepends[@]}" 
    echo $i 
done 

^^這會輸出一件東西。所以我想弄清楚爲什麼我的for循環只是移動第一個元素。整個列表最初都是依賴的,所以不是這樣,但我完全沒有想法。

+0

這對我來說很好。你確定你的「未安裝」測試工作正常嗎? – rici

+4

在你的問題中是否有錯字? 'depends'將包含2個單詞,'cat'和'〜/ Depends',而不是'〜/ Depends.txt'的內容。 – chepner

回答

1

可以通過插入第一陣列進副本的元素通過指定索引複製的數組:

#!/bin/bash 

array=(One Two Three Go!); 
array_copy(); 

let j=0; 
for ((i=0; i<${#array[@]}; i++) 
do 
    if [[ $i -ne 1 ]]; then # change the test here to your 'isn't installed' test 
     array_copy[$j]="${array[$i]} 
     let i+=1; 
    fi 
done 

for k in "${array_copy[@]}"; do 
    echo $k 
done 

這樣做的輸出將是:

One 
Three 
Go! 

上有用的文件bash數組在TLDP

-3

我發現有什麼問題..我的if沒有安裝測試是兩個循環,從文件名中刪除多餘的字符,並吐出它們,如果它們存在於某個Web服務器上。它沒有做的是刪除一個尾隨連字符。所以,當它在線測試它的可用性時,它們被解析出來。由於「文件」存在,但「文件」不存在。

67
a=(foo bar "foo 1" "bar two") #create an array 
b=("${a[@]}")     #copy the array in another one 

for value in "${b[@]}" ; do #print the new array 
echo "$value" 
done 
+2

只寫b =($ {a [@]})可以嗎? – Indicator

+4

嘗試執行與您的修改命令,你會明白爲什麼寫不引用不正確...值「foo 1」將不會顯示爲它的shoudl,但它會爲數組foo AND 1,bar AND two創建更多值,而不是「foo 1」和「bar two」 – user1088530

+0

@Indicator您將遇到空間問題! –

3

在其他答案中給出的解決方案不適用於關聯數組或不具有非連續索引的數組。這裏有一個更通用的解決方案:

declare -A arr=([this]=hello [\'that\']=world [theother]='and "goodbye"!') 
temp=$(declare -p arr) 
eval "${temp/arr=/newarr=}" 

diff <(echo "$temp") <(declare -p newarr | sed 's/newarr=/arr=/') 
# no output 

而另:

declare -A arr=([this]=hello [\'that\']=world [theother]='and "goodbye"!') 
declare -A newarr 
for idx in "${!arr[@]}"; do 
    newarr[$idx]=${arr[$idx]} 
done 

diff <(echo "$temp") <(declare -p newarr | sed 's/newarr=/arr=/') 
# no output 
+0

你的第一個解決方案不能成爲一個函數,因爲'eval「declare -A newarr = ...」'將有效地聲明一個* local *數組''newarr'來映射來自父環境的真實變量。刪除'declare -A'可能是一個選項,這樣只剩下'newarr = ...',但是在這條路徑上存在着逃避問題。 –

2

Bash 4.3開始,你可以做到這一點

$ alpha=(bravo charlie 'delta 3' '' foxtrot) 

$ declare -n golf=alpha 

$ echo "${golf[2]}" 
delta 3 
+11

這個答案不正確。雖然'''declare -n'''是有用的,它只會創建一個對原始數組的引用,它不會複製它,這就是問題所在。 – niieani

6

複製非關聯數組最簡單的方法在bash中是:

arrayClone=("${oldArray[@]}")

,或者添加元素添加到預先存在的陣列:在元件

someArray+=("${oldArray[@]}")

換行/間隔/ IFS將被保留。

對於複製關聯數組,Isaac的解決方案效果很好。

+0

他似乎沒有爲我工作: ''' $ a1 =(大哈里曼); $ a2 =(「$ {!a1 [@]}」); $ echo「$ {a2 [0]}」; $ echo「$ {a2 [1]}」; 1; $ ''' –

+2

嘿@FelipeAlvarez - 確實'''是多餘的,我糾正了我的答案 – niieani