Como faço uma saída para o grep falhar?

2

Estou usando a instrução if-else para pesquisar palavras-chave e exibir os resultados no terminal. Aqui está um exemplo do meu código.

read finding

if ["$finding" != "" ]; then
   grep $finding information.txt
else
   echo "No such information in database."
fi

Mas o terminal não exibe nada se eu digitar informações que não existem. Eu comecei shell cerca de uma semana atrás, pode precisar de mais explicações sobre como determinado código funciona.

    
por Zac 12.01.2015 / 19:34

3 respostas

4
  • Adicione espaço após [ (é um comando)
  • Use -n para testar se o comprimento da string é diferente de zero, ou -z para testar se é zero
  • Coloque aspas duplas nas variáveis

Então:

read finding

if [ -z "$finding" ]; then
    echo "You didn't enter anything"
else
    grep "$finding" information.txt
    if [ ! "$?" -eq 0 ]; then
        echo "No such information in database."
    fi
fi
    
por 12.01.2015 / 20:14
3

Usando alguns operadores lógicos (iniciando em @jimmij)

grep -q "$finding" information.txt se comporta como uma resposta booleana (não imprime nada, apenas tem um status de retorno de 0 se encontrado, diferente de zero).

grep -F -- "$finding" ... texto de pesquisa em vez de regexp (remova-o se quiser para procurar por regexp - pode haver alguns riscos de segurança ... (obrigado @StephanChazelas))

read finding

if [ -z "$finding" ]; then
   echo "You didn't enter anything"
else
   grep -qF -- "$finding" information.txt   && echo "found"   || echo "not found"
fi

ou até mesmo

[ -z "$finding" ] && 
     echo "nothing entered" || 
     grep -qF -- "$finding" information.txt || echo "not found"

(embora tenha cuidado, ele também executará o segundo grep e / ou echo se o primeiro echo falhar)

Editar 1 > explain grep -q ... Claro.

Em situações normais, o status de retorno do grep é 0 (e apenas retorna "não 0" se ocorrer um erro (por exemplo, arquivo não encontrado))

grep -qF exp file "retorna" 0 se encontrar exp no arquivo, caso contrário, o erro ( grep -q exp file faria isso se a exp regexp fosse correspondida em file ).

Esse comportamento pode ser usado em declarações de controle bash (if, elif, while, & & amp ;, ||, etc)

read f

if [ -z "$f" ]; then
   echo "You didn't enter anything"
elif grep -qF -- "$f" information.txt; then
   echo "found"
else
   echo "not found"
fi
    
por 13.01.2015 / 13:43
0
i=0
until  [ "$((i+=1))" -gt 5 ] || {
       printf '\nPrompt: '
       read finding && [ -n "$finding" ]
};do   printf '\nINVALID:\tTry again.\n'
done   <>/dev/tty >&0
grep -- "${finding:?INSUFFICIENT INPUT!}" <info.txt ||
! printf '%s:\tNot found in database.' "$finding" >&2

Você deve testar não apenas que $finding não é nulo, mas também que o read está sendo concluído com êxito - e, portanto, configurá-lo em primeiro lugar. O loop acima irá solicitar e tentar ler do terminal uma linha de entrada de entrada não nula 5 vezes antes de sair com o erro.

  • %código%
    • Um valor vazio para "${expand:?SUBSTITUTE ONLY IF UNSET OR NULL! >STDERR}" é tratado como um efeito colateral do $finding parameter ${ expansion :? e resulta em uma mensagem gravada em } e na saída imediata de um shell não interativo.
  • %código%
    • É um erro de sintaxe tentar redirecionar de um arquivo que não pode ser aberto (como um que não existe ou para o qual o UID / GID efetivo não tem permissões de leitura) e assim se stderr for, por qualquer motivo, inválido, um shell não interativo gravará uma mensagem de diagnóstico em cmd ... <redirected_input_file e também sairá imediatamente. Isso também vale se a tentativa info.txt exceder quaisquer limitações, conforme efetuado por stderr - e se aplica igualmente ao loop read inicial.
  • %código%
    • Como qualquer usuário ou erros de entrada de arquivo já resultaram em uma saída do shell antes de ulimit ser chamado, os outros dois resultados possíveis do formulário acima são que until ... done <>in >&out corresponde ao padrão em grep ... || ! printf '%s: fmt' "$param" pelo menos uma vez e grava as linhas correspondentes em grep ou que não corresponde uma única vez e retorna diferente de 0. No último caso grep grava uma mensagem informativa em "$finding" e retorna 1.
por 12.01.2015 / 23:18