如何通过当前 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 执行,命令组和重定向允许整个命令充当空操作。前面的代码在 zshbash.

中产生相同的输出

检查二元素数组的索引 1 元素:

detect_array_start_index() {
  local x=(1 0)                                                   
  echo ${x[1]}
}