Shell-Script
如何迭代zsh中的數組索引?
在 bash 中,我們可以像這樣遍歷數組的索引
~$ for i in "${!test[@]}"; do echo $i; done
其中 test 是一個數組,比如說,
~$ test=(a "b c d" e f)
使輸出看起來像
0 1 2 3
但是,當我在 zsh 中執行相同操作時,會出現錯誤:
➜ ~ for i in "${!test[@]}"; do echo $i; done zsh: event not found: test[@]
到底是怎麼回事?
在 zsh 中迭代索引的正確方法是什麼?
zsh
數組是與大多數其他 shell 和語言一樣的普通數組,它們不像 ksh/bash 關聯數組中的鍵限制為正整數(又名稀疏數組)。zsh
具有用於關聯數組的單獨變數類型(鍵是 0 或更多字節的任意序列)。因此,普通數組的索引始終是從 1 到數組大小的整數(假設未啟用 ksh 兼容性,在這種情況下,數組索引從 0 而不是 1 開始)。
所以:
typeset -a array array=(a 'b c' '') for ((i = 1; i <= $#array; i++)) print -r -- $array[i]
雖然通常,您會遍歷數組成員,而不是遍歷它們的索引:
for i ("$array[@]") print -r -- $i
(與
"$array[@]"
相比,語法$array
保留空元素)。或者:
print -rC1 -- "$array[@]"
將所有元素傳遞給命令。
現在,要遍歷關聯數組的鍵,語法是:
typeset -A hash hash=( key1 value1 key2 value2 '' empty empty '' ) for key ("${(@k)hash}") printf 'key=%s value=%s\n' "$key" "$hash[$key]"
(再次
@
使用用於保留空元素的內部引號)。儘管您也可以將鍵和值都傳遞給命令:
printf 'key=%s value=%s\n' "${(@kv)hash}"
有關 Bourne-like shell 中各種數組設計的更多資訊,請參閱測試 shell 的數組支持