2010-10-13 50 views
7

在bash腳本關鍵字「if」如何測試值是否爲false?

if [ 1 ] 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

輸出:Yes

它代表 '1' 被視爲真值。

但在代碼:

word = Linux 
letter = nuxi 
if echo "$word" | grep -q "$letter" 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

輸出:無

echo "$word" | grep -q "$letter"將返回1,爲什麼結果是如何被命令返回的關鍵字if測試值後第

if

+0

您可能會發現[我的答案在這裏(http://stackoverflow.com/questions/3869072/test-for-non-zero-length-string-in-bash-n-var-or-var/3870055#3870055)是有用的。 – 2010-10-13 14:38:32

回答

8

檢查命令的返回值。 [ 1 ]返回值爲0(true)。任何其他返回值(如1)都表示出現錯誤。

true 
echo $? 
# returned 0 
false 
echo $? 
# returned 1 
echo $? 
# returned 0 as the last executed command is 'echo', and not 'false' 
+0

啊,是不是因爲'['是shell內建的,它在完成測試函數時會返回0? – 2010-10-13 13:39:37

+0

看起來'0'是一個表達式,其值爲'true'。 '[0 = 1]'返回值爲'1'(期望值),'[0 = 0]'返回值爲'0'。運行'man test'以獲取更多關於'test'(aka''' – Lekensteyn 2010-10-13 13:58:44

+3

'[1]'或[[0])的信息,因爲'test' /'[''帶有單個參數只是檢查參數字符串(這裏'1'或'0')是非空的。喵'[「」]'將是錯誤的。 – Dummy00001 2010-10-13 22:36:59

0

這是因爲grep的失敗找到$詞$字母,因此退出代碼爲1。每當:

可以使用$?變量顯示最後執行的命令的返回值在linux中的一個進程返回一個非0的代碼,那就意味着它失敗了。 0表示成功退出。您可以通過echo "Linux" | grep -d "nuxi"; echo $?

驗證此問題另一方面,在編寫腳本的世界中,0表示錯誤,1表示正確。所以grep找不到這個單詞,並且把1作爲退出代碼發送給if,並將其作爲一個真正的值。

7

在unix土地上,0爲真,1爲假。

爲了您的第一個例子:

if [ 1 ] 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

「如果」檢查給定命令的退出代碼爲真/假(即零/非零)。

方括號實際上調用「測試」命令(請參閱「man test」以獲取更多信息)並將退出代碼賦予if。

「測試1」(或確實是「測試any_string」)返回true(0),所以輸出「是」。

對於第二個例子,這會輸出「No」,因爲在Linux中找不到「nuxi」,如果將「nuxi」更改爲「nux」(也許這是一個錯字?),並刪除周圍的空格那麼你會得到你期望的行爲。例如

word=Linux 
letter=nux 
if echo "$word" | grep -q "$letter" 
then 
    echo "Yes" 
else 
    echo "No" 
fi