Eu quero combinar várias condições em uma declaração shell if e negar a combinação. Eu tenho o seguinte código de trabalho para uma combinação simples de condições:
if [ -f file1 ] && [ -f file2 ] && [ -f file3 ] ; then
# do stuff with the files
fi
Isso funciona bem. Se eu quiser negar, posso usar o seguinte código de trabalho:
if ! ( [ -f file1 ] && [ -f file2 ] && [ -f file3 ] ) ; then
echo "Error: You done goofed."
exit 1
fi
# do stuff with the files
Isso também funciona conforme o esperado. No entanto, me ocorre que não sei o que os parênteses estão fazendo ali. Eu quero usá-los apenas para agrupar, mas é realmente gerando um subshell? (Como posso saber?) Em caso afirmativo, existe uma maneira de agrupar as condições sem gerar um subshell?
if [[ ! -f file1 ]] && [[ ! -f file2 ]]; then
if [ ! 1 -eq 2 ] && [ ! 2 -eq 3 ]; then echo yep; fi
e funciona. Eu sempre escrevo testes com aparelho duplo por uma questão de hábito. Além disso, para garantir que não seja bash
, testei ainda mais if /bin/test ! 1 -eq 2 && /bin/test ! 2 -eq 3 ; then echo yep; fi
e funciona dessa maneira também.
[ ! -e file/. ] && [ -r file ]
irá soltar diretórios. negue como quiser. claro, é isso que -d
faz.
if ! [ -f file1 ] || ! [ -f file 2 ] || ! [ -f file3 ] ; then
mas gostaria de uma resposta mais geral.