2013-04-02 23 views
7

我有一个简单的bash脚本,simple.sh如下:为什么我无法将目录作为参数传递给bash中的for循环?

#/usr/local/bin/bash 
for i in $1 
    do 
     echo The current file is $i 
    done 

当我用下面的参数运行它:

./simple.sh /home/test/* 

它只会打印并列出的第一个文件位于在目录中。

但是,如果我改变我的simple.sh到:

#/usr/local/bin/bash 
DIR=/home/test/* 
for i in $DIR 
    do 
     echo The current file is $i 
    done 

,将正确的目录中打印出的文件。有人可以帮助解释为什么传递的参数不会显示相同的结果吗?

回答

8

如果你拿“$ 1”,它是第一个文件/目录,这是可能的! 你应该这样做了这种方式:

for i in "[email protected]" 
do 
    echo The current file is ${i} 
done 

如果你执行:

./simple.sh * 

他们列出你的实际字典中的所有文件

“$ 1”是按字母顺序排列的第一个文件/目录,在for循环中,“i”的值就是eg a1.sh然后他们会走出for循环! 如果你这样做:

DIR=/home/<s.th.>/* 

保存在目录中的所有文件/目录的价值!

+1

这应该是'“$ @”',因此它甚至适用于名称中带有空格的文件。 – Jens

+0

是的,当然这应该像“$ @”一样...... – Oni1

+0

并且使用'“$ i”',空白空间也保留在消息中。这是关于细节的一切:-) – Jens

-2

如何列表中的文件manully而不是使用*:

#/usr/local/bin/bash 
    for i in $(ls $1) 
    do 
     echo The current file is $i 
    done 

,并键入

./simple.sh /home/test/ 
+1

如果目录中的任何文件名都包含空格,则这将不起作用。 – chepner

1

这是因为便携,因为它得到,没有无用的叉LS和使用最小运行CPU的周期被浪费:

#!/bin/sh 
cd $1 
for i in *; do 
    echo The current file is "$i" 
done 

运行方式./simple.sh /home/test

+0

“最少CPU浪费”可能是C而不是bash,tbh ;-) – Kos

+0

不可以;而不是当编辑的碳足迹,呃,周期足迹被考虑时:-) – Jens

1

你的脚本没有收到“/ home/test/*”作为参数; shell将该模式扩展到匹配的文件列表,并且您的shell接收多个参数,每个匹配文件一个参数。报价参数将工作:

./simple.sh "/home/test/*" 

你改变使用DIR=/home/test/*做你所期望的,因为在变量赋值语句的RHS不执行文件名生成。当您在for循环中将$DIR未加引号时,该模式已展开为匹配文件列表。

相关问题