2017-10-05 47 views
1

考慮一個簡單的腳本:遍歷目錄中的文件沒有工作

#!/bin/bash 
DIR="$1" 

for f in "$DIR"; do 
    if [[ "$f" == "*.txt" ]]; 
    then 
     echo "Filename is $f" 
fi 
done 

我只想與.txt擴展名的文件返回。通過以下方式調用腳本:

./script1 /home/admin/Documents 

不返回任何內容。沒有錯誤,只是空白。哪裏不對?

回答

5

我假定您希望遍歷您傳遞的目錄中的所有文件。要做到這一點,你需要改變你的循環:

for file in "$1"/* 

值得一提的是,for沒有任何內置行爲枚舉目錄中的項目,它只是在你傳遞單詞列表迭代它。由shell擴展的*是循環遍歷文件列表的結果。

你的條件將需要修改太多,因爲*需求是報價之外(其餘不需要在裏面他們,要麼):

if [[ $f = *.txt ]] 

但你可避免需要有條件通過在.txt結尾的文件直接循環:

for file in "$1"/*.txt 

您可能還需要考慮在沒有比賽的情況下,在這種情況下,我想你è指示循環不運行。在bash中做到這一點的一種方法是:

# failing glob expands to nothing, rather than itself 
shopt -s nullglob 

for file in "$1"/*.txt 
    # ... 
done 

# unset this behaviour if you don't want it in the rest of the script 
shopt -u nullglob 
+0

我真的不得不嘲笑'如果[[$ f = * .txt]]''。所有這些年和淚水。 ++ –

+0

@詹姆斯這些年你幹什麼不一樣? –

+0

基本上關於'「$ {f ##。}」=「txt」'等等。 –