Ich führe das folgende Skript aus, das mir einen Fehler mit einem unären Operatorproblem ausgibt. Im Haupt-Shell-Skriptprogramm werde ich diese Variable existing_sum_check später verwenden, aber ich möchte diese Prüfung trotzdem durchführen. Wie kann ich diesen Fehler vermeiden?
Programm:
#!/bin/sh
latest_sum_check=10101;
if [ $latest_sum_check != $EXISTING_SUM_CHECK ]; then
EXISTING_SUM_CHECK = $latest_sum_check;
echo $EXISTING_SUM_CHECK;
echo "Please process";
else
echo "Do not process"
fi
Antwort1
Sie haben im Wesentlichen [ something != $bar ]
.
Wenn $bar
leer ist, wird daraus if [ something != ]
, was natürlich nicht funktioniert, da der Gleichheitstest zwei Operanden erfordert. Zumindest Bashs test
/ [
hat jedoch eine witzige Art, dies auszudrücken: anscheinend prüft es die Anzahl der Argumente und da es nur zwei gibt, erwartet es, dass das erste ein unärer Operator ist. Da something
es aber keins gibt, beschwert es sich.
Setzen Sie also Anführungszeichen um die Variablen:
if [ "$latest_sum_check" != "$EXISTING_SUM_CHECK" ]; then ...
Und dies führt einen Befehl EXISTING_SUM_CHECK
mit dem Gleichheitszeichen und allem, was sich aus der Erweiterung der Variablen ergibt, als Parameter aus:
EXISTING_SUM_CHECK = $latest_sum_check;
Variablenzuweisungen in der Shell benötigen keine Leerzeichen um sie herum.
Antwort2
Dies ist ein Fehlerzustand Ihres Tests aufgrund einer nicht deklarierten Variable $EXISTING_SUM_CHECK. Sie sollten eine weitere Prüfung durchführen, wie etwa:
if [ -z $EXISTING_SUM_CHECK ]; then
EXISTING_SUM_CHECK=$latest_sum_check
elif [ $latest_sum_check != $EXISTING_SUM_CHECK ]; then
Hierbei wird eine unäre Operation verwendet, um zu prüfen, ob die Zeichenfolge die Länge Null hat. != erfordert, dass beide Seiten des Tests einen nicht leeren Wert haben.
Eine andere Möglichkeit zur Lösung dieses Problems kann sein:
if [ "X${latest_sum_check}" != "X${EXISTING_SUM_CHECK}" ]; then
Dies erzwingt, dass beide Werte mindestens den Wert X haben, wenn die Variable nicht gesetzt oder null oder „“ ist.
Beachten Sie außerdem, dass beim Vergleichen zweier Zahlen normalerweise -ne gegenüber != empfohlen wird, da != für Zeichenfolgen reserviert ist. -ne funktioniert jedoch nur für Ziffern [0-9] und nicht für hexadezimale Vergleiche wie MD5-Sum-Ergebnisse.