Como usar uma variável de shell especial em instruções If then

0

Sou relativamente novo em scripts e quero aprender como verificar os valores de $? para verificar se o comando grep foi bem-sucedido, Se o comando grep é não bem-sucedido , e para ecoar uma mensagem que inclua os valores de $ name .   Como posso conseguir isso, estou ciente de que posso usar uma instrução If e uma variável de shell especial, mas não sei a sintaxe adequada. Eu tentei no código abaixo.

name=$1
         if [ "$name" =  "" ]
         then  echo -n "Name 'DBS' is not in directory"
            read name
         fi

grep -i $name mike ~admin/dbs/email
grep -i goodman ~admin/dbs/passwd
    
por Katz 02.12.2015 / 06:21

2 respostas

2

Aqui está uma sintaxe bastante típica. Poderia fazer mais algumas verificações de erros, mas dentro do escopo do que você está procurando fazer, acredito que isso o ajudará no caminho certo:

#!/bin/bash

file=/etc/hosts

if [ -z "$1" ]; then
    echo Usage: $0 name 1>&2
    exit 2
fi

if grep -q "$1" $file ; then
    echo "$file" contains $1
else
    echo "$file" doesn\'t contain $1
fi

Notas

  • O primeiro test ( if [ -z "$1" ]; then ... ) é verdadeiro se $1 (primeiro argumento de linha de comando) for uma cadeia vazia (ou não foi fornecida).
  • A linha Usage: é enviada para stderr com 1>&2
  • A saída de grep está oculta (exceto na saída de erro, o que você provavelmente desejaria ver), já que neste caso só queremos saber se ela foi bem-sucedida (correspondência encontrada) ou não.
    • grep tem um parâmetro -q que silencia toda a saída, que é a melhor escolha aqui, mas nem todos os comandos têm uma opção "silenciosa". Nesses casos, você pode usar >/dev/null , como no meu exemplo abaixo.

Exemplo específico com $?

Você solicitou especificamente um exemplo com $? . Em vez da construção if grep ... acima, poderíamos dividir isso em declarações separadas:

# grep -q "$1" $file would work just as well, here (better, maybe!):
grep "$1" $file >/dev/null

if [ $? -eq 0 ]; then
    echo "$file" contains $1
else
    echo "$file" doesn\'t contain $1
fi

É importante observar que o teste $? deve acontecer imediatamente após o comando em questão, pois qualquer outro comando (excluindo alguns recursos internos do shell) fará com que o valor seja sobrescrito.

O que é $?

$? é simplesmente o código de saída do último processo (comando) executado pelo shell. Por convenção, um código de saída 0 é bem-sucedido (embora, como na maioria das convenções, haja exceções). Códigos de saída mais altos podem ter vários significados específicos para a aplicação, mas geralmente diferente de zero significa algum tipo de saída anormal. Consulte a documentação do comando para mais informações.

Leitura adicional

teste (1)

    
por 02.12.2015 / 06:37
0

Outra maneira rápida, que evita instruções if e $? , mas é muito legal e curta (oneliner!), na minha opinião, seria:

grep -q $name $file || echo "$name not found."

se você quiser echo if grep retorna 0 :

grep -q $name $file && echo "$name found."

e como um if-else-statemet:

grep -q $name $file && echo "$name found." || echo "$name not found."
    
por 02.12.2015 / 16:59