Forum: PC-Programmierung Shell script: Negation in if Abfrage


von Malte _. (malte) Benutzerseite


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

von Klaus W. (mfgkw)


Lesenswert?

1
if [ \! -f t.txt  ] ; then echo iss nich da ; fi

von Mark B. (markbrandis)


Lesenswert?

Hm, das Ausrufezeichen tut's nicht?
1
if ![ -f DATEINAME ]; then

von Klaus W. (mfgkw)


Lesenswert?

nein

von Mark B. (markbrandis)


Lesenswert?

Hm, ich meine das auch schon mal anders syntaxisiert zu haben :)
Hab aber leider grad kein Linux zum Testen da.

von Klaus W. (mfgkw)


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.

von Klaus W. (mfgkw)


Lesenswert?

Mark Brandis schrieb:
> Hm, das Ausrufezeichen tut's nicht?
>
>
1
> if ![ -f DATEINAME ]; then
2
>

ich habe es eben mit sh probiert; da scheint es zu gehen,
wenn man noch ein Leerzeichen nach dem ! spendiert.

von Mark B. (markbrandis)


Lesenswert?

Oder vielleicht war es einfach
1
if !test -f blabla

von Malte _. (malte) Benutzerseite


Lesenswert?

Danke. Ans Quoten bei dem Ausrufezeichen hatte ich nicht gedacht.

von Stefan E. (sternst)


Lesenswert?

Erwähnenswert wäre vielleicht noch, dass "! -f" möglicherweise nicht das 
ist, was du haben möchtest. Wenn z.B. ein Directory mit dem Namen 
existiert, ist diese Bedingung auch true. Vermutlich möchtest du eher 
ein "! -e" haben.

von Klaus W. (mfgkw)


Lesenswert?

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

von Stefan E. (sternst)


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".

von Klaus W. (mfgkw)


Lesenswert?

oh sorry, jetzt hatte ich in deinem Post das ! übergangen (und
gelesen, -f wäre bei einem Verzeichnis true); ich nehme alles
zurück.

von yalu (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.