www.mikrocontroller.net

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


Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if [ \! -f t.txt  ] ; then echo iss nich da ; fi

Autor: Mark Brandis (markbrandis)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein

Autor: Mark Brandis (markbrandis)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

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

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder vielleicht war es einfach
if !test -f blabla

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. Ans Quoten bei dem Ausrufezeichen hatte ich nicht gedacht.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gerade umgekehrt: -f reagiert auf reguläre Datei, -e auf alles

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch etwas zu
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.