2014-02-09 42 views
1

我想寫一個bash腳本來檢查一個文件是否是一個有效的文件。 這是我使用的代碼。使用ls -f來過濾文件輸出

echo "Select your file" 
read $TEST_FILE 

for file in `ls $TEST_FILE`; do 
    if [ -f $TEST_FILE ]; then 
     echo "$TEST_FILE is a regular file" 
    fi 
done 

但我得到的結果是這樣的。

is a regular file 
is a regular file 
is a regular file 
is a regular file 
is a regular file 

當我僅指定特定文件時,它列出目錄中的所有文件。我希望它能夠爲這1個文件吐出一個結果。

我該怎麼做?

謝謝!

+3

爲什麼使用'for'循環? –

+0

最初,我想先列出目錄中的所有文件。如果我刪除for循環,那麼我如何將ls -f放入if語句中? – user233699

回答

1

如果你想檢查只是一個文件,下面應該工作:

test -f <the-file-path> && echo "regular file" 

如果您要檢查目錄中的普通文件,你應該遵循以下:

echo "Select your file" 
read TEST_FILE 

for fil in `ls $TEST_FILE`; do 
    if [ -f $TEST_FILE/$fil ]; then 
     echo "$TEST_FILE/$fil is a regular file" 
    fi 
done 
+1

工程。非常感謝! – user233699

4

首先,您使用的變量與read不正確 - 不要使用$ - 只有在使用$指的是變量的現有值,而不是賦值一個值;而不是:

echo "Select your file" 
read TEST_FILE 

如果假設是$TEST_FILE是單一的,文本文件名,那麼你不需要for循環都:

if [[ -f $TEST_FILE ]]; then 
    echo "$TEST_FILE is a regular file" 
fi 

如果假設是$TEST是文件名模式,以下幾點:

for f in $TEST_FILE; do 
    if [[ -f $f ]]; then 
     echo "$f is a regular file" 
    fi 
done 

請注意,我使用的是更搶用於測試的結構非常靈活,而不是[...]結構。

有感

的OP提到-f標誌ls,這導致(潛在地,取決於文件系統)未排序輸出也包括開頭的條目.

相反,具有glob(文件名模式)的for循環總是擴展爲排序的條目(據我所觀察)。 此外,爲了使glob匹配以.開頭的條目,必須設置dotglob shell選項(shopt -s dotglob)。

+0

感謝您在閱讀後指出$。用你給出的兩個代碼,它不會吐出回聲..當我插入一個絕對路徑被讀取時,它只是結束腳本。 – user233699

+1

它現在的作品!謝謝! – user233699

+0

@ user233699:不客氣,也請參閱我剛剛添加的後續操作。如果我的答案解決了您的問題,請點擊旁邊的複選標記;如果它至少包含_helpful information_,請點擊向上箭頭將其投票。這將幫助其他人更快地找到有用的信息(並提高我的聲譽)。 – mklement0