Eu tenho um if em meu script bash que deve verificar se ALÉM de os 2 arquivos existem, se eles não existirem, deve corresponder.
Código que eu tenho:
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi
Mas isso não ” t não parece funcionar por algum motivo.
Tenho 110% de certeza de que esses 2 arquivos não existem. Não recebo nenhum erro, apenas não entra no if.
Sou novo no bash scripting, então não tenho certeza do que poderia ser errado.
Comentários
Resposta
Se você deseja e então OR, não AND.
if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi
- Corresponderá se um ou ambos os arquivos estiverem ausentes.
- Seu código irá imprima apenas
matchse ambos não existirem.
Mas , você disse:
Tenho 110% de certeza de que esses 2 arquivos não existem. Não recebo nenhum erro, apenas não insere o if.
Portanto, sua declaração se contradiz. Pelo menos um desses arquivos deve existir, se você é executando aquele código.
Se você deseja 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 $
Comentários
- Eu quero que ecoe " match " se nenhum arquivo existe, se houver, não imprimirá correspondência. Vou tentar com -x
- Nesse caso, seu código original deve estar bem. E de fato funciona para mim.
Resposta
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
Resposta
Isso também pode funcionar para o que você está tentando fazer. Parênteses simples não são comumente usados hoje com bash, mas ainda é uma opção. Usar “-o” é efetivamente uma operação “OU” e “!” nega a condição.
var=/etc/benchmarking/code [ ! -f ${var} -o -f {var}.class ] && echo "match"
Comentários
- Não ' nunca use
[embash. Além disso, não consigo ver como isso responde à pergunta. -
[ ! -f ${var} -a ! -f {var}.class ] && echo "match"deveria ser. A questão era: se eles (ambos) não ' existem, deveriaecho match.
Resposta
Seu código atende aos seus requisitos: ele imprimirá match desde que não encontre nenhum dos arquivos .
Portanto, o motivo de match não estar sendo impresso está em outro lugar. Você deve confirmar se o bloco de código está sendo alcançado, o que pode ser feito circundando-o com um algumas mensagens de depuração. Por exemplo, como este:
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"
Minha preferência usual é que as mensagens de depuração vão para stderr para evitar a interrupção do fluxo de dados para stdout , mas evitei isso aqui porque você disse que era um iniciante. Aqui está um exemplo que mostra como você poderia escrever para stdout :
echo "@ About to enter if...fi block" >&2
[[ ! -f /etc/.../... ]]; echo $?para cada um.[[ -f xxx ]]retorna verdadeiro se xxx existe e é um arquivo regular (ou um link simbólico para um arquivo regular). Retornará falso se não ' não existe, ou se pode ' não dizer se existe ou não ou se existe, mas não é um arquivo regular (diretório, canal, dispositivo, soquete …) ou se ' for um link simbólico para um arquivo que não ' não existe ou pode ' t dizer se ele existe ou não ou não é um arquivo regular …[[ -e $file ]] || [[ -L $file ]]está mais perto de um teste de existência.ls -d -- "$file" > /dev/null 2>&1é ainda mais perto. E, via de regra, esse tipo de teste leva a condições de corrida. Talvez haja ' s outra maneira.