Emm*_*maV 5 bash echo bash-expansion
如何使用 打印每行一个文件/目录列表echo?
我可以用换行符替换空格,但如果文件名包含空格,这将不起作用:
$ echo small*jpg
small1.jpg small2.jpg small photo 1.jpg small photo 2.jpg
$ echo small*jpg | tr ' ' '\n'
small1.jpg
small2.jpg
small
photo
1.jpg
small
photo
2.jpg
Run Code Online (Sandbox Code Playgroud)
我知道我可以做到这一点ls -d1,但也可以使用echo吗?
Sté*_*las 15
echo无论如何都不能用于输出任意数据,printf而是使用它是损坏的echo实用程序的 POSIX 替换来输出文本。
printf '%s\n' small*jpg
Run Code Online (Sandbox Code Playgroud)
你也可以这样做:
printf '%s\0' small*jpg
Run Code Online (Sandbox Code Playgroud)
以 NUL 分隔的记录输出列表(因此可以对其进行后处理;例如使用 GNU xargs -r0;请记住,换行符与空格或文件名中的任何字符一样有效)。
在 POSIX 出现之前printf,ksh 已经有一个print实用程序可以替换echo. zsh 复制了它并添加了一个-l选项来打印每行一个参数:
print -rl -- small*jpg
Run Code Online (Sandbox Code Playgroud)
ksh93 添加了一个-f选项以print进行printf类似打印。也被复制zsh,但不是其他 ksh 实现:
print -f '%s\n' -- small*jpg
Run Code Online (Sandbox Code Playgroud)
请注意,如果没有给出任何参数,所有这些仍然打印一个空行。一个更好println的函数可以写成:
println() {
[ "$#" -eq 0 ] || printf '%s\n' "$@"
}
Run Code Online (Sandbox Code Playgroud)
在zsh:
println() print -rC1 -- "$@"
Run Code Online (Sandbox Code Playgroud)