bash 將如何計算以下程式碼

bash 將如何計算以下程式碼

這個問題有兩個部分:

(a) 了解被截斷的程式碼正在做什麼

(b) 理解兩者之間的區別退出狀態返回狀態在 的背景下bash

這是我試圖理解的程式碼片段:

if var=-2 && (( var+=2 ))
then
    echo "True"
else
    echo "False"
fi

運行這個會產生False.我不明白為什麼會發生這種情況。

如果我理解正確的話,這種情況可能會發生if

(a)var=-2建立退出狀態 0,因為分配成功

(b)(( var+=2 ))將 的值加 2 var,表達式的計算結果為零。因此本學期的退出狀態為 1

if(c) 0 && 1 建立 0 的存在狀態,然後由構造使用

這個if構造應該簡單地檢查退出狀態,當它為零時,它需要然後小路。在上面的步驟 (c) 中,它為零,但腳本仍然採用別的小路。這是理解這一點的正確方法嗎?

另外,我不斷看到各種bash文字使用退出狀態返回狀態可以互換。

我懷疑var=-2分配會有任何類型的退出狀態,因為它不是一個程式。但任何對兩者之間差異的澄清都會很棒。

答案1

那是:

if
  first list of commands
then
  second list of commands
else
  third list of commands
fi

這是如果第一個命令列表返回時運行第二個命令列表真的/成功(零)退出狀態,即最後執行的命令返回的退出狀態為零。

在:

var=-2 && ((var += 2))

這是只有成功後才會運作的cmd1 && cmd2地方。cmd2cmd1

var=-2

只要$var尚未設為唯讀,通常就會成功,因此((var += 2))將執行該命令:

((arithmetic expression))

退貨成功/真的只要表達式計算正確(無語法錯誤)且表達式的結果非零。

  • ((123)), ((1 + 1)),((1 == 1))返回真
  • ((0)), ((-2 + 2)),((2 == -2))返回假。
  • ((4294967296 * 4294967296))由於 64 位元整數換行,在大多數 shell 中傳回 false

var += 2作為算術表達式,執行賦值並解析為被賦值的值,此處為 0,因此錯誤的退出狀態。

您可以使用算術擴充語法查看基於退出狀態的值$((...))

$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0

或將其分配給變數:

$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0

$?包含上一個指令的退出狀態。if///而言,0 表示 true then,其他值表示 false elsefi

這裡的混亂來自於這樣一個事實:對於算術表達式,它是相反的:0意味著假,而其他任何東西都意味著真(例如,2 == 2is 1while 2 < 1is 0)。

為了避免擔心差異,只需忘記$?及其可能的值。只需用布林值來思考真的/錯誤的,成功/失敗

 grep -q foo file

foo如果在 中找到則傳回 true file

 [ "$a" = "$b" ]

$a如果包含與 相同的內容,則傳回 true $b

 ((6 * 3 - 12))
 ((4 == 1))

如果算術表達式的結果是非零數字,則傳回 true。

那些是否並不重要真的/錯誤的以這些grep/[命令或((...))構造的退出狀態 0 或 1 表示。

答案2

if(c) 0 && 1 建立 0 的存在狀態,然後由構造使用

那裡有錯誤。 0 && 1 結果為1.請記住,這不是 C 或 Java。在 shell 中 0 && 1 是你從 得到的true && false

$ true; echo $?
0
$ false; echo $?
1
$ true && false; echo $?
1

另外,我不斷看到各種 bash 文字交替使用退出狀態和返回狀態。

它們是可以互換的。您要記住的是,0表示成功,不0表示失敗。它與大多數程式語言相反,即0false 和1true。

答案3

一切都按預期進行。

if var=-2 && (( var+=2 ))
then
    echo "True"
else
    echo "False"
fi

代碼解釋:-

if var=-2 && (( var+=2 ))

var=-2 => true 值非零,因此評估為 true

var+=2 => false 值為零,因此評估為 false

這就像

if true && false

根據邏輯計算真 && 假 => 假

在這種情況下,這是我們的最終程式碼

if (false)
then
    echo "True"
else
    echo "False"
fi

相關內容