我可以使用与 bash 和 zsh 相同的语法遍历关联数组的键吗
Can I loop over the keys of an associative array with the same syntax as bash and zsh
我想遍历关联数组的键,但我希望我的脚本在 zsh 和 bash 中工作。是否有一种方法(语法)可以在
中使用
我知道这个
zsh:
for k in "${(k)array[@]}" do echo $k; done
bash:
for k in "${!array[@]}" do echo $k; done
顺便说一句。我实际上使用 oh-my-zsh,所以我不能真正使用 emulate ksh
,因为它会使我的终端崩溃。
您可以将每个实现包装在一个函数中,并只定义适合当前的函数shell:
if [[ $ZSH_VERSION ]]; then
keys_for_array() {
local array= dest=
[[ && ]] || { echo "Usage: keys_for_array source-array dest-array" >&2; return 1; }
: ${(AP)dest::=${(kP)array}}
}
elif [[ $BASH_VERSION && ! $BASH_VERSION =~ ^([123][.]|4[.][012]) ]]; then
keys_for_array() {
[[ && ]] || { echo "Usage: keys_for_array source-array dest-array" >&2; return 1; }
local -n array= dest=
eval 'dest=( "${!array[@]}" )'
}
else
keys_for_array() { echo "ERROR: keys_for_array not available for this shell" >&2; return 1; }
fi
[[ $ZSH_VERSION ]] && typeset -A aa=( 1 one 2 two )
[[ $BASH_VERSION ]] && declare -A aa=( [1]=one [2]=two )
keys_for_array aa aak
declare -p aak
...当 bash 上的 运行 时,输出为:
declare -a aak=([0]="1" [1]="2")
...当在 zsh 上 运行 时,输出是:
typeset -a aak=( 1 2 )
在任何一种情况下,您都可以迭代它们:
keys_for_array aa aak
for key in "${aak[@]}"; do
echo "Key $key has value ${aa[$key]}"
done
请注意,上面的两个函数在两个 shell 中在句法上都是有效的。否则,可能需要使用 eval
或 source
仅有条件地拉入它们。就个人而言,我会创建两个单独的文件,同时包含 bash 和 zsh 版本的可移植性库,并且仅提供适合当前 shell.
的文件
我想遍历关联数组的键,但我希望我的脚本在 zsh 和 bash 中工作。是否有一种方法(语法)可以在
中使用我知道这个
zsh:
for k in "${(k)array[@]}" do echo $k; done
bash:
for k in "${!array[@]}" do echo $k; done
顺便说一句。我实际上使用 oh-my-zsh,所以我不能真正使用 emulate ksh
,因为它会使我的终端崩溃。
您可以将每个实现包装在一个函数中,并只定义适合当前的函数shell:
if [[ $ZSH_VERSION ]]; then
keys_for_array() {
local array= dest=
[[ && ]] || { echo "Usage: keys_for_array source-array dest-array" >&2; return 1; }
: ${(AP)dest::=${(kP)array}}
}
elif [[ $BASH_VERSION && ! $BASH_VERSION =~ ^([123][.]|4[.][012]) ]]; then
keys_for_array() {
[[ && ]] || { echo "Usage: keys_for_array source-array dest-array" >&2; return 1; }
local -n array= dest=
eval 'dest=( "${!array[@]}" )'
}
else
keys_for_array() { echo "ERROR: keys_for_array not available for this shell" >&2; return 1; }
fi
[[ $ZSH_VERSION ]] && typeset -A aa=( 1 one 2 two )
[[ $BASH_VERSION ]] && declare -A aa=( [1]=one [2]=two )
keys_for_array aa aak
declare -p aak
...当 bash 上的 运行 时,输出为:
declare -a aak=([0]="1" [1]="2")
...当在 zsh 上 运行 时,输出是:
typeset -a aak=( 1 2 )
在任何一种情况下,您都可以迭代它们:
keys_for_array aa aak
for key in "${aak[@]}"; do
echo "Key $key has value ${aa[$key]}"
done
请注意,上面的两个函数在两个 shell 中在句法上都是有效的。否则,可能需要使用 eval
或 source
仅有条件地拉入它们。就个人而言,我会创建两个单独的文件,同时包含 bash 和 zsh 版本的可移植性库,并且仅提供适合当前 shell.