在基本的“shell”中,如何將字串比較的結果放入布爾變數中?
考慮:
isweekday() {
w=$(date %w)
if [[ $w == "0" ]] || [[ $w == "6" ]]; then
false
else
true
fi
}
人們可以爭論它是否會更清晰,但是有沒有一種方法可以將“if”運算式的結果分配給布爾變數,例如
isweekday() {
w=$(date %w)
wd=<boolean result of [[ $w == "0" ]] || [[ $w == "6" ]]>
return $wd
}
經過一些實驗,我離我想要的更近了,但它仍然不是我想要的:
isweekday() {
w=$(date %w)
[[ $w == "0" ]] || [[ $w == "6" ]]
}
這有效并且不需要條件,但它看起來是錯誤的,但是如果你這樣做:
if isweekday; then
echo 'weekday'
fi
你會得到正確的結果。這似乎是因為“真”的退出代碼是 0,而“假”的退出代碼是 1(不太清楚為什么會這樣......)
uj5u.com熱心網友回復:
沒有布爾變數。所有 shell 變數都是字串(盡管用于將它們解釋為整數以進行基本比較等和基本算術的設施有限)。
退出代碼 0 為成功保留;所有其他退出代碼(最多 255 個)表示錯誤(盡管一些非標準工具使用此工具通過約定來傳達非錯誤結果;然后假定呼叫者理解并同意這種臨時使用退出代碼)。
那么,對于您似乎在問的問題,最簡單的答案可能是保存退出代碼。它暴露在變數中$?。但很多時候,您不需要明確檢查它的值;實際上,您的最終isweekday代碼看起來是迄今為止最慣用和最自然的,并[[隱式回傳此代碼。
我不明白你為什么認為你的最終代碼“看起來不對”;這正是您在條件中使用函式的方式。
然而,從某種意義上說,case這里的陳述句看起來不那么雜亂(但由于其他原因,這種語法一開始有點刺耳,直到你習慣了它)。
is_weekday () {
case $(date %w) in
0 | 6) return 1;;
esac
return 0
}
這可移植到 POSIX sh,與您使用的 Bash-only [[...]]語法不同。或許也可以看看和之間的區別shbash
uj5u.com熱心網友回復:
Shell 中的標準方法是使用命令的退出代碼作為真/假值,其中零表示真,非零表示假。另外,我會改為定義一個函式來測驗今天是否是周末,因為可以這么說是例外。將w定義為區域變數并參考在一般情況下可能包含空格或未定義的所有變數也是一個好主意,這可能會導致變數擴展后出現語法錯誤。這是我的建議:
IsWeekend()
{
local w="$(date %w)"
[ "$w" = 0 ] || [ "$w" = 6 ]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/456724.html
