2013-08-20 112 views
1

我使用bash真/假瞎搞,我發現了一些不規範:Bash「布爾值」默認爲true?

$ if $varible_i_have_never_set_before; then echo yes; fi 
yes 

擊空的變量似乎評估爲true。通常未初始化的布爾值本質上是錯誤的,至少在大多數現代編程語言中是這樣。對此有沒有很好的解釋?有沒有什麼辦法獲得所需的功能,缺少字符串比較?

+0

@ IgnacioVazquez-Abrams:看看[接受的答案](http://stackoverflow.com/a/8973170/827263);它涵蓋了這個問題的案例。 –

+0

第一個問題幾乎是重複的,但沒有人回答第二個問題。我應該完全拋棄這種構造還是顛覆我所有的邏輯?這兩個選項聽起來都不好玩 – apottere

+0

在許多語言中,使用未初始化的變量會產生未指定的結果或導致未定義的行爲。具有未設置變量的「if」被視爲真實條件的事實是奇怪的。我建議的解決辦法是;不要這樣做。你可以將變量設置爲'true'或'false'(所以'如果$ var;那麼...'調用相應的內置命令),或者你可以使用一個明確的比較,比如'if [「$ var 「=」true「];那麼...'。 –

回答

5

您誤解了if的功能。它不檢查內容的參數,它檢查命令的返回值。由於變量中沒有值,因此沒有任何運行。而且,看起來很奇怪,這個運行的任何東西的返回值都是0,if認爲是真的。

0

我想象內部Bash函數調用命令是。

int call_command(char * command, char ** args, int argc) 
{ 
    int r = 0; ## default, should actually be just u8. 
    char * external_path = 0; 
    if (command) { 
     if (is_function(command)) { 
      r = call_function(command, args, argc); 
     } 
     else if (is_builtin(command)) { 
      r = call_builtin(command, args, argc); 
     } 
     else if ((external_path = check_if_external_command_and_get_absolute_path(command))) { 
      r = call_external(external_path, args, argc); 
     } 
     else { 
      printf("bash: %s: command not found\n", command); 
      r = 127; 
     } 
    } 
    return r; 
}