GNU/Linux >> Znalost Linux >  >> Linux

Převeďte výstup na řetězec

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.


Linux
  1. Ukládání výstupu příkazu do proměnné Shell?

  2. Převést výstup příkazu stromu do formátu Json?

  3. Výstup kterého příkazu použitého pro vstup na CD?

  1. Příklady příkazů času Linux

  2. Příklady příkazů tee v Linuxu

  3. Převeďte řetězec na hexadecimální na příkazovém řádku

  1. Jak uložit výstup příkazu do souboru v Linuxu

  2. Převeďte textový řetězec v bash na pole

  3. Přesměrování výstupu příkazu v dockeru