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.