Comment résoudre le problème
Le shell (ou le test
commande) utilise =
pour l'égalité des chaînes et -eq
pour l'égalité numérique. Certaines versions du shell supportent ==
comme synonyme de =
(mais =
est défini par le POSIX test
commande). En revanche, Perl utilise ==
pour l'égalité numérique et eq
pour l'égalité des chaînes.
Vous devez également utiliser l'une des commandes de test :
if [ "$a" = "AC adapter : online" ]
then echo "ONLINE"
else echo "OFFLINE"
fi
Ou :
if [[ "$a" = "AC adapter : online" ]]
then echo "ONLINE"
else echo "OFFLINE"
fi
Avec le [[
opérateur, vous pouvez supprimer les guillemets autour de "$a"
.
Pourquoi vous avez reçu le message d'erreur
Lorsque vous avez écrit :
if $a -eq "AC adapter : online"
le shell l'a étendu à :
if AC adapter : online -eq "AC adapter : online"
qui est une requête pour exécuter la commande AC
avec les 5 arguments affichés, et comparez l'état de sortie de la commande avec 0 (en considérant 0 - succès - comme vrai et tout ce qui n'est pas nul comme faux). De toute évidence, vous n'avez pas de commande appelée AC
sur votre système (ce qui n'est pas très surprenant).
Cela signifie que vous pouvez écrire :
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
Si vous voulez tester des chaînes, vous devez utiliser le test
commande ou le [[ ... ]]
opérateur. Le test
la commande est la même que le [
commande sauf que lorsque le nom de la commande est [
, le dernier argument doit être ]
.
Mettez la comparaison entre crochets et ajoutez des guillemets doubles autour du $a
:
if [ "$a" == "AC adapter : online" ]; then
...
Sans les crochets bash
essaie d'exécuter l'expression et d'évaluer la valeur de retour.
Il peut également être judicieux de mettre la substitution de commande entre guillemets :
a="$(acpitool -a)"
Veuillez essayer ceci -
#!/bin/bash
a="$(acpitool -a)"
echo "$a"
if [ "$a" == 'AC adapter : online' ]
then
echo "ONLINE"
else
echo "OFFLINE"
fi
Explication : -eq
est principalement utilisé pour l'équivalence des expressions entières. Donc, ==est la voie à suivre ! Et, utilisez des guillemets doubles entre $a ou $(acpitool -a) pour empêcher le fractionnement des mots. Un argument entre guillemets doubles se présente comme un seul mot, même s'il contient des séparateurs blancs.