2012-04-14 69 views
4

我的第一個bash腳本有問題。我在for循環中填充一個數組,並且當我嘗試從它獲取一個項目時,我總是得到第一個元素。Bash參數數組操作問題

for ((i = 0; i < ${#*}; i++)); do 
hash=$(md5 -q ${@:$i:1}) 
modifiedNames[$i]=${@:$i:1}$hash 
done 

echo ${modifiedNames[1]} 

例如,如果我把我的腳本是這樣的:./script.sh文件1文件2,我收到文件1 [file1hash]

提前感謝!

回答

1

[email protected] ISN」一個真正的數組 - 它是一個shell「特殊參數」,你需要比其他數組更小心。

的理由讓你所看到的行爲是${parameter:length:offset}語法的確切行爲是特例,當parameter@,且行爲與一致的行爲,你會得到,如果@是一個真正的數組。

這裏的相關文件(大膽重點煤礦):

${參數:偏移:長度}

...如果參數是@,將結果是長度位置參數開始於偏移量。如果參數是@,則結果是長度位置參數開始於偏移量。 ...

位置參數$0$1$2,...,所以用這樣的語法它表現得好像[email protected]包含腳本名稱($0),以及作爲參數傳遞給腳本($1$2 ,...)。這與"[email protected]"擴展到"$1" "$2" ...不一致,但這就是生活。

你應該能夠把事情簡單化(和修復腳本),通過使新的陣列,而不是直接使用[email protected],即

new_array=("[email protected]") 
for ((i = 0; i < ${#new_array}; i++)); do 
    hash=$(md5 -q ${new_array[@]:$i:1}) 
    modifiedNames[$i]=${new_array[@]:$i:1}$hash 
done 

echo ${modifiedNames[1]} 
0

其實,你得到第二個元素,但你的循環在[0]和[1]中放置相同的值。

我不確定你在做什麼,但它可能會更容易迭代參數,然後爲數組保留一個單獨的計數器。

n=0 
for i in "[email protected]"; do 
    . . . 
    n=$(($n + 1)) 
done 
+0

好,但爲什麼循環表現呢?我看不到爲什麼它將相同的值放入數組項。 – 2012-04-14 23:51:04

2

我認爲你的循環表現得有趣,因爲它應該以i = 1開始並轉到i = $ {#*}。擴展$ {@:0:1}給予file1,$ {@:1:1}也是如此。

嘗試for ((i = 1; i <= ${#*}; i++))

1

您通過參數數組從0開始,這是命令名迭代。所以,如果你打電話給你的腳本一樣./script.sh file1 file2,則:

${@} = array(
    [0] = ./script, 
    [1] = file1, 
    [2] = file2 
) 

所以你得到:

modifiedNamed = array(
    [0] = md5(./script), 
    [1] = md5(file1) 
) 

你應該改變你的for循環索引:

for ((i = 1; i <= ${#*}; i++)); do