2017-04-14 81 views
-2

我是shell腳本的初學者,我試圖運行一個簡單的腳本,它使用locate命令來搜索用戶輸入的文件。我試圖實現一個if語句,如果找到任何具有該名稱的文件並返回true,並將其打印到命令行,但是我相信我的if語句中有錯誤?bash腳本 - if語句來檢查語句是否返回數據

#!/usr/bin/bash 
echo -n "Enter filename: " 
read fileToFind 

if [ -z $fileToFind ] 
then 
    echo "Error! No filename entered] 
else 
    fileSearch=`locate -i $fileToFind 

    if [ $fileSearch ] 
    then 
     echo $fileSearch 
    else 
     echo "No such file" 
    fi 
fi 
+1

請看看:http://www.shellcheck.net/ – Cyrus

回答

1

的主要問題是在這裏:

if [ $fileSearch ] 

locate發現多個配套文件,因爲[預計一個字符串,當你給它多串,這將導致一個錯誤。

爲了防止這種情況,引用變量:

if [ "$fileSearch" ] 

你應該處理所有變量,除非你知道一個事實,你不能。這裏是你的腳本的完整報價:

#!/usr/bin/bash 
echo -n "Enter filename: " 
read fileToFind 

if [ -z "$fileToFind" ]     # 1 
then 
    echo "Error! No filename entered" 
else 
    fileSearch=`locate -i "$fileToFind"` # 2 

    if [ "$fileSearch" ]     # 3 
    then 
     echo "$fileSearch"    # 4 
    else 
     echo "No such file" 
    fi 
fi 

#1和#2有助於搜索具有空格和特殊字符的文件。 #3確保您不會爲多個文件獲取錯誤。 #4防止在一行中寫出多個匹配。

+0

太棒了!感謝您的幫助,這是我在學習bash腳本時遇到的一個常見問題,就是正確使用引號。 – mmiller05

1

根據@賽勒斯的評論,我通過http://shellcheck.net運行您的代碼。這裏的結果:

#!/usr/bin/bash 
echo -n "Enter filename: " 
read -r fileToFind 

if [ -z "$fileToFind" ] 
then 
    echo "Error! No filename entered" 
else 
    fileSearch=$(locate -i "$fileToFind") 

    if [ "$fileSearch" ] 
    then 
     echo "$fileSearch" 
    else 
     echo "No such file" 
    fi 
fi 

注重語法高亮此網頁上。你的代碼中有很多紅色/洋紅色。這表明你還沒有在某個地方關閉報價。

現在你的問題:

我想實現一個if語句,如果任何文件 使用該名稱,發現返回true,它打印到命令行...

以下是您可能感興趣的樣式:如果執行的命令返回0退出代碼(即成功返回),則if語句將評估爲true。在查找的情況下(根據我在https://linux.die.net/man/1/locate的廣泛研究),找到返回文件時調用成功。 locate也會將結果輸出到命令行(或者linux中的stdout)。用

# other code omitted for focus/brevity 
    if 
     ! locate -i "$fileToFind" 
    then    
     echo "No such file" 
    fi 

在這種情況下,我已經否定了結果:所有的說,你可以重新寫你的,如果這樣的說法!所以,如果找不到文件,程序會輸出「No such file」。如果找到找到該文件,找到將只輸出它到標準輸出。

有寫這個代碼的一個稍微更簡潔的方式:

locate -i "$fileToFind" || echo "No such file" 

在上面的語句中,你所要求的bash評估邏輯或||具有短路邏輯。一旦表達式爲真,bash將停止執行語句。所以,在上面的例子中,如果locate成功並找到一個文件,bash將不會在||之後執行正確的表達式。這是一個很有趣的簡潔習語,但對其他人來說可能會更難理解。if語句通常更清楚地表達你的邏輯,並且它很好地遵守if。

+0

謝謝!這幫了很大的忙!我不知道你可以運行OR語句來完成它。在學習的時候我只是偶然發現了基本的if/else – mmiller05