我尝试使用参数扩展以列形式显示变量 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
)。
zsh
的print
内置函数还可以使用该选项打印每行一个元素-l
。就像内置函数ksh
的来源一样print
,您确实需要选择-r
打印任意原始数据,因此:
print -rl -- $fpath
将相当于标准printf '%s\n'
。
它们与-C1
when$fpath
是一个空列表时不同,在这种情况下,print -rC1 -- $fpath
while 不输出任何内容print -rl
并printf '%s\n'
输出一个空行,因此
print -rC1 -- "$array[@]"
可能是最接近您想要每行打印一个数组元素的内容,您可以在bash
/中ksh
编写:
[ "${#array[@]}" -eq 0 ] || printf '%s\n' "${array[@]}"