Testando o status de saída do grep com pipe e variável sem sucesso

4

Eu preciso do mais curto possível o comando bash test (bracket test) para avaliar o resultado do pip grep com variável como argumento de pesquisa. Eu estou testando, se uma nova seqüência de caracteres está na matriz - canalizando o conteúdo da matriz como linhas para grep e verificando o código de saída. Mas de alguma forma não funciona. Não encontra o valor na matriz. Eu tentei de várias maneiras parênteses, parênteses, citações, ponto e vírgula sem sorte. O que está errado aqui?

#! /bin/bash
startLineNrs=();
startLineNrs+=("45");
startLineNrs+=("280");
startLineNrs+=("80");
startLineNr="280";
echo "\$startLineNrs:" ${#startLineNrs[@]};
printf '%s\n' "${startLineNrs[@]}";
[ "$(printf '%s\n' ${startLineNrs[@]} | grep -xq ${startLineNr})" ] && { echo $?; echo Found ;} || { echo $?; echo Not found ;}

Basicamente eu quero entender o if ... então construir versus o teste de parênteses. O método if ... then funciona:

if !( printf '%s\n' "${startLineNrs[@]}" | grep -xq "${startLineNr}" ); then startLineNrs+=("$startLineNr") ; fi
    
por uldics 17.03.2018 / 21:59

2 respostas

3

Para fazer o comando && - || funcionar, tente:

printf '%s\n' ${startLineNrs[@]} | grep -xq ${startLineNr}  && { echo $?; echo Found ;} || { echo $?; echo Not found ;}

Notas:

  1. O comando de teste ( [ ) e a substituição de comando ( $(...) ) não são necessários.

  2. Uma subtileza da construção a && b || c é que c será executado não apenas se a falhar, mas também se b falhar. Como seu b consiste em echo declarações que normalmente devem ser bem-sucedidas, isso normalmente não deve ser um problema.

  3. Para obter outros métodos para testar a associação à matriz, consulte " Verifique se uma matriz Bash contém um valor ".

por 17.03.2018 / 22:24
2

A maneira correta de escrever sua declaração if é:

if printf '%s\n' "${startLineNrs[@]}" | grep -xq "$startLineNr"; then
  # your logic
fi

O problema com sua declaração de teste [...] é que [ ou test trata "$(printf '%s\n' ${startLineNrs[@]} | grep -xq ${startLineNr}) como uma string e não a executa como uma substituição de comando. Como é uma string não vazia, será sempre avaliada como verdadeira.

    
por 17.03.2018 / 22:12