切片包含空字符串的数组

kjo*_*kjo 3 zsh array

考虑数组foo,初始化如下:

$ foo=( a b '' d e f g )
Run Code Online (Sandbox Code Playgroud)

foo 包含 7 个元素,其中一个是空字符串。

以下是foo使用print内置函数打印出 内容的几种方法:

$ print -rl -- $foo
a
b
d
e
f
g
$ print -rl -- "$foo"
a b  d e f g
$ print -rl -- $foo[@]
a
b
d
e
f
g
$ print -rl -- "$foo[@]"
a
b

d
e
f
g
Run Code Online (Sandbox Code Playgroud)

请注意,只有最后一个标记是的形式将其"$foo[@]"解释为 7 个单独的参数。

现在,假设我想print -rl -- ...只显示 的前 5 个元素foo,每行一个元素?

这行不通:

$ print -rl -- "$foo[1,5]"
a b  d e
Run Code Online (Sandbox Code Playgroud)

也不是这个:

$ print -rl -- $foo[1,5]
a
b
d
e
Run Code Online (Sandbox Code Playgroud)

我尝试过其他变体,但它们都无法产生所需的输出,即

a
b

d
e
Run Code Online (Sandbox Code Playgroud)

full 的切片等价物是"$foo[@]"什么?

如果不存在这样的等价物,我如何创建一个bar由 的前 5 个元素组成的数组foo

Sté*_*las 5

尽管zsh在参数扩展时不会执行 split+glob,但它仍然会移除空值,因此这仍然是您要在此处引用变量的原因之一,因此:

print -rl -- "$var[@]"
Run Code Online (Sandbox Code Playgroud)

或者

print -rl -- "${(@)var}"
Run Code Online (Sandbox Code Playgroud)

那些@是为了获得类似伯恩"$@"的行为。

对于元素 1 到 5:

print -rl -- "${(@)var[1,5]}"
Run Code Online (Sandbox Code Playgroud)

ksh样变型也将工作:

print -rl -- "${(@)var:0:5}"
Run Code Online (Sandbox Code Playgroud)