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
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
[
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.