如何在 Unix 中强制 "echo *" 在不同的行上打印项目?

How to force "echo *" to print items on separate lines in Unix?

* 有变数吗? 当我执行 echo * 时,它会在一行中列出我的工作目录。我如何强制此命令在单独的行上打印每个项目?

* - 不是变量。它被称为 globbingfilename expansion - bash 本身扩展通配符并用文件名替换它们。因此 * 将替换为当前目录中所有非隐藏项目的列表。

如果您只想打印当前目录中的文件列表 - 您可以使用 ls。另外,如果你想使用 echo - 你可以这样做:

for item in *
do
    echo $item
done

它将在单独的行上打印每个项目。

有关 bash globbing 的更多详细信息,您可以在此处找到: http://www.tldp.org/LDP/abs/html/globbingref.html

正确的做法是完全放弃不可移植的 echo,转而使用 printf:

 printf '%s\n' *

然而,printf(和echo)方式有一个缺点:如果命令不是内置的并且有很多文件,扩展*可能会溢出命令行的最大长度(您可以使用 getconf ARG_MAX 查询)。因此, 要列出文件,请使用专为作业设计的命令:

ls -1

哪个没有这个问题;甚至

find .

如果你需要递归列表。

echo 命令本身无法做到这一点。

如果您想将每个文件名打印在各自的行中,我想除了阅读它之外,您还想对输出做一些事情。如果您告诉我们那是什么,我们可能会更有效地帮助您。

要列出当前目录中的文件,可以使用ls -1。如果 ls 命令的输出被重定向到一个文件或通过管道,它也会每行打印一个名称。

另一种选择是 printf 命令。如果您给它的参数多于格式字符串中指定的参数,它将循环显示格式,因此:

printf '%s\n' *

还将每行打印一个文件名。