這些選項似乎都不起作用。我究竟做錯了什麼? ( leapb
、leapc
和iyr
是整數值)
if [[ $leapb -eq $iyr && $leapc -ne $iyr ]]; then
leap=0
fi
或者,
if [[ $leapb -eq $iyr ]] && [[ $leapc -ne $iyr ]]; then
leap=0
fi
iyr=1979
當使用, leapb=1900
,運行此腳本時leapc=1600
,腳本未到達該leap=0
行,錯誤訊息指出-eq: unary operator expected
。
答案1
使用程式碼的簡化版本:
[[ $a -eq $b ]]
a
和的任何值都沒有錯誤b
,甚至是字串、空或未設定。
舊版[[
是[
,但即便如此,也正確引用:
[ "$a" -eq "$b" ]
a
只有當or中的值b
是字串(或空/未設定)時才會抱怨:
./script: line 13: [: StringInsideA: integer expression expected
這意味著您正在測試的實際程式碼同時使用[
和不是引用變數擴充(壞主意):
[ $a -eq $b ]
在這種情況下,如果a
為空/未設定而b
具有某些值(反之亦然),則報告的錯誤將是:
./script: line 14: [: -eq: unary operator expected
結論:請使用[[
測試版本(在bash、ksh、zsh中)。
邏輯
對於您報告的值:
理解如果leapb=1900
和iyr=1979
(即不等於)第一個測試失敗,leap=0
無論 的值leapc
是什麼,都永遠不會執行。
執行的唯一方法leap=0
是leapb=iyr
thenleapc
是不是等於iyr
。
更簡單
如果您只想偵測年份何時是閏年,請使用以下指令:
leap=$(( y>0 && ( y%4==0 && y%100>0 || y%400==0 ) ))
在此公式中,閏年為 1,否則為 0。
答案2
我無法重現bash
您的程式碼中的錯誤。對於給定的值,程式碼將無法達到leap=0
,因為$iyr
和$leapb
不相等。
但是,如果我這樣修改它:
if [ $leapb -eq $iyr ] && [ $leapc -ne $iyr ]; then
leap=0
fi
那麼這會產生
[: -eq: unary operator expected
if$leapb
是一個空字串。
使用[[ ... ]]
文法,測驗會默默地失敗。
相關閱讀: