Logik

Logik

Keine dieser Optionen scheint zu funktionieren. Was mache ich falsch? ( leapb, leapcund iyrsind ganzzahlige Werte)

if [[ $leapb -eq $iyr && $leapc -ne $iyr ]]; then
  leap=0
fi

Alternative,

if [[ $leapb -eq $iyr ]] && [[ $leapc -ne $iyr ]]; then
  leap=0
fi

iyr=1979Wenn dies mit , leapb=1900, ausgeführt wird leapc=1600, erreicht das Skript die Zeile nicht leap=0und es wird die Fehlermeldung angezeigt -eq: unary operator expected.

Antwort1

Mit einer vereinfachten Version Ihres Codes:

[[ $a -eq $b ]]

Es tritt kein Fehler auf, wenn die Werte aund b, auch nicht als Zeichenfolgen, leer oder nicht festgelegt sind.

Eine ältere Version von [[lautet [, aber selbst das lautet, richtig zitiert:

[ "$a" -eq "$b" ]

Beschwert sich nur, wenn der Wert darin aoder bein String ist (oder leer/nicht festgelegt):

./script: line 13: [: StringInsideA: integer expression expected

Das bedeutet, dass der eigentliche Code, den Sie testen, [sowohlnichtZitieren der Variablenerweiterungen (schlechte Idee):

[ $a -eq $b ]

In diesem Fall wird der folgende Fehler gemeldet , wenn aes leer/nicht gesetzt ist, aber einen bestimmten Wert hat (oder umgekehrt):b

./script: line 14: [: -eq: unary operator expected

Fazit: Bitte verwenden Sie die [[Testversion (während Sie in Bash, Ksh, Zsh sind).

Logik

Für die Werte, die Sie melden:

Verstehen Sie, dass wenn leapb=1900und iyr=1979(das istnicht gleich) schlägt der erste Test fehl und leap=0wird nie ausgeführt, unabhängig vom Wert leapc.

Der einzige Weg, um zur Ausführung zu gelangen, leap=0ist das leapb=iyrund dann leapcistnichtgleich iyr.

einfacher

Wenn Sie lediglich feststellen möchten, wann ein Schaltjahr ist, verwenden Sie Folgendes:

leap=$(( y>0 && ( y%4==0 && y%100>0 || y%400==0 ) ))

In dieser Formel beträgt der Schaltwert 1 für Schaltjahre und 0 für alle anderen Jahre.

Antwort2

Ich kann den Fehler in bashIhrem Code nicht reproduzieren. Mit den angegebenen Werten würde der Code nicht erreichen, leap=0da $iyrund $leapbnicht gleich sind.

Wenn ich es jedoch folgendermaßen ändere:

if [ $leapb -eq $iyr ] && [ $leapc -ne $iyr ]; then
    leap=0
fi

dann würde dies ergeben

[: -eq: unary operator expected

wenn $leapbes sich um eine leere Zeichenfolge handelt.

Mit der [[ ... ]]Syntax würde der Test jedoch stillschweigend fehlschlagen.

Weiterführende Literatur:

verwandte Informationen