邏輯

邏輯

這些選項似乎都不起作用。我究竟做錯了什麼? ( leapbleapciyr是整數值)

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=1900iyr=1979(即不等於)第一個測試失敗,leap=0無論 的值leapc是什麼,都永遠不會執行。

執行的唯一方法leap=0leapb=iyrthenleapc不是等於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是一個空字串。

使用[[ ... ]]文法,測驗會默默地失敗。

相關閱讀:

相關內容