
這個問題有兩個部分:
(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
地方。cmd2
cmd1
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 else
。fi
這裡的混亂來自於這樣一個事實:對於算術表達式,它是相反的:0
意味著假,而其他任何東西都意味著真(例如,2 == 2
is 1
while 2 < 1
is 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
表示失敗。它與大多數程式語言相反,即0
false 和1
true。
答案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