So beheben Sie das Problem
Die Shell (oder die test
Befehl) verwendet =
für Stringgleichheit und -eq
für numerische Gleichheit. Einige Versionen der Shell unterstützen ==
als Synonym für =
(aber =
wird durch den POSIX test
definiert Befehl). Im Gegensatz dazu verwendet Perl ==
für numerische Gleichheit und eq
für String-Gleichheit.
Sie müssen auch einen der Testbefehle verwenden:
if [ "$a" = "AC adapter : online" ]
then echo "ONLINE"
else echo "OFFLINE"
fi
Oder:
if [[ "$a" = "AC adapter : online" ]]
then echo "ONLINE"
else echo "OFFLINE"
fi
Mit dem [[
Operator, könnten Sie die Anführungszeichen um "$a"
herum weglassen .
Warum Sie die Fehlermeldung erhalten haben
Als Sie geschrieben haben:
if $a -eq "AC adapter : online"
die Shell hat es erweitert zu:
if AC adapter : online -eq "AC adapter : online"
Dies ist eine Aufforderung zur Ausführung des Befehls AC
mit den 5 angezeigten Argumenten und vergleichen Sie den Beendigungsstatus des Befehls mit 0 (betrachten Sie 0 – Erfolg – als wahr und alles, was nicht Null ist, als falsch). Offensichtlich haben Sie keinen Befehl namens AC
auf Ihrem System (was nicht sehr überraschend ist).
Das heißt, Sie können schreiben:
if grep -q -e 'some.complex*pattern' $files
then echo The pattern was found in some of the files
else echo The pattern was not found in any of the files
fi
Wenn Sie Zeichenfolgen testen möchten, müssen Sie den test
verwenden Befehl oder den [[ ... ]]
Operator. Die test
Befehl ist derselbe wie [
Befehl, außer wenn der Befehlsname [
ist , muss das letzte Argument ]
sein .
Setzen Sie den Vergleich in eckige Klammern und setzen Sie doppelte Anführungszeichen um die $a
:
if [ "$a" == "AC adapter : online" ]; then
...
Ohne die eckigen Klammern bash
versucht den Ausdruck auszuführen und den Rückgabewert auszuwerten.
Es kann auch eine gute Idee sein, die Befehlsersetzung in doppelte Anführungszeichen zu setzen:
a="$(acpitool -a)"
Bitte versuchen Sie dies -
#!/bin/bash
a="$(acpitool -a)"
echo "$a"
if [ "$a" == 'AC adapter : online' ]
then
echo "ONLINE"
else
echo "OFFLINE"
fi
Erklärung: -eq
wird hauptsächlich zur Äquivalenz für ganzzahlige Ausdrücke verwendet. Also, ==ist der richtige Weg! Verwenden Sie außerdem doppelte Anführungszeichen zwischen $a oder $(acpitool -a), um eine Worttrennung zu verhindern. Ein in doppelte Anführungszeichen eingeschlossenes Argument stellt sich als einzelnes Wort dar, auch wenn es Leerzeichen als Trennzeichen enthält.