To portably negate a complex conditional in shell, you must either apply De Morgan's lawDe Morgan's law and push the negation all the way down inside the [ calls...
if [ ! -f file1 ] || [ ! -f file2 ] || [ ! -f file3 ]
then
# do stuff
fi
... or you must use then :; else ...
if [ -f file1 ] && [ -f file2 ] && [ -f file3 ]
then :
else
# do stuff
fi
if ! command is not portably available and neither is [[.
If you don't need total portability, don't write a shell script. You're actually more likely to find /usr/bin/perl on a randomly selected Unix than you are bash.