Como uso uma comparação de grep de arquivo dentro de uma instrução bash if / else?

138

Quando nosso servidor é instalado, precisamos verificar um arquivo para ver como o servidor está configurado.

Queremos procurar a seguinte string dentro do nosso arquivo /etc/aws/hosts.conf:

MYSQL_ROLE=master

Em seguida, queremos testar se essa cadeia existe e usar uma instrução if / else para executar uma das duas opções, dependendo da existência ou não da cadeia.

Qual é a sintaxe do BASH para a instrução if?

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

Respostas:

205

De grep --help, mas também veja man grep :

O status de saída é 0 se alguma linha foi selecionada, 1 caso contrário; se ocorrer algum erro e -q não tiver sido fornecido, o status de saída será 2.

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

Você pode usar um regex mais específico, como ^MYSQL_ROLE=master$ , para evitar essa sequência nos comentários, nomes que simplesmente começam com "mestre" etc.

Isso funciona porque o if pega um comando e o executa, e usa o valor de retorno desse comando para decidir como proceder, com zero significando verdadeiro e diferente de zero significando falso - o mesmo que outros códigos de retorno são interpretados pelo shell, e o oposto de uma linguagem como C.


fonte
> com zero significando verdadeiro e diferente de zero significando falso - o mesmo que como outros códigos de retorno são interpretados pelo shell e o oposto de uma linguagem como C. mas por que o oposto ....?
kchoi
Como um zero é normalmente interpretado como "sem erro", enquanto qualquer outra coisa significa "algum erro". Se assume que queremos saber se o comando foi concluído com sucesso.
timelmer
33

iftoma um comando e verifica seu valor de retorno. [é apenas um comando.

if grep -q ...
then
  ....
else
  ....
fi
Ignacio Vazquez-Abrams
fonte
23

Observe que, por PIPEser qualquer comando ou sequência de comandos, então:

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 

Para o registro, [ expr ]é um shell embutido abreviação de test expr.

Como grepretorna com status 0 no caso de uma correspondência e status diferente de zero no caso de nenhuma correspondência, você pode usar:

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

Observe que o uso -lapenas se importa com o fato de o arquivo ter pelo menos uma correspondência (para que grepretorne assim que encontrar uma correspondência, sem continuar desnecessariamente analisando o arquivo de entrada).

em algumas plataformas [ expr ]não é um embutido, mas um executável real /bin/[(cujo argumento último será ]), razão pela qual [ expr ]deve conter espaços em branco ao redor dos colchetes, e por que deve ser seguido por um da lista de comando separadores ( ;, &&, ||, |, &, nova linha)

vladr
fonte
4
-lé redundante, grepretorna imediatamente após encontrar qualquer correspondência com-q
Reinstate Monica Please
3

basta usar o 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"
ghostdog74
fonte