我有以下声明:
TOKENARRAY=($TOKEN)
$TOKEN
是一个数值变量。
如果我尝试这样做:
echo ${TOKENARRAY[0]}
它显示一个空字符串。
如果我做:
echo ${TOKENARRAY:0}
它向我展示了令牌
但真正奇怪的是,如果我这样做:
echo ${TOKENARRAY[1]}
它向我展示了令牌。
这是怎么回事?这个脚本应该在 bash 中运行,但在 zsh 中却不能运行。
答案1
对于在 bash 和 zsh 中都可以运行的脚本,您需要使用更复杂的语法。
例如,引用数组中的第一个元素:
${array[@]:0:1}
这里,array[@]
是所有元素,0
是偏移量(即总是以 0 为基数),1
是所需元素的数量。
答案2
这种行为可能会让您感到惊讶,这取决于您的编程背景,但这是所期望的。
从man zshparam
关于形式来看${TOKENARRAY[exp]}
:
形式为的下标
[exp]
选择单个元素 exp,其中 exp 是一个算术表达式,它将像被 包围一样进行算术扩展$((...))
。 元素的编号从 1 开始,除非设置了 KSH_ARRAYS 选项,在这种情况下它们从零开始编号。
该语法${TOKENARRAY:0}
记录在man zshexpn
:
${name:offset}
(...) 正偏移量始终被视为名称中的字符或元素与数组的第一个字符或元素的偏移量(这与本机 zsh 下标符号不同)。 因此,无论选项 KSH_ARRAYS 的设置如何,0 都指的是第一个字符或元素。
所以这在原则上给了你完全的数组(不仅仅是第一个元素),从第一个字符开始。
因此,当你声明
该脚本应该在 bash 中运行,但它不能在 zsh 中运行。
您可能需要emulate sh
在脚本中考虑,除了其他选项之外还启用 KSH_ARRAY 选项(emulate -l sh
为您提供列表)或只是setopt KSH_ARRAYS
。