如何防止“for”分割目录名?

我试图用“for”循环列出所有隐藏的目录:

for i in ``ls -a | grep '^\.'` `; do echo $i done 

问题是循环将一些目录名分成两部分。

例如: ls -a | grep '^\.' ls -a | grep '^\.' 给我

 . .. .Deleted Items .Drafts .Junk .Junk E-mail .Sent .Sent Items .Trash 

但是我的循环给了我:

 . .. .Deleted Items .Drafts .Junk .Junk E-mail .Sent .Sent Items .Trash 

我如何改进我的脚本,使其不会分割目录名称?

你不需要使用ls命令,shell会为你做扩展,你应该引用这个variables

 for i in .*/ do echo "$i" done 

除非特别需要'for',否则你可以尝试一下while循环:

 ls -d .* | while read Name do echo "$Name" done 

周围有很多方法,从查find额外引用等等。

就我个人而言,我觉得修改IFSvariables很有用。 IFS用于确定for的列表项之间的中断字符等。 因此,通过IFS=$'\n'将IFS设置为换行符。 这将使for循环读取,直到一行input的结束,在其列表中开始一个新的项目。 这可能不是解决这个问题最简单的方法,(Iain的答案更优雅),但是我发现它在很多情况下都非常有用。

前几天我碰到类似的问题, 这个线程是非常有帮助的。 希望你在那里find灵感。