2014-03-07 21 views
0

我正在嘗試比較兩個目錄,然後在確定兩個文件之間有什麼不同之後更新日誌文件,但我不斷收到錯誤消息,指出它需要行中的整數結果[if $ userinput -eq $ userinput。日誌]。有沒有辦法比較這兩個我缺少的?這是我寫的腳本。如何比較兩個目錄來更新BASH中的日誌文件?

userinput=$1 
if [ ! -d "$userinput" ]; 
then 
     echo "Usage: dirlog.sh directory_name" 1>&2 
     exit 0 
else 
     if [ ! -f "$userinput.log" ]; 
     then 
       ls -l > $userinput.log 
       echo ".logfile created for $userinput" 
     elif [ -f "$userinput.log" ]; 
     then 
       if [ $userinput -eq $userinput.log ]; #if they are different 
       then 
         differences=diff -rq $userinput $userinput.log 
         for file in $differences 
         do 
           echo "$file missing from directory $userinput" 
         done 
       else 
         echo "no files missing from directory $userinput" 
       fi 
       #Update this no matter what 
       ls -l > $userinput.log 
       echo "logfile updated for directory $userinput" 
     fi 
fi 

回答

0

您可以使用diff -r命令比較兩個目錄。這將向您顯示所有不同的文件,哪些文件從一個目錄丟失到另一個目錄。 --brief選項或--summary選項將只列出差異而不是文件的內容。

現在,你if [ $userinput -eq $userinput.log ]; ...

在外殼中,變量可以容納的數字或可容納字母數字數據。讓我們像這樣:

foo="0456" 
bar="456" 

在上面,$foo$bar可能是字符串或數字。如果我把它們看作數字,它們是平等的。但是,如果他們是字符串,他們不是平等的。

再舉一例:

foo="123" 
bar="45" 

哪個更大?同樣,這取決於是否將$foo$bar視爲字符串或數字。如果我用數字來對待它們,$foo就更大。但是,如果我將它們視爲文本字符串,$bar會更大,因爲$bar的第一個字符4位於$foo,1的第一個字符之後。

那麼,bash如何知道我是否需要數字或字符串比較?簡單來說,Bash爲我提供了兩套不同的比較運算符。一個是串,一個是文本:

    String Numeric 
        ------ ------- 
Equals    =  -eq 
Greater Than   >  -gt 
Less Than    <  -lt 
Not equals   !=  -ne 
Greater Than/Equals >=  -ge 
Less Than/Equals  <=  -le 

在你的情況,你要比較兩個字符串,然後你使用-eq。這就是爲什麼你會得到運算符期望數字結果的錯誤。順便說一句,如果你使用Bash或Kornshell,你應該繼續使用加倍的方括號[[ ... ]]。這些都是不容易出錯,並有幾個不錯的功能,例如模式匹配:

if [[ $userinput == "$userinput.log" ]] 

不過,我真的建議你使用他diff -r --brief命令用於比較兩個目錄。