Ich glaube, ich bin mir nicht sicher, wie ich "und" Tests durchführen soll. Ich wollte sicherstellen, dass ein Argument existiert, mit dem es gut funktioniert [ -e $VAR ]
, aber es stellte sich heraus, dass es auch für eine leere Zeichenfolge als wahr bewertet wurde. was ich nicht will.
Wie mache ich sie zusammen? Oder gibt es einen anderen unären Test, der das erreicht, was ich will?
bash
; Um jedoch die "Bashismen" voll auszunutzen, lesen Sie die Antwort von @ paxdiablo.-a
.Aus der
bash
Manpage:Und für Ausdrücke ist eine der Optionen:
Sie können
and
sie also wie folgt zusammenfügen (-n
ist das Gegenteil von,-z
damit wir das loswerden können!
):Ich denke jedoch nicht, dass es in diesem Fall benötigt wird,
-e xyzzy
ist wahr, wenn diexyzzy
Datei existiert und ganz einfach mit leeren Zeichenfolgen umgehen kann. Wenn Sie dies möchten, benötigen Sie den-z
nicht leeren Scheck nicht:Mit anderen Worten, verwenden Sie einfach:
quelle
[[ -e "$var" ]] && echo "'$var' exists"
quelle
POSIX
das Verhalten[
bei komplexen Testreihen nicht definiert ist , sollten wir die Verwendung von-a
oder-o
mit vermeiden[
. Ich habe es hier gelesen .bash
Tag und keine Erwähnung über POSIX, also poste ich diese Version, die unterbash
und einigen anderen modernen Shells funktioniert .bash
oder anderer moderner Muscheln annehmen , gibt es noch weniger Gründe, dies zu empfehlen-a
.[ "$var1" -o "$var2" ]
; Wennvar1=(
undvar2=)
, dann haben wir einen Test, ob-o
nicht leer ist, anstatt ob einer vonvar1
odervar2
nicht leer ist. Diese Art von Mehrdeutigkeit ist der einzige legitime Grund für diex$var
Redewendung in modernen ( dh nach den 90er Jahren)test
Befehlen mit korrekten Zitaten, und diese Redewendung muss in einem Feuer sterben.Zitieren Sie einfach Ihre Variable:
Dies ergibt ,
[ -e "" ]
ob$VAR
leer ist.Ihre Version funktioniert nicht, da sie ausgewertet wird
[ -e ]
. In diesem Fall prüft bash einfach, ob das einzelne Argument (-e
) eine nicht leere Zeichenfolge ist.Aus der Manpage:
(Diese Lösung bietet außerdem den zusätzlichen Vorteil, dass Sie mit Dateinamen arbeiten können, die Leerzeichen enthalten.)
quelle
Ich habe jetzt eine Antwort gefunden. Vielen Dank für Ihre Vorschläge!
Irgendwelche Kommentare dazu? Es scheint ineffizient zu sein, zweimal zu grepen, aber es funktioniert ...
quelle