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但是其他命令可能会出现空行。