foo
考虑这样初始化的数组:
$ foo=( a b '' d e f g )
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
请注意,只有最后一个标记为 的形式才会"$foo[@]"
将其解释为 7 个单独的参数。
现在,假设我想print -rl -- ...
仅显示 的前 5 个元素foo
,每行一个元素?
这是行不通的:
$ print -rl -- "$foo[1,5]"
a b d e
也不是这个:
$ print -rl -- $foo[1,5]
a
b
d
e
我尝试过其他变体,但它们都无法产生所需的输出,即
a
b
d
e
full 的切片等效值是多少"$foo[@]"
?
如果不存在这样的等价物,如何创建一个bar
由 的前 5 个元素组成的数组foo
?
答案1
虽然zsh
在参数扩展时不会执行 split+glob,但它仍然会执行空删除,因此这仍然是您想要在那里引用变量的原因之一,因此:
print -rl -- "$var[@]"
或者
print -rl -- "${(@)var}"
这些@
都是为了获得"$@"
类似伯恩的行为。
对于元素 1 至 5:
print -rl -- "${(@)var[1,5]}"
-likeksh
变体也可以工作:
print -rl -- "${(@)var:0:5}"