Shell script: Negation in if Abfrage

Persönliche Seite #1477773
Lesenswert?

So bevor ich jetzt total verzweifel weil ich mit Google 10000 Seiten 
finde wie ich abfrage ob eine Datei existiert, aber kein Beispiel wie 
ich abfrage dass sie nicht existiert und versuche mit ! und ~ 
erfolglos waren, wie schreibe ich es besser?

if [ -f DATEINAME ]; then

#useless command to satisfy bash
echo ""

else

echo "please compile before testing"
exit 1

fi
#1477806
Lesenswert?

[...] steht für das interne Kommando test.

Wenn man mit der bash arbeitet:
- Es kommt das Ausrufezeichen zumindest in die eckigen Klammern,
weil es den darin enthaltenen logischen Ausdruck negieren soll.
- das Quoten mit \ ist nötig, um eine Sonderbehandlung zu vermeiden.

Falls es um die sh geht:
Ein Quoten ist vrmtl. nicht nötig; ob es geht das ! ausserhalb
stehen zu lassen weiß ich nicht.


Mit if [ \! -f ...] geht es jedenfalls mit sh und bash.
#1477845
Lesenswert?

Klaus Wachtler schrieb:

> gerade umgekehrt: -f reagiert auf reguläre Datei, -e auf alles

Wieso umgekehrt? Genau das habe ich doch geschrieben.
"! -f" ist für ein Directory (und noch für Diverses andere) true. In der 
Regel geht es aber darum, festzustellen, ob überhaupt noch nichts mit 
dem Namen existiert (quasi ob der Name noch frei ist), also "! -e".
Gast #1477848
Lesenswert?

Noch etwas zu
1
if ! [ -f DATEINAME ]; then

Ohne das Leerzeichen wird das Ausrufezeichen als Event-Designator
interpretiert. Steht das ! durch Leerraum getrennt vor einem Befehl,
wird dessen Rückgabestatus negiert, in diesem Fall also der des
[-Befehls. Das ! ist in diesem Kontext der zu && und || passende
Negationsoperator.

Das ! innerhalb von [ ] ist, wie auch -a (and) und -o (or), ein
mögliches Argument des test- bspw [-Befehls und hat mit dem obigen !
nichts zu tun.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren