Come posso usare un confronto grep di file all'interno di un'istruzione bash if / else?


138

Quando viene visualizzato il nostro server, dobbiamo controllare un file per vedere come è configurato il server.

Vogliamo cercare la seguente stringa all'interno del nostro file /etc/aws/hosts.conf:

MYSQL_ROLE=master

Quindi, vogliamo testare se quella stringa esiste e usare un'istruzione if / else per eseguire una delle due opzioni a seconda che la stringa esista o meno.

Qual è la sintassi BASH per l'istruzione if?

if [ ????? ]; then
  #do one thing
else
  #do another thing
fi

Risposte:


205

Da grep --help, ma vedi anche man grep :

Lo stato di uscita è 0 se è stata selezionata una linea, 1 altrimenti; se si verifica un errore e non è stato fornito -q, lo stato di uscita è 2.

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then
  echo exists
else
  echo not found
fi

Potresti voler usare una regex più specifica, ad esempio ^MYSQL_ROLE=master$, per evitare quella stringa nei commenti, nomi che iniziano semplicemente con "master", ecc.

Questo funziona perché if prende un comando e lo esegue e utilizza il valore restituito di quel comando per decidere come procedere, con zero che significa vero e diverso da zero significa falso, lo stesso di come gli altri codici di ritorno vengono interpretati dalla shell, e l'opposto di una lingua come C.


> con zero che significa vero e diverso da zero significa falso, lo stesso di come gli altri codici di ritorno vengono interpretati dalla shell e l'opposto di un linguaggio come C. ma perché l'opposto ....?
— kchoi,

Perché uno zero viene generalmente interpretato come "nessun errore", mentre qualsiasi altra cosa significa "qualche errore". Se assume, vogliamo sapere se il comando è stato completato correttamente.
— timer

33

ifaccetta un comando e controlla il suo valore di ritorno. [è solo un comando.

if grep -q ...
then
  ....
else
  ....
fi

23

Si noti che, per PIPEessere qualsiasi comando o sequenza di comandi, quindi:

if PIPE ; then
  # do one thing if PIPE returned with zero status ($?=0)
else 
  # do another thing if PIPE returned with non-zero status ($?!=0), e.g. error
fi 

Per la cronaca, [ expr ]è una scorciatoia integrata † per test expr.

Poiché greprestituisce con lo stato 0 in caso di corrispondenza e lo stato diverso da zero in caso di nessuna corrispondenza, è possibile utilizzare:

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 

Nota l'uso di -lcui importa solo che il file abbia almeno una corrispondenza (in modo che grepritorni non appena trova una corrispondenza, senza continuare inutilmente ad analizzare il file di input.)

† su alcune piattaforme [ expr ]non è un builtin, ma un eseguibile vero e proprio /bin/[(il cui argomento ultima sarà ]), che è il motivo per cui [ expr ]dovrebbe contenere spazi intorno alle parentesi quadre, e perché deve essere seguito da uno dei separatori di elenco dei comandi ( ;, &&, ||, |, &, nuova linea)


4
-lè ridondante, grepritorna immediatamente dopo aver trovato una corrispondenza con-q
— Reinstate Monica Please,

3

usa bash

while read -r line
do
  case "$line" in
    *MYSQL_ROLE=master*)
       echo "do your stuff";;
    *) echo "doesn't exist";;      
  esac
done <"/etc/aws/hosts.conf"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.