2013-08-01 56 views
1

我想查找FileName_trojan.sh,FileName_virus.sh,FileName_worm.sh類型的所有文件。如果找到任何這樣的文件,則顯示一條消息。括號擴展 - 表達式太多

這裏FileName是傳遞給腳本的參數。

#!/bin/bash 
file=$1 
if [ -e "$file""_"{trojan,virus,worm}".sh" ] 
then 
echo 'malware detected' 

我試過使用括號擴展,但它沒有工作。我得到錯誤「太多的論據」 我該如何解決它?我可以只用OR條件嗎?

而且,這也不行 -

-e "$file""_trojan.sh" -o "$file""_worm.sh" -o "$file""_virus.sh" 

回答

2

-e操作者可以只取一個參數;在將參數傳遞給-e之前擴展了大括號擴展,所以還有兩個額外的參數。您可以使用一個循環:

for t in trojan virus worm; do 
    if [ -e "{$file}_$t.sh" ]; then 
     echo "malware detected" 
    fi 
do 

或馬克建議之前,我可以輸入完成它:

for f in "${file}_"{trojan,virus,worm}.sh; do 
    if [ -e "$f" ]; then 
     echo "malware detected" 
    fi 
done 
+0

甚至'對於F中的 「$ {文件}」 _ {木馬,病毒,蠕蟲} .SH;如果[-e「$ f」];然後回顯「檢測到惡意軟件」;網絡連接;完成' –

+0

Jinx。你欠我一杯可樂:) – chepner

+0

順便說一句,爲什麼我們在{$ file} _ $ t.sh中有大括號。我們不能只使用$文件。我試了一下,我得到一個錯誤。 – Steam

1

的問題是不與擴展,它的工作確定。問題出在-e測試:它只需要一個參數,而不是三個。

可能的解決方法:

i=0 
for f in "$1"_{trojan,virus,worm}.sh ; do 
    [ -e "$f" ] && ((i++)) 
done 
if ((i)) ; then 
    echo Malware detected. 
fi