2013-02-28 76 views
2

美好的一天, 我正在创建一个脚本来读取路径的子文件夹/目录的一个级别。该脚本是像这样:如何在bash中传递一个包含空格的变量作为循环参数?

#loopdir.sh 
for i in `ls -d $1` 
do 
echo $i 
done 

但是当我试图用它来读/媒体/我\护照/时,它读取参数作为两个不同的迪尔斯:

$ ./loopdir.sh /media/My\ Passport/ 
ls: cannot access /media/My: No such file or directory 
Passport/ 
+0

其他裁判:http://linux.byexamples.com/archives/314/how-to-list-just-directories-the-correct-way/ – kepinpin 2013-02-28 10:01:41

+0

谢谢@kepinpin不接受我错误的答案,现在,我可以删除它... :-) – anishsane 2016-02-19 14:22:39

回答

5

尝试,而不是做这个(我的理解是,要列出子目录,我说得对不对?):

for i in "$1"/*; do 
    echo "${i%/}" 
done 

解析ls输出是坏主意:这是一个交互式查看文件信息的工具。它的输出格式为人类,并会导致脚本中的错误。使用globs或找到。了解原因:http://mywiki.wooledge.org/ParsingLs

(最后但并非最不重要):使用更多的报价!他们至关重要。另外,了解'之间的区别“和`见http://mywiki.wooledge.org/Quoteshttp://wiki.bash-hackers.org/syntax/words

+2

我想再次解析ls的这种考虑。它被广为人知的包含黑魔法,可以打破你在做什么。 – L0j1k 2013-02-28 10:11:24

1

你需要围绕您$i引号:echo "$i"

+0

对不起,我刚试过,没有骰子,输出仍然是: ls:无法访问/ media /我:没有这样的文件或目录 护照/ – kepinpin 2013-02-28 09:04:54

+0

为什么反斜杠在您的文件名? – L0j1k 2013-02-28 09:07:46

+0

这会打扰我整晚。 – L0j1k 2013-02-28 09:15:01

0

没有$ I

这将通过利用空间

打破 ”$ I“

+1

在尝试遍历'ls'的输入后引用变量为时已晚。 – chepner 2013-02-28 13:27:24

相关问题