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 parastderr
com1>&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.