Ich möchte mehrere Bedingungen in einer Shell-if-Anweisung kombinieren und die Kombination negieren. Ich habe den folgenden Arbeitscode für eine einfache Kombination von Bedingungen:
if [ -f file1 ] && [ -f file2 ] && [ -f file3 ] ; then
# do stuff with the files
fi
Das funktioniert gut. Wenn ich es negieren möchte, kann ich den folgenden Arbeitscode verwenden:
if ! ( [ -f file1 ] && [ -f file2 ] && [ -f file3 ] ) ; then
echo "Error: You done goofed."
exit 1
fi
# do stuff with the files
Das funktioniert auch wie erwartet. Mir fällt jedoch auf, dass ich nicht weiß, was die Klammern dort tatsächlich tun. Ich möchte sie nur zum Gruppieren verwenden, aber gibt es tatsächlich eine Unterschale? (Woran erkenne ich das?) Wenn ja, gibt es eine Möglichkeit, die Bedingungen zu gruppieren, ohne eine Unterschale zu erzeugen?
if [[ ! -f file1 ]] && [[ ! -f file2 ]]; then
if [ ! 1 -eq 2 ] && [ ! 2 -eq 3 ]; then echo yep; fi
und es funktioniert. Ich schreibe nur aus Gewohnheit immer Tests mit doppelten Klammern. Außerdem, um sicherzustellen, dass es nicht ist bash
, habe ich weiter getestet if /bin/test ! 1 -eq 2 && /bin/test ! 2 -eq 3 ; then echo yep; fi
und es funktioniert auch so.
[ ! -e file/. ] && [ -r file ]
Verzeichnisse. negiere es wie du willst. Natürlich ist es das, was -d
tut.
if ! [ -f file1 ] || ! [ -f file 2 ] || ! [ -f file3 ] ; then
Aber ich hätte gerne eine allgemeinere Antwort.