Eu tenho um if
no meu script bash que tem que verificar se existe um dos 2 arquivos, se eles não existem, deve ecoar.
Código que eu 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 2 arquivos não existem. Eu não recebo nenhum erro, ele simplesmente não entra no arquivo if
.
Eu sou novo no bash scripting, então não tenho certeza do que pode estar errado.
bash
shell-script
Peppercat101
fonte
fonte
[[ ! -f /etc/.../... ]]; echo $?
para cada um.[[ -f xxx ]]
retorna true se xxx existir e for um arquivo regular (ou um link simbólico para um arquivo regular). Ele retornará false se não existir, ou se não puder dizer se existe ou se existe, mas não é um arquivo comum (diretório, canal, dispositivo, soquete ...) ou se é um link simbólico para um arquivo que não existe ou não pode dizer se existe ou não ou não é um arquivo normal ...[[ -e $file ]] || [[ -L $file ]]
está mais perto de um teste de existência.ls -d -- "$file" > /dev/null 2>&1
está ainda mais perto. E, como regra, esse tipo de teste leva a condições de corrida. Talvez haja outro caminho.Respostas:
Se você quer , então você quer
OR
, nãoAND
.match
se ambos não existirem.Mas você disse:
Portanto, sua afirmação se contradiz. Pelo menos um desses arquivos deve existir, se você estiver executando esse código.
Se você quiser ver como sua
if
declaração está sendo avaliada, execute-a com-x
.Então você verá a execução.
fonte
Isso não deveria ser assim? A é um arquivo ou B é um arquivo, então blabla.
fonte
Isso também pode funcionar para o que você está tentando fazer. Parênteses simples não são usados hoje em dia com o bash, mas isso ainda é uma opção. Usar '-o' é efetivamente uma operação "OR" e "!" nega a condição.
fonte
[
embash
. Além disso, não vejo como isso responde à pergunta.[ ! -f ${var} -a ! -f {var}.class ] && echo "match"
deveria ser. A missão era: se eles (ambos) não existem, deveriam existirecho match
.Seu código atende aos seus requisitos: será impresso,
match
desde que não encontre nenhum dos arquivos.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 pode ser feito envolvendo-o com algumas mensagens de depuração. Por exemplo, assim:Minha preferência usual é a depuração de mensagens para o stderr , a fim de evitar a interrupção do fluxo de dados para o stdout , mas evitei isso aqui porque você disse que era iniciante. Aqui está um exemplo mostrando como você pode escrever para o stdout :
fonte