Wie kann ich feststellen, ob in Bash keine reguläre Datei vorhanden ist?

3263

Ich habe das folgende Skript verwendet, um festzustellen, ob eine Datei vorhanden ist:

#!/bin/bash

FILE=$1     
if [ -f $FILE ]; then
   echo "File $FILE exists."
else
   echo "File $FILE does not exist."
fi

Was ist die richtige Syntax, wenn ich nur überprüfen möchte, ob die Datei nicht vorhanden ist?

#!/bin/bash

FILE=$1     
if [ $FILE does not exist ]; then
   echo "File $FILE does not exist."
fi
Bill die Eidechse
quelle
187
Ich fand diese Liste von bedingten Bash-Anweisungen sehr nützlich.
Saulius Žemaitaitis
9
Als die sehr faule Person, die ich bin, hätte ich normalerweise das folgende dumme Workaround-Konstrukt verwendet: if [ -f $FILE ]; then; else; echo "File $FILE does not exist."; fi;Wahrscheinlich gut, dass ich diese Frage stattdessen gefunden und gelernt habe, sie besser zu machen. :)
Alderath
5
Um hängend zu sein, sollten Sie "reguläre Datei" sagen, da die meisten UNIX / POSIX-Dokumente generisch auf alle Arten von Dateisystemeinträgen verweisen, einfach auf "Dateien", z. B. ist eine symbolische Verknüpfung ein Dateityp, ebenso wie eine Named Pipe , reguläre Datei, Verzeichnis, Block Special, Character Special, Socket usw.
Kevinarpe
11
@kevinarpe Wenn Sie testen möchten, ob etwas vorhanden ist, verwenden Sie -e. -f nimmt keine Verzeichnisse, Symlinks usw. auf.
Benubird
14
Verwenden Sie aus Sicherheitsgründen immer doppelte Anführungszeichen, um Dateinamen mit Leerzeichen korrekt zu behandeln, z. B. FILE=$1-> FILE="$1"und if [ -f $FILE ];->if [ -f "$FILE" ];
kevinarpe

Antworten:

4523

Der Testbefehl ( [hier) hat einen logischen Operator "nicht", der das Ausrufezeichen ist (ähnlich wie in vielen anderen Sprachen). Versuche dies:

if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi
John Feminella
quelle
208
Genauer gesagt: [! -f /tmp/foo.txt] && echo "Datei nicht gefunden!"
DavidWinterbottom
38
Ich hatte ein wenig Mühe, die richtige Syntax für "Wenn eine von zwei Dateien nicht existiert" zu finden. Die folgenden beiden arbeiten:if [ ! \( -f "f1" -a -f "f2" \) ] ; then echo MISSING; fi if [ ! -f "f1" ] || [ ! -f "f2" ] ; then echo MISSING; fi
Mivk
153
@ DavidWinterbottom Noch saftiger:[ -f /tmp/foo.txt ] || echo "File not found!"
David W.
27
Der Parameter kann einer der folgenden sein:-e: Returns true value, if file exists -f: Return true value, if file exists and regular file -r: Return true value, if file exists and is readable -w: Return true value, if file exists and is writable -x: Return true value, if file exists and is executable -d: Return true value, if exists and is a directory
SD.
5
Es gibt eine Asymmetrie bei der Verwendung ! -fmit &&gegenüber der Verwendung -fmit ||. Dies hat mit dem Exit-Code zu tun, der von der Nichtexistenzprüfung zurückgegeben wird. Wenn Ihre Leitung immer sauber mit dem Exit-Code 0 beendet werden muss (und diese Einschränkung manchmal nicht gewünscht wird), sind die beiden Ansätze nicht austauschbar. Alternativ können Sie auch einfach eine ifAnweisung verwenden, und Sie müssen sich nicht mehr um den Exit-Code Ihrer Nichtexistenzprüfung kümmern.
Acumenus
670

Testen von Bash-Dateien

-b filename- Sonderdatei blockieren
-c filename- Sonderzeichendatei
-d directoryname- Auf Verzeichnisexistenz prüfen
-e filename- Auf Dateiexistenz prüfen, unabhängig vom Typ (Knoten, Verzeichnis, Socket usw.)
-f filename- Auf reguläre Dateiexistenz prüfen, kein Verzeichnis
-G filename- Prüfen, ob eine Datei existiert und deren Eigentümer ist effektive Gruppen-ID
-G filename set-group-id- True, wenn die Datei vorhanden ist und die Gruppen-ID festgelegt ist
-k filename- Sticky-Bit
-L filename- Symbolischer Link
-O filename- True, wenn die Datei vorhanden ist und der effektiven Benutzer-ID gehört
-r filename- Überprüfen Sie, ob die Datei lesbar ist
-S filename- Überprüfen Sie, ob die Datei Socket ist
-s filename- Überprüfen Sie, ob Datei hat eine Größe ungleich Null
-u filename- Überprüfen Sie, ob das Dateisatz-Benutzer-ID-Bit gesetzt ist.
-w filename- Überprüfen Sie, ob die Datei beschreibbar ist.
-x filename- Überprüfen Sie, ob die Datei ausführbar ist

Wie benutzt man:

#!/bin/bash
file=./file
if [ -e "$file" ]; then
    echo "File exists"
else 
    echo "File does not exist"
fi 

Ein Testausdruck kann mit dem !Operator negiert werden

#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
    echo "File does not exist"
else 
    echo "File exists"
fi 
BlueCacti
quelle
1
@ 0x90 Wenn Sie möchten, können Sie meinen Beitrag bearbeiten und zur Liste hinzufügen. Ich denke du meinst: -n String- Überprüfe, ob die Länge der Zeichenfolge nicht Null ist. Oder meinst du file1 -nt file2- Überprüfen Sie, ob Datei1 neuer als Datei 2 ist (Sie können -ot auch für ältere dann verwenden)
BlueCacti
1
Über -n: The unary operator -z tests for a null string, while -n or no operator at all returns True if a string is not empty.~ ibm.com/developerworks/library/l-bash-test/index.html
BlueCacti
1
Warum haben einige nicht eine Funktion hinzugefügt, wie die Funktion existiert () {⏎ if [-e "$ 1"]; dann echo "$ 1 existiert" sonst echo "$ 1 existiert nicht" fi}
Mz A
291

Sie können einen Ausdruck mit "!" Negieren:

#!/bin/bash
FILE=$1

if [ ! -f "$FILE" ]
then
    echo "File $FILE does not exist"
fi

Die relevante Manpage ist man testoder gleichwertig man [- oder help testoder help [für den eingebauten Befehl bash.

Stareamrainbowlabs
quelle
4
In bash , [ist ein builtin. Die relevanten Informationen werden also eher von help [... erhalten, aber dies zeigt, dass dies [ein Synonym für das testEingebaute ist, daher werden die relevanten Informationen eher von erhalten help test. Siehe auch den Abschnitt Bash Conditional Expression im Handbuch .
gniourf_gniourf
@gniourf_gniourf: Ja, aber der eingebaute [Befehl bash verhält sich sehr ähnlich wie der externe [Befehl. Entweder man testoder man [gibt Ihnen eine gute Vorstellung davon, wie er funktioniert.
Keith Thompson
8
@KeithThompson, außer dass das eingebaute Bash[ mehr Schalter enthält als der externe Befehl [auf meinem System ... Im Allgemeinen halte ich es für besser, die Dokumentation zu lesen, die für ein bestimmtes Tool spezifisch ist, und nicht die Dokumentation, die für ein anderes vage verwandtes Tool spezifisch ist. Ich könnte mich jedoch irren;)
gniourf_gniourf
134
[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"

Es ist auch möglich, dass die Datei eine fehlerhafte symbolische Verknüpfung oder eine nicht reguläre Datei ist, z. B. ein Socket, ein Gerät oder ein Fifo. So fügen Sie beispielsweise eine Überprüfung auf fehlerhafte Symlinks hinzu:

if [[ ! -f $FILE ]]; then
    if [[ -L $FILE ]]; then
        printf '%s is a broken symlink!\n' "$FILE"
    else
        printf '%s does not exist!\n' "$FILE"
    fi
fi
Waffen
quelle
9
Darf ich fragen, warum die beiden "[" im Test sind? (zB [[! -a $ FILE]]). Ich habe alle auf einer Solaris-Box genannten Optionen ausprobiert und nur diese hat funktioniert, so dankbar, aber warum?
Dimitrios Mistriotis
30
Doppelklammern sind eine "moderne" Erweiterung; ZB werden
bw1024
7
Laut tldp.org/LDP/abs/html/fto.html ist -a in seiner Wirkung identisch mit -e. Es wurde "veraltet" und von seiner Verwendung wird abgeraten. Wie auch immer +1 für die Erwähnung, auch auf defekten Symlink zu überprüfen
Luca Borrione
4
@dimitrismistriotis two "[" ist eine nicht portable Erweiterung, die (anders) von zsh & bash; Im Allgemeinen sollten Sie es nach Möglichkeit vermeiden.
Gute Person
7
Ich habe dies gewählt, weil es [[. Es ist eine weit verbreitete Erweiterung. Wenn Sie wissen, dass Sie bash verwenden, gibt es keinen Grund, es nicht zu verwenden. Es ist viel weniger fehleranfällig als [.
Michael Potter
101

Es ist erwähnenswert, dass Sie abkürzen können, wenn Sie einen einzelnen Befehl ausführen müssen

if [ ! -f "$file" ]; then
    echo "$file"
fi

zu

test -f "$file" || echo "$file"

oder

[ -f "$file" ] || echo "$file"
Elazar Leibovich
quelle
Vielen Dank! Benötigte eine Alternative, die nicht [[]] verwendet
Jonathan
69

Ich bevorzuge den folgenden Einzeiler im POSIX- Shell-kompatiblen Format:

$ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND"

$ [ -f "/$DIR/$FILE" ] && echo "$FILE FOUND"

Für ein paar Befehle, wie ich es in einem Skript tun würde:

$  [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;}

Sobald ich damit angefangen habe, verwende ich selten mehr die vollständig typisierte Syntax !!

JM Becker
quelle
1
Erstens sind nicht zitierte Variablenreferenzen fehleranfällig. Das heißt, wo steht in einer Bash-Manpage, dass das [oder das testeingebaute Element standardmäßig (im Gegensatz zu ) auf das Vorhandensein von Dateien in der Datei testen würde -e? Wäre das nicht mehrdeutig? AFAIK (und AIUI der Abschnitt "CONDITIONAL EXPRESSIONS") Das einzige, was mit Ihrem Ansatz getestet wird, ist, dass das Argument nicht leer (oder undefiniert) ist, was in diesem Fall eine Tautologie ist (let $DIR = ''and $FILE = '', dann ist das Argument immer noch '//').
PointedEars
1
Beweis : ls /foo, Ergebnis ls: cannot access /foo: No such file or directory. [ /foo ] && echo 42Ergebnis 42. GNU Bash, Version 4.2.37 (1) -Veröffentlichung (i486-pc-linux-gnu).
PointedEars
@PointedEars: Ich habe die -fOption nicht angegeben, als ich diese Antwort schrieb. Natürlich können Sie immer verwenden -e, wenn Sie nicht sicher sind, ob es sich um eine reguläre Datei handelt. Zusätzlich zitiere ich in all meinen Skripten diese Konstrukte, ich muss dies nur ohne ausreichenden Beweis eingereicht haben.
JM Becker
ACK. Aber Sie wissen wahrscheinlich, dass ein Einzeiler das Wenn-Sonst-Problem nicht lösen kann: Er [ $condition ] && if_true || if_falseist fehleranfällig. Auf jeden Fall finde ich [ ! -f "$file" ] && if_not_existsleichter zu lesen und zu verstehen als [ -f "$file" ] || if_not_exists.
PointedEars
55

Um die Existenz von Dateien zu testen, kann der Parameter einer der folgenden sein:

-e: Returns true if file exists (regular file, directory, or symlink)
-f: Returns true if file exists and is a regular file
-d: Returns true if file exists and is a directory
-h: Returns true if file exists and is a symlink

Alle folgenden Tests gelten für reguläre Dateien, Verzeichnisse und Symlinks:

-r: Returns true if file exists and is readable
-w: Returns true if file exists and is writable
-x: Returns true if file exists and is executable
-s: Returns true if file exists and has a size > 0

Beispielskript:

#!/bin/bash
FILE=$1

if [ -f "$FILE" ]; then
   echo "File $FILE exists"
else
   echo "File $FILE does not exist"
fi
SD.
quelle
39

Du kannst das:

[[ ! -f "$FILE" ]] && echo "File doesn't exist"

oder

if [[ ! -f "$FILE" ]]; then
    echo "File doesn't exist"
fi

Wenn Sie nach Datei und Ordner suchen möchten, verwenden Sie -estattdessen die Option -f. -eGibt true für reguläre Dateien, Verzeichnisse, Sockets, Zeichenspezialdateien, Blockspezialdateien usw. zurück.

Jahid
quelle
1
Das ist nicht bash-spezifisch. Die Syntax stammt aus der Korn-Shell und ist auch in zsh und bash verfügbar. Es hat hier jedoch nur einen begrenzten Vorteil gegenüber dem Standarddienstprogramm [.
Stephane Chazelas
regelmäßige Dateien (wie geprüft von -f) und Verzeichnisse sind nur zwei von vielen verschiedenen Arten von Dateien . Es gibt auch Sockets, Symlinks, Geräte, Fifos, Türen ..., [ -edie nach der Symlink-Auflösung die Existenz von Dateien (aller Art, einschließlich regulär, FIFO, Verzeichnis ...) prüfen .
Stephane Chazelas
@StephaneChazelas: Ich sehe nirgendwo ein ksh- oder zsh-Tag. Wir sprechen von Bash oder etwas, das auf den meisten Unix-Systemen standardisiert ist. Im Kontext ist es also bash-spezifisch. OP muss nicht über alle Muscheln Bescheid wissen: D
Jahid
Das war ein Kommentar zum "Bash-spezifischen" Teil Ihrer Antwort.
Stephane Chazelas
@StephaneChazelas: Ja, und im Kontext (Bash und das Standard-Sh) ist es Bash-spezifisch. Ich sehe den Punkt in Ihrem zweiten Kommentar nicht, er ist völlig unzusammenhängend. OP braucht nicht -e, er braucht -f.
Jahid
35

Sie sollten vorsichtig sein, wenn Sie testfür eine nicht zitierte Variable ausgeführt werden, da dies zu unerwarteten Ergebnissen führen kann:

$ [ -f ]
$ echo $?
0
$ [ -f "" ]
$ echo $?
1

Die Empfehlung lautet normalerweise, die getestete Variable in doppelte Anführungszeichen zu setzen:

#!/bin/sh
FILE=$1

if [ ! -f "$FILE" ]
then
   echo "File $FILE does not exist."
fi
Artdanil
quelle
8
Es wird empfohlen, jede Variable in doppelte Anführungszeichen zu setzen, es sei denn, Sie wissen genau, dass Sie einen der seltenen Fälle haben, in denen dies unnötig ist, oder einen der noch selteneren Fälle, in denen es schädlich ist. (Und nein, das ist keiner von ihnen.)
Uwe
Möchten Sie näher erläutern, warum dies bei doppelten Anführungszeichen nicht der Fall ist? Ansonsten sehe ich die Nützlichkeit im Kommentar nicht.
Artdanil
4
Ich meinte: Dies ist nicht einer der seltenen Fälle, in denen es unnötig oder schädlich ist. Ein Shell-Programmierer sollte sich daran gewöhnen, (fast) jede Variable in doppelte Anführungszeichen zu setzen. Diese Regel ist nicht beschränkt auf [ ... ].
Uwe
24

Es gibt drei verschiedene Möglichkeiten, dies zu tun:

  1. Negieren Sie den Exit-Status mit Bash (keine andere Antwort hat dies gesagt):

    if ! [ -e "$file" ]; then
        echo "file does not exist"
    fi

    Oder:

    ! [ -e "$file" ] && echo "file does not exist"
  2. Negieren Sie den Test innerhalb des Testbefehls [(so haben die meisten Antworten zuvor dargestellt):

    if [ ! -e "$file" ]; then
        echo "file does not exist"
    fi

    Oder:

    [ ! -e "$file" ] && echo "file does not exist"
  3. Handle auf das Ergebnis des Tests, das negativ ist ( ||anstatt &&):

    Nur:

    [ -e "$file" ] || echo "file does not exist"

    Dies sieht albern aus (IMO). Verwenden Sie es nur, wenn Ihr Code auf die Bourne-Shell (wie die /bin/shvon Solaris 10 oder früher) portierbar sein muss, auf der der Pipeline-Negationsoperator ( !) fehlte :

    if [ -e "$file" ]; then
        :
    else
        echo "file does not exist"
    fi
Stephane Chazelas
quelle
Gibt es einen Portabilitätsunterschied zwischen ! [und [ !?
Frozen Flame
3
Das ! [ ist POSIX für Shell-Pipelines 2.9.2 (ein beliebiger Befehl) Otherwise, the exit status shall be the logical NOT of the exit status of the last command und [ ! POSIX für Test ! expression True if expression is false. False if expression is true. . Beide sind also POSIX, und meiner Erfahrung nach werden beide umfassend unterstützt.
1
@FrozenFlame, die Bourne-Shell hatte nicht das !Schlüsselwort, das von der Korn-Shell eingeführt wurde. Außer vielleicht für Solaris 10 und älter ist es heutzutage unwahrscheinlich, dass Sie auf eine Bourne-Shell stoßen.
Stephane Chazelas
22

Im

[ -f "$file" ]

Der [Befehl führt einen stat()(nicht lstat()) Systemaufruf für den in gespeicherten Pfad aus $fileund gibt true zurück , wenn dieser Systemaufruf erfolgreich ist und der von zurückgegebene Dateityp stat()" normal " ist.

Wenn also [ -f "$file" ]true zurückgegeben wird, können Sie feststellen, dass die Datei vorhanden ist und eine reguläre Datei oder ein Symlink ist, der schließlich in eine reguläre Datei aufgelöst wird (oder zumindest zum Zeitpunkt der stat()).

Wenn jedoch false zurückgegeben wird (oder if [ ! -f "$file" ]oder ! [ -f "$file" ]true zurückgegeben wird), gibt es viele verschiedene Möglichkeiten:

  • Die Datei existiert nicht
  • Die Datei existiert, ist aber keine reguläre Datei (kann ein Gerät, ein FIFO, ein Verzeichnis, ein Socket sein ...)
  • Die Datei ist vorhanden, Sie haben jedoch keine Suchberechtigung für das übergeordnete Verzeichnis
  • Die Datei ist vorhanden, aber der Pfad für den Zugriff ist zu lang
  • Die Datei ist ein Symlink zu einer regulären Datei, Sie haben jedoch keine Suchberechtigung für einige der Verzeichnisse, die an der Auflösung des Symlinks beteiligt sind.
  • ... jeder andere Grund, warum der stat()Systemaufruf fehlschlagen kann.

Kurz gesagt sollte es sein:

if [ -f "$file" ]; then
  printf '"%s" is a path to a regular file or symlink to regular file\n' "$file"
elif [ -e "$file" ]; then
  printf '"%s" exists but is not a regular file\n' "$file"
elif [ -L "$file" ]; then
  printf '"%s" exists, is a symlink but I cannot tell if it eventually resolves to an actual file, regular or not\n' "$file"
else
  printf 'I cannot tell if "%s" exists, let alone whether it is a regular file or not\n' "$file"
fi

Um sicher zu sein, dass die Datei nicht existiert, benötigen wir die stat() Systemaufruf mit dem Fehlercode ENOENT(gibt an ENOTDIR, dass eine der Pfadkomponenten kein Verzeichnis ist, ein weiterer Fall, in dem wir feststellen können, dass die Datei nicht vorhanden ist) zurückkehren existieren auf diesem Weg). Leider [lässt uns der Befehl das nicht wissen. Es wird false zurückgegeben, unabhängig davon, ob der Fehlercode ENOENT, EACCESS (Berechtigung verweigert), ENAMETOOLONG oder etwas anderes ist.

Der [ -e "$file" ]Test kann auch mit durchgeführt werdenls -Ld -- "$file" > /dev/null . In diesem Fall lserfahren Sie, warum dies stat()fehlgeschlagen ist, obwohl die Informationen nicht einfach programmgesteuert verwendet werden können:

$ file=/var/spool/cron/crontabs/root
$ if [ ! -e "$file" ]; then echo does not exist; fi
does not exist
$ if ! ls -Ld -- "$file" > /dev/null; then echo stat failed; fi
ls: cannot access '/var/spool/cron/crontabs/root': Permission denied
stat failed

Zumindest lssagt mir, dass es nicht daran liegt, dass die Datei nicht existiert. Dies liegt daran, dass nicht festgestellt werden kann, ob die Datei vorhanden ist oder nicht. Der [Befehl hat das Problem einfach ignoriert.

Mit der zshShell können Sie den Fehlercode mit der $ERRNOspeziellen Variablen nach dem fehlgeschlagenen [Befehl abfragen und diese Nummer mithilfe des $errnosspeziellen Arrays in der dekodierenzsh/system Modul :

zmodload zsh/system
ERRNO=0
if [ ! -f "$file" ]; then
  err=$ERRNO
  case $errnos[err] in
    ("") echo exists, not a regular file;;
    (ENOENT|ENOTDIR)
       if [ -L "$file" ]; then
         echo broken link
       else
         echo does not exist
       fi;;
    (*) syserror -p "can't tell: " "$err"
  esac
fi

(Vorsicht, die $errnosUnterstützung wurde bei einigen Versionen von unterbrochen, zshwenn sie mit neueren Versionen von erstellt wurden.gcc )

Stephane Chazelas
quelle
11

Verwenden Sie "!", Um einen Test umzukehren. Dies entspricht dem logischen Operator "nicht" in anderen Sprachen. Versuche dies:

if [ ! -f /tmp/foo.txt ];
then
    echo "File not found!"
fi

Oder etwas anders geschrieben:

if [ ! -f /tmp/foo.txt ]
    then echo "File not found!"
fi

Oder Sie könnten verwenden:

if ! [ -f /tmp/foo.txt ]
    then echo "File not found!"
fi

Oder alles zusammen drücken:

if ! [ -f /tmp/foo.txt ]; then echo "File not found!"; fi

Was geschrieben werden kann (unter Verwendung des Operators "und": &&) als:

[ ! -f /tmp/foo.txt ] && echo "File not found!"

Was so kürzer aussieht:

[ -f /tmp/foo.txt ] || echo "File not found!"

quelle
10

Dieser Code funktioniert auch.

#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
 echo "File '$FILE' Exists"
else
 echo "The File '$FILE' Does Not Exist"
fi
Zitrone Kazi
quelle
7

Der einfachste Weg

FILE=$1
[ ! -e "${FILE}" ] && echo "does not exist" || echo "exists"
lancerex
quelle
6

Dieses Shell-Skript funktioniert auch zum Suchen einer Datei in einem Verzeichnis:

echo "enter file"

read -r a

if [ -s /home/trainee02/"$a" ]
then
    echo "yes. file is there."
else
    echo "sorry. file is not there."
fi
Simmant
quelle
3
Es ist nicht klar, dass dies etwas hinzufügt, was andere Antworten noch nicht gegeben haben. Es codiert einen Pfadnamen fest. Da die Frage als bash markiert ist , kann sie sowohl read -p "Enter file name: " -r azum Auffordern als auch zum Lesen verwendet werden. Es werden Anführungszeichen um die Variable verwendet. das ist gut, sollte aber erklärt werden. Es ist möglicherweise besser, wenn der Dateiname wiedergegeben wird. Und dies prüft, ob die Datei existiert und nicht leer ist (das ist die Bedeutung von -s), während die Frage nach einer leeren oder nicht leeren Datei fragt (für die dies -fbesser geeignet ist).
Jonathan Leffler
4

Manchmal kann es nützlich sein, && und || zu verwenden Betreiber.

Wie in (wenn Sie den Befehl "test" haben):

test -b $FILE && echo File not there!

oder

test -b $FILE || echo File there!
André
quelle
2

Wenn Sie testanstelle von verwenden möchten, []können Sie Folgendes verwenden !, um die Negation zu erhalten:

if ! test "$FILE"; then
  echo "does not exist"
fi
Mauro Zallocco
quelle
0

Sie können auch mehrere Befehle in einem Liner gruppieren

[ -f "filename" ] || ( echo test1 && echo test2 && echo test3 )

oder

[ -f "filename" ] || { echo test1 && echo test2 && echo test3 ;}

Wenn der Dateiname nicht beendet wird, wird die Ausgabe ausgeführt

test1
test2
test3

Hinweis: (...) wird in einer Subshell ausgeführt, {...;} wird in derselben Shell ausgeführt. Die geschweifte Klammer funktioniert nur in Bash.

upteryx
quelle
1
Nein, die geschweifte Klammer ist nicht nur Bash. Es funktioniert in jeder POSIX-kompatiblen Shell.
Charles Duffy
0
envfile=.env

if [ ! -f "$envfile" ]
then
    echo "$envfile does not exist"
    exit 1
fi
kta
quelle
Bitte geben Sie eine Erklärung zusammen mit dem Code an.
Zohar vor
Während dieser Code das Problem des OP lösen kann, ist es am besten, eine Erklärung beizufügen, wie Ihr Code das Problem des OP behebt. Auf diese Weise können zukünftige Besucher aus Ihrem Beitrag lernen und ihn auf ihren eigenen Code anwenden. SO ist kein Codierungsdienst, sondern eine Ressource für Wissen. Es ist auch wahrscheinlicher, dass qualitativ hochwertige, vollständige Antworten positiv bewertet werden. Diese Funktionen sowie die Anforderung, dass alle Beiträge in sich geschlossen sind, sind einige der Stärken von SO als Plattform, die es von Foren unterscheidet. Sie können bearbeiten, um zusätzliche Informationen hinzuzufügen und / oder Ihre Erklärungen durch Quelldokumentation zu ergänzen.
ysf vor