Keine dieser Optionen scheint zu funktionieren. Was mache ich falsch? ( leapb
, leapc
und iyr
sind 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=1979
Wenn dies mit , leapb=1900
, ausgeführt wird leapc=1600
, erreicht das Skript die Zeile nicht leap=0
und 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 a
und 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 a
oder b
ein 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 a
es 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=1900
und iyr=1979
(das istnicht gleich) schlägt der erste Test fehl und leap=0
wird nie ausgeführt, unabhängig vom Wert leapc
.
Der einzige Weg, um zur Ausführung zu gelangen, leap=0
ist das leapb=iyr
und dann leapc
istnichtgleich 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 bash
Ihrem Code nicht reproduzieren. Mit den angegebenen Werten würde der Code nicht erreichen, leap=0
da $iyr
und $leapb
nicht 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 $leapb
es sich um eine leere Zeichenfolge handelt.
Mit der [[ ... ]]
Syntax würde der Test jedoch stillschweigend fehlschlagen.
Weiterführende Literatur: