Múltipla instrução que inclui caracteres especiais usando se causando erros

3

Eu tenho tentado escrever um script que verifica se o conteúdo específico não é encontrado em arquivos / pastas específicos, então deve imprimir "falhou". senão deveria imprimir "sucesso". No entanto, o script a seguir está causando vários erros.

if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]]
then
echo "Failed"
else
echo "Passed"
fi

Alguém pode me dizer por que está causando erros e existe alguma maneira de eliminar os erros e obter a saída esperada?

UPDATE: estou recebendo erros a seguir:

s.sh: line 1: conditional binary operator expected
s.sh: line 1: expected ')'
s.sh: line 1: syntax error near ''/example.com''
s.sh: line 1: 'if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]]'
    
por Buvanesh Kumar 10.10.2017 / 12:45

4 respostas

3

Caminho direto:

grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data
if [ $? -eq 0 ]; then   # check exit status
    echo "Passed"
else 
    echo "Failed"
fi
    A opção -q do
  • grep diz para não escrever nada na saída padrão. Saia imediatamente com zero 0 status se alguma correspondência for encontrada, mesmo que um erro tenha sido detectado.

  • $? - contém o código status de saída do último comando executado

O texto acima também pode ser simplificado para:

if grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data; then
    echo "Passed"
else 
    echo "Failed"
fi
    
por 10.10.2017 / 13:17
5

[[...]] é uma construção usada para realizar comparações e outros tipos de testes. É um comando ksh cuja análise segue regras de sintaxe especiais e substitui o comando [ standard (com a análise de comandos simples normal).

Aqui, não tem utilidade. É se o comando grep the grep é bem-sucedido e você deseja testar (não é um comando [[...]] ou [ ), portanto é apenas:

if grep -qF /example.com /opt/nfs || grep -RqF /example.com /data
then echo passed
else echo failed
fi

-q suprime a saída e também otimiza saindo assim que uma correspondência é encontrada, em vez de tentar encontrar todas as correspondências.

    
por 10.10.2017 / 14:39
3

Aqui está uma possível simplificação da sua solução:

  • Antes de tudo, se você estiver usando o GNU grep , ele poderá pesquisar em várias pastas de arquivos fornecidas na linha de argumento. Portanto, basicamente, não há necessidade de lançar o comando two grep para observar o mesmo padrão em duas pastas diferentes: grep '/example.com' /opt/nfs /data faz o trabalho de pesquisa da ocorrência de /example.com nessas duas pastas.
  • As segundas negações são iguais a um positivo. Então, por que não simplesmente usar este código: %código% if grep -rq "/example.com" /opt/nfs /data ; then echo "success" ; else echo "failed" ; fi será bem-sucedido se encontrar a ocorrência de "/example.com" em grep ou em /opt/nfs

Será mais rápido, e mais eficiente, apenas um /data gerado a partir do shell.

    
por 10.10.2017 / 16:30
2

Tente assim:

if [[ ! $(grep '/example.com' /opt/nfs &>/dev/null) || ! $(grep -R '/example.com' /data &>/dev/null) ]]
then
echo "Failed"
else
echo "Passed"
fi

Mas acho que seu script não faz sentido porque você suprime stdout e stderr com &>/dev/null . A saída do seu comando grep sempre estará vazia. Substitua & para 2 para suprimir apenas stderr .

    
por 10.10.2017 / 13:11