考虑数组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
?
尽管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)