Lógico E em um script bash

5

Eu tenho um if no meu script bash que tem que verificar se OU dos 2 arquivos existe, se eles não existirem, deve corresponder ao eco.

Código que tenho:

if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

Mas isso não parece funcionar por algum motivo.

Tenho 110% de certeza de que esses dois arquivos não existem. Eu não recebo nenhum erro, apenas não entra no if .

Sou novo no bash scripting, por isso não sei o que pode estar errado.

    
por Peppercat101 13.09.2012 / 01:39

4 respostas

9

Se você quiser ou , deseja OR , não AND .

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
  • Isso corresponderá se um ou os dois arquivos estiverem faltando.
  • Seu código só imprimirá match se ambos não existirem.

Mas , você disse:

I am 110% sure that these 2 files do not exist. I don't get any errors, it just doesn't enter the if.

Assim, sua declaração se contradiz. Pelo menos um desses arquivos deve existir, se você estiver executando esse código.

Se você quiser ver como sua instrução if está avaliando, execute-a com -x .

#!/bin/bash -x
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

Então você verá a execução.

$ ./test.sh
+ [[ ! -f /etc/benchmarking/code ]]
+ [[ ! -f /etc/benchmarking/code.class ]]
+ echo match
match
$ 
    
por 13.09.2012 / 02:07
3

Não deveria ser assim? A é um arquivo ou B é um arquivo, então blabla.

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; 
then  
  echo "match"
fi
    
por 13.09.2012 / 01:50
3

Isso também pode funcionar para o que você está tentando fazer. Parênteses únicos não são comumente usados hoje com bash, mas isso ainda é uma opção. Usar '-o' é efetivamente uma operação "OR" e "!" nega a condição.

var=/etc/benchmarking/code
[ ! -f ${var} -o -f {var}.class ] && echo "match"
    
por 13.09.2012 / 15:09
0

Seu código satisfaz seus requisitos: ele imprimirá match , desde que não seja possível encontrar nenhum arquivo.

Portanto, o motivo match não está sendo impresso está em outro lugar. Você deve confirmar que o bloco de código está sendo alcançado, o que você pode fazer cercando-o com algumas mensagens de depuração. Por exemplo, assim:

echo '@ About to enter if...fi block'
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
echo '@ Finished if...fi block'

A minha preferência habitual é que as mensagens de depuração sejam enviadas para stderr , para evitar interromper o fluxo de dados para stdout , mas evitei isso aqui porque você disse era um novato. Aqui está um exemplo mostrando como você pode escrever para stdout :

echo '@ About to enter if...fi block' >&2
    
por 02.09.2016 / 17:46