zsh参数扩展

zsh参数扩展

我尝试使用参数扩展以列形式显示变量 fpath 的内容,但无法做到。

经过一番尝试和网页浏览后,我找到了另一个解决方案;这正是我想要的。这是:

print -C1 $fpath

但我仍然想知道如何以其他方式做到这一点。我得到的最接近的是:

echo ${fpath//' '/'\n'}

但我无法识别空白字符,因此“\n”替换永远不会发生。我尝试无济于事:

echo ${fpath// /'\n'}
echo ${fpath//'\t'/'\n'}

出于好奇,我想知道我做错了什么。

答案1

fpath是一个数组。您不应尝试将其降级为字符串,然后用换行符替换其中的字符。

使用ksh类似数组扩展语法:

$ printf '%s\n' "${fpath[@]}"
/usr/local/share/zsh/site-functions
/usr/share/zsh/site-functions
/usr/share/zsh/5.7.1/functions

与 一起zsh,您还可以使用"$fpath[@]""${(@)fpath}"

您还可以这样做:

$ printf '%s\n' $fpath
/usr/local/share/zsh/site-functions
/usr/share/zsh/site-functions
/usr/share/zsh/5.7.1/functions

但请注意,它会跳过数组的空元素(对于 来说可能不是问题$fpath)。

zshprint内置函数还可以使用该选项打印每行一个元素-l。就像内置函数ksh的来源一样print,您确实需要选择-r打印任意原始数据,因此:

print -rl -- $fpath

将相当于标准printf '%s\n'

它们与-C1when$fpath是一个空列表时不同,在这种情况下,print -rC1 -- $fpathwhile 不输出任何内容print -rlprintf '%s\n'输出一个空行,因此

print -rC1 -- "$array[@]"

可能是最接近您想要每行打印一个数组元素的内容,您可以在bash/中ksh编写:

[ "${#array[@]}" -eq 0 ] || printf '%s\n' "${array[@]}"

相关内容