如何使用每行打印一个文件/目录列表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
我知道我可以用 来做到这一点ls -d1
,但也可以使用echo
吗?
echo
无论如何都不能用于输出任意数据,printf
而是使用POSIX 替换损坏的echo
实用程序来输出文本。你也可以这样做:
以 NUL 分隔记录输出列表(因此可以对其进行后处理;例如使用 GNU
xargs -r0
;请记住,换行符与空格或文件名中的任何字符一样有效)。在 POSIX 提出之前
printf
,ksh 已经有一个print
实用程序可以替换echo
。zsh 复制了它并添加了一个-l
选项来打印每行一个参数:ksh93 添加了类似打印的
-f
选项。也被复制,但不是其他 ksh 实现:print
printf
zsh
请注意,如果没有给出任何参数,所有这些仍然会打印一个空行。一个更好
println
的函数可以写成:在
zsh
:echo
仅使用空格来分隔它作为参数接收的字符串。由于您的问题被标记为bash,因此这里是
help echo
inbash
所说的(强调我的):在其他实现的文档中可以找到类似的声明。例如
echo
fromcoreutils
,你可能会在 GNU/Linux 上找到:如果您真的想
echo
在单独的行上打印文件名,则必须将它们作为单个字符串提供:在这里,我们利用了
*
特殊参数的行为:在双引号中,它扩展为一个单词,其中位置参数数组的元素使用IFS
变量的第一个字符(我们设置为换行符)连接起来。该
(...)
语法用于在子shell 环境中执行命令——我们通常不希望影响主shell。但是请注意,正如Stéphane 的回答
echo
中所述, all 的限制仍然适用,因此不建议在这种情况下使用它。