2011-07-17 72 views
98

我想要做這樣的事情:循環執行陣列,印刷兩個指數和值

foo=() 
foo[0]="bar" 
foo[35]="baz" 
for((i=0;i<${#foo[@]};i++)) 
do 
    echo "$i: ${foo[$i]}" 
done 
# Output: 
# 0: bar 
# 1: 

然後我試圖遍歷它使用在:

foo=() 
foo[0]="bar" 
foo[35]="baz" 
for i in ${foo[@]} 
do 
    echo "?: $i" 
done 
# Output: 
# ?: bar 
# ?: naz 

但在這裏,我不噸知道指數值。

我知道你可以像

foo=() 
foo[0]="bar" 
foo[35]="baz" 
declare -p foo 
# Output: 
# declare -a foo='([0]="bar" [35]="baz")' 

,但是,你不能以另一種方式做到這一點?

回答

168

你會找到"${!foo[@]}"reference)數組鍵,所以:

for i in "${!foo[@]}"; do 
    printf "%s\t%s\n" "$i" "${foo[$i]}" 
done 
+4

重要事項,而迭代,用空格隔開單詞列表不是數組。把它像'(a b c)'一樣轉換成一個數組。 – Breedly

+1

使用'[@]'和雙引號意味着它不是「空格分隔的單詞列表」。即使單個鍵包含空格,您也會獲得實際數組鍵的列表。 –

+0

@glennjackman你能解釋一下嗎?[@]和雙引號的使用意味着它不是一個「空格分隔的單詞列表」 –

4

,你可以隨時使用迭代PARAM:

 ITER=0 
     for I in ${FOO[@]} 
     do 
      echo ${I} ${ITER} 
      ITER=$(expr $ITER + 1) 
     done 
+0

'((ITER ++))'在現代bash中 –

+0

爲什麼後遞增?你只希望這個值增加,因此((++ ITER))更直接地表達你想要做的事情...... – MikeW

1
INDEX=0 
for i in $list; do 
    echo ${INDEX}_$i 
    let INDEX=${INDEX}+1 
done 
+0

你的答案當然值得一點解釋。請參閱http://stackoverflow.com/help/how-to-answer。評論有助於創建可搜索的內容。 –

+3

儘管此代碼片段可能會解決該問題,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! – kayess