Bash gibt basierend auf dem Grep-Ergebnis den Fehler „zu viele Argumente“ aus?

Bash gibt basierend auf dem Grep-Ergebnis den Fehler „zu viele Argumente“ aus?

Ich versuche also herauszufinden, ob die Maschine eine Batterie hat, und führe dann je nachdem, ob sie eine hat oder nicht, unterschiedliche Befehle aus. Das habe ich bisher herausgefunden:

upower -d >> /tmp/batstat
if [ grep -F BAT0 /tmp/batstat ]; then
    echo "BAT0 PRESENT" >> /tmp/batstat
else
    echo "NO BAT0" >> /tmp/batstat
fi

Dies gibt jedoch den Fehler „bash: [: zu viele Argumente“ zurück, während wie erwartet KEIN BAT0 in /tmp/batstat geschrieben wird. Das Ausführen nur des grep funktioniert ordnungsgemäß, daher verstehe ich nicht, warum es als if-Bedingung nicht funktioniert.

Wenn es eine bessere Möglichkeit gibt, eine Batterie zu überprüfen, bin ich dafür hundertprozentig offen.

Antwort1

if upower -d | grep -qF BAT0 ; then
   echo "BAT0 PRESENT"
else
   echo "NO BAT0"
fi

ifnimmt eine Reihe von Befehlen entgegen und arbeitet am Status des letzten Befehls. In diesem Fall gibt grep „ greptrue“ zurück, wenn eine Übereinstimmung vorliegt, andernfalls „false“.

Antwort2

grep -F BAT0 /tmp/batstatist in keiner Weise ein BEDINGTER AUSDRUCK (wie im Handbuch beschrieben) für das testeingebaute von bash. Da die Ausgabe von grepnicht verwendet wird, -qreicht die Option und das Verlassen auf den Exit-Code wahrscheinlich aus.

grep -F -q BAT0 batstat
if [[ $? -eq 0 ]]; then
    echo yea
else
    echo nay
fi

Außerdem /tmp/batstatist es wahrscheinlich eine sehr schlechte Wahl, insbesondere wenn ein böswilliger lokaler Benutzer Zugriff hat. Erwägen Sie stattdessen die Verwendung vonmktemp(1), oder die Datei wird nicht unter gefunden /tmp.

verwandte Informationen