2017-08-11 49 views
2

這個腳本將創建一個名爲「Happy」的文件,我無法弄清楚爲什麼有人可以嘗試這個腳本並告訴我發生了什麼? 謝謝!Bash腳本創建一個文件,它不應該是

#!/bin/bash 

str1="" 
str2="Sad" 
str3="Happy" 

if [ "$str2">"$str3" ] 
    then echo "$str2 is greater than $str3" 
elif [ "$str2"<"$str3" ] 
    then echo "$str2 is less than $str3" 
fi 
+4

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

+4

您正在將命令$ str2的輸出重定向到一個名爲$ str3的文件。在這種情況下'''不是比較而是重定向。 – user8153

+0

@Cyrus感謝您的鏈接,它自動發現問題,好工具 – oNion

回答

3

[是用於test命令只是一個(傻)別名;它後面的所有內容(包括強制關閉])都是一個爭論。 (你有什麼一樣對待if test "$str2">"$str3"。)

這裏有兩個問題:

  1. 操作數和運營商需要以空格隔開。

    # still not quite right, but ... 
    if [ "$str2" > "$str3" ] 
    
  2. 由於><被shell解釋爲重定向操作符,它們必須被轉義,以便它們作爲參數傳遞給[

    if [ "$str2 \> "$str3" ] 
    

(你可能會認爲只是逃避運營商就足夠了;但是,"$str2"\>"$str3"將被視爲一個單一的字符串參數test而不是三個獨立的論據test將其解釋爲一個表達式test "$str2"\>"$str3"會只需檢查單個參數是否爲空)。

由於您使用的是bash,因此使用[[而不是[要簡單得多。 [[不是常規命令;它是由bash識別的特殊語法,因此正常的處理規則不適用。這裏最重要的是>是一個字符串比較運算符,而不是重定向運算符,所以它不需要轉義。

if [[ $str2 > $str3 ]] 
+0

@ slevy1該頁面上沒有任何內容與我所說的相矛盾。 ''''不需要在[[]]或'(())'內部轉義,因爲它們都是特殊的shell構造,不受正常的解析和評估規則的約束。事實上,該頁面*明確指出''''和'<'在作爲字符串比較運算符與'['使用時需要轉義。 – chepner

+0

@chepner謝謝!那回答了我的問題 – oNion

2

如果重寫代碼如下:

#!/bin/bash 

    str1="" 
    str2="Sad" 
    str3="Happy" 

    if [[ "$str2" > "$str3" ]] 
     then echo "$str2 is greater than $str3" 
    elif [[ "$str2" < "$str3" ]] 
     then echo "$str2 is less than $str3" 
    fi 

那麼,比較正確的應該發生,你能避免意外的文件的創建。額外的一對「[」和「]」將代碼從測試上下文中提取出來,以便進行比較並避免創建文件。更多信息here其中規定以下內容:

請注意,「>」需要在[]構造內轉義。 ... 請注意,「<」需要在[]結構中轉義。

的原因是,在測試情況下,即使用僅單個一對方括號如OP代碼,「>」和「<」被解釋爲redirection operators。因此,「>」意思是將命令的輸出引導至文件,而「<」意味着向命令提供輸入,而不是分別意味着大於和小於。

+1

謝謝!網站也很好,書上有標註 – oNion

相關問題