枚舉循環中的所有其他數組元素

枚舉循環中的所有其他數組元素

我有一個帶有鍵對值的動態數組,我想枚舉所有其他價值。在本例中,只是數組中的名稱。由於我沒有使用 bash v4,因此我能夠使用seqecho 來單步執行陣列。

$ array=(Guido yes Francesca no Balthazar yes)
for x in $(seq 0 2 ${#array[@]});do echo $x;done
0
2
4
6

這比我擁有的對多返回一個元素(由於 0 偏移量),但我可以使用簡單的 bash 數學來解釋這一點:

for x in $(seq 0 2 $((${#array[@]}-1)));do echo $x;done
0
2
4

這很好用。但是,當我嘗試從 中提取元素時$array,我會收到一個無法解釋的錯誤。我嘗試過有或沒有“數學”

$ for x in $(seq 0 2 $((${#array[@]}-1)));do echo ${array[$x]};done
-bash: 0: syntax error: operand expected (error token is "0")

$ for x in $(seq 0 2 ${#array[@]});do echo ${array[$x]};done
-bash: 0: syntax error: operand expected (error token is "0")

如何從這個動態陣列中取得名稱?

編輯:$BASH_VERSION的是3.2.57(1)-releaseMac OS X 10.10.2

編輯#2:我得出的結論是,這可能是這個版本中的一個錯誤。由於我管理多個 AWS 實例,因此我決定檢查它們,它們都有 bash 4.1.2(1)。我將我的 Mac 升級到了這個版本,現在可以使用了。感謝您的查看,但我將此歸因於異常情況。

答案1

如果想要循環遍歷數組的替代元素,這個應該在 bash 3.2 上工作:

while IFS= read -d '' -r name; do
  # do something with "$name"
done < <(printf %s%.0s\\0 "${array[@]}")

xargs -0如果更方便的話,您可以做類似的事情。

如果你的名字都不包含冒號(例如),你可以將名字提取到一個新數組中,如下所示:

IFS=: read -a names -r < <(printf %s%.0s: "${array[@]}")

(不幸的是,您不能將欄位分隔符號設為 NUL。)

所有這些都依賴於printf使用其所有參數所需的頻率重複其格式字串的事實(Posix 行為,因此它應該適用於任何 bash 版本,或使用非內建printf)。偶爾有用的格式%.0s使用一個參數並最多列印 0 個字符,也就是說將其放入位元桶中。

相關內容