如何通过当前 shell (zsh/bash) 检测数组起始索引?
How to detect array start index by current shells (zsh/bash)?
我们都知道 Bash 中的数组是从零开始索引的,而 zsh 中是从一开始索引的。
如果我不能确保 运行 环境是 bash、zsh 或其他东西,脚本如何知道它应该使用 0 或 1?
预期代码示例:
#!/bin/sh
detect_array_start_index(){
# ... how?
echo 1
}
ARR=(ele1 ele2)
startIndex=$(detect_array_start_index) # 0 or 1
for (( i=${startIndex}; i < ${#ARR[@]} + $startIndex; i++ )); do
echo "$i is ${ARR[$i]}"
done
我的想法是找到固定数组中第一个值的索引,我得到了这个:Get the index of a value in a Bash array,但接受的答案使用 bash 变量间接语法 ${!VAR[@]}
, 这在 zsh 中是无效的。
您可以在 zsh
中设置 KSH_ARRAYS
选项以强制数组索引从 0 开始。
{ setopt KSH_ARRAYS || : ; } 2> /dev/null
ARR=(ele1 ele2)
for ((i=0; i < ${#ARR[@]}; i++ )); do
echo "$i is ${ARR[$i]}"
done
如果从 bash
执行,命令组和重定向允许整个命令充当空操作。前面的代码在 zsh
和 bash
.
中产生相同的输出
检查二元素数组的索引 1 元素:
detect_array_start_index() {
local x=(1 0)
echo ${x[1]}
}
我们都知道 Bash 中的数组是从零开始索引的,而 zsh 中是从一开始索引的。
如果我不能确保 运行 环境是 bash、zsh 或其他东西,脚本如何知道它应该使用 0 或 1?
预期代码示例:
#!/bin/sh
detect_array_start_index(){
# ... how?
echo 1
}
ARR=(ele1 ele2)
startIndex=$(detect_array_start_index) # 0 or 1
for (( i=${startIndex}; i < ${#ARR[@]} + $startIndex; i++ )); do
echo "$i is ${ARR[$i]}"
done
我的想法是找到固定数组中第一个值的索引,我得到了这个:Get the index of a value in a Bash array,但接受的答案使用 bash 变量间接语法 ${!VAR[@]}
, 这在 zsh 中是无效的。
您可以在 zsh
中设置 KSH_ARRAYS
选项以强制数组索引从 0 开始。
{ setopt KSH_ARRAYS || : ; } 2> /dev/null
ARR=(ele1 ele2)
for ((i=0; i < ${#ARR[@]}; i++ )); do
echo "$i is ${ARR[$i]}"
done
如果从 bash
执行,命令组和重定向允许整个命令充当空操作。前面的代码在 zsh
和 bash
.
检查二元素数组的索引 1 元素:
detect_array_start_index() {
local x=(1 0)
echo ${x[1]}
}