Jak problém vyřešit
Shell (nebo test
příkaz) používá =
pro rovnost řetězce a -eq
pro číselnou rovnost. Některé verze shellu podporují ==
jako synonymum pro =
(ale =
je definováno POSIX test
příkaz). Naproti tomu Perl používá ==
pro číselnou rovnost a eq
pro rovnost řetězce.
Musíte také použít jeden z testovacích příkazů:
if [ "$a" = "AC adapter : online" ]
then echo "ONLINE"
else echo "OFFLINE"
fi
Nebo:
if [[ "$a" = "AC adapter : online" ]]
then echo "ONLINE"
else echo "OFFLINE"
fi
S [[
operátor, můžete vypustit uvozovky kolem "$a"
.
Proč se vám zobrazila chybová zpráva
Když jsi napsal:
if $a -eq "AC adapter : online"
shell to rozbalil na:
if AC adapter : online -eq "AC adapter : online"
což je požadavek na provedení příkazu AC
s 5 zobrazenými argumenty a porovnejte stav ukončení příkazu s 0 (považujte 0 – úspěch – za pravdivé a vše nenulové za nepravdu). Je zřejmé, že nemáte příkaz s názvem AC
ve vašem systému (což není příliš překvapivé).
To znamená, že můžete napsat:
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
Pokud chcete otestovat řetězce, musíte použít test
nebo [[ ... ]]
operátor. test
příkaz je stejný jako [
příkaz kromě toho, když je název příkazu [
, poslední argument musí být ]
.
Porovnání vložte do hranatých závorek a přidejte uvozovky kolem $a
:
if [ "$a" == "AC adapter : online" ]; then
...
Bez hranatých závorek bash
pokusí se provést výraz a vyhodnotit návratovou hodnotu.
Může být také dobré dát substituci příkazu do dvojitých uvozovek:
a="$(acpitool -a)"
Zkuste prosím toto -
#!/bin/bash
a="$(acpitool -a)"
echo "$a"
if [ "$a" == 'AC adapter : online' ]
then
echo "ONLINE"
else
echo "OFFLINE"
fi
Vysvětlení: -eq
se používá hlavně pro ekvivalenci pro celočíselné výrazy. Takže, ==je správná cesta! A použijte dvojité uvozovky přes $a nebo $(acpitool -a), abyste zabránili dělení slov. Argument uzavřený do dvojitých uvozovek se prezentuje jako jedno slovo, i když obsahuje oddělovače mezer.