假設我有以下代碼,其中is_wednesday一個函式在星期三回傳 0,在其他日子回傳 1。
print_wednesday() {
is_wednesday && local WEDNESDAY="Yes!" || local WEDNESDAY="No!"
echo "Is today Wednesday? $WEDNESDAY"
}
有沒有辦法給區域變數賦值會回傳 1,在這個例子中會導致在Is today Wednesday? No!星期三列印?
uj5u.com熱心網友回復:
是的,(簡單的、語法正確的)區域變數賦值可以回傳 false。特別是,如果變數已經readonly在代碼的其他地方宣告,或者declare -r在函式外部宣告,就會發生這種情況。這個Shellcheck -clean 程式演示了這個問題:
#! /bin/bash -p
readonly WEDNESDAY='No!'
function test_local_return_value
{
local WEDNESDAY='Yes!'
echo "'local' returned $?"
echo "WEDNESDAY='$WEDNESDAY'"
}
test_local_return_value
輸出看起來像:
...: line 7: local: WEDNESDAY: readonly variable
'local' returned 1
WEDNESDAY='No!'
這是一個嚴重的限制,local因為這意味著程式中其他地方的更改可能會破壞看起來完全獨立的功能。我在實踐中看到這種情況發生。readonly即使在函式中使用它也會創建全域只讀變數,這一事實使問題變得更糟。 readonly需要非常小心地使用。它不應該在函式中使用(local -r改為使用),并且最好有一個命名約定,以確保readonly變數名不會與其他變數名發生沖突。
該readonly問題在 Bashman頁面中有介紹(至少對于 Bash 4.4 版)。該部分local包括:“回傳狀態為 0,除非在函式外部使用 local、提供無效名稱或名稱是只讀變數”。
uj5u.com熱心網友回復:
區域變數賦值可以回傳false嗎?
內置local將:
2呼叫時回傳--help2用 invalid 呼叫時回傳-flags。1如果未在函式內呼叫則回傳0否則回傳- (或者整個 Bash 行程將終止,以防出現“記憶體不足”錯誤)
請注意,變數賦值(我的意思是,沒有local)將回傳上次執行的行程的退出狀態。以下將列印No:
true && WEDNESDAY="Yes$(false)" || WEDNESDAY="No"
echo "$WEDNESDAY"
有沒有辦法給區域變數賦值會回傳 1,在這個例子中這會導致列印今天星期三?不!在星期三?
不。
我會推薦:
- 與
local分配分開 - 不要使用
&& ||鏈,始終使用if. - 不要對區域變數使用大寫變數。
- 并按以下方式撰寫函式:
print_wednesday() {
local wednesday
if is_wednesday; then
wednesday="Yes"
else
wednesday="No"
fi
echo "Is today Wednesday? $wednesday!"
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/395830.html
