*
是否有变量?
当我echo *
时,它会在一行中列出我的工作目录。如何强制此命令在单独的行上打印每个项目?
答案 0 :(得分:10)
执行此操作的正确方法是完全抛弃不可移植echo
printf
:
printf '%s\n' *
然而,printf(和echo)方式有一个缺点:如果命令不是内置的并且有很多文件,那么扩展*
可能会溢出命令行的最大长度(您可以使用getconf ARG_MAX
进行查询。从而,
要列出文件,请使用为作业设计的命令:
ls -1
没有这个问题;甚至
find .
如果你需要递归列表。
答案 1 :(得分:3)
echo
命令本身不能这样做。
如果你想在自己的行上打印每个文件名,我想你想要对输出做些什么,而不仅仅是阅读它。如果你告诉我们这是什么,我们可以更有效地帮助你。
要列出当前目录中的文件,您可以使用ls -1
。如果{1}}命令的输出被重定向到文件或通过管道,则每行打印一个名称。
另一种选择是ls
命令。如果你给它的参数多于格式字符串中指定的参数,它将循环显示格式,所以这个:
printf
每行还会打印一个文件名。
答案 2 :(得分:2)
" *" - 不是变量。它被称为通配符或文件名扩展 - bash本身扩展了wilcards并用文件名替换它们。所以*将被替换为当前目录中所有非隐藏项的列表。 如果您只想打印当前目录中的项目列表 - 您可以使用ls。此外,如果你想使用" echo" - 你可以这样做:
for item in *
do
echo $item
done
它将在单独的行上打印每个项目。
有关bash globbing的更多详细信息,请点击此处: http://www.tldp.org/LDP/abs/html/globbingref.html