Answers:
首先,我假设使用ls
只是一个例子。您无法解析ls
任何shell 的输出,因为它的模棱两可。请阅读为什么这对您来说不是新闻,为什么您不应该解析ls(1)的输出。在任何外壳程序中,要获取文件列表,请使用通配符,例如files=(*)
。
在zsh中,就像在其他shell中一样,命令替换的结果被拆分为空格字符处的单词(更确切地说,根据的值IFS
)。(与其他shell不同,命令替换的结果在zsh中不受限制。)因此,如果ls
命令的输出为
hello world
wibble
然后files=($(ls))
设置files
数组包含3个元素:hello
,world
和wibble
。
如果命令替换用双引号引起来,则不执行拆分。您可以使用参数扩展标志执行自定义拆分。使用该@
标志指示拆分结果将是一个数组(奇怪的是"${(@)…}"
,即使双引号的字符串将扩展为多个单词,也需要将扩展名保持在双引号中)。对于拆分,请使用s
标志,例如"${(@s:,:)…}"
以逗号拆分;该f
标志仅在换行符处分割。
files=("${(@f)$(ls)}")
请注意,通常for f in $files[@]
,遍历数组的正确方法是,因为$files
它会剥离空元素(在这里,这并不重要,因为元素不会为空)。
print $f
$f
如果以a开头并以-
扩展反斜杠,则解释为switch $f
。使用print -r -- $f
,或者print -rn -- $f
如果您不想在字符串后添加换行符。
(…)
元素是必需的,因此它files
是一个数组而不是字符串(它将包含命令中各行的串联,撤消了的分割(f)
)。2.使用foo=$'one\n\nthree', contrast
print -rl $ {(f)foo}`和print "${(@f)foo}"
。需要双引号来保留空行,您不会从中得到空行,ls
但是其他命令可能会出现空行。