如何通过当前的zsh/bash shell检测数组的起始索引?

5
我们都知道在Bash中数组从0开始索引,在zsh中则从1开始索引。如果我无法确保运行环境是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

我有一个想法,就是找到固定数组中第一个值的索引,我找到了这个链接:获取Bash数组中值的索引,但是被接受的答案使用bash变量间接语法${!VAR[@]},在zsh中无效。


1
首先,不要期望相同的脚本在bashzsh下都能运行。 - chepner
2个回答

6

检查一个包含两个元素的数组中索引为1的元素:

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

4
你可以在 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中,前面的代码会产生相同的输出结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接