E lógico em um script bash

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

  • Não ' acho que alguma das respostas postadas realmente aborda a questão . O que acontece quando você tenta os testes individualmente? Faça [[ ! -f /etc/.../... ]]; echo $? para cada um.
  • Um aviso : [[ -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.

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 match se 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 [ em bash. 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, deveria echo 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 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *