2013-04-02 15 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未加引號時,該模式已展開爲匹配文件列表。

相關問題