Dies funktioniert auf einer Shell-Eingabeaufforderung (Bash, Dash):
[ -z "" ] && echo A || echo B
A
Ich versuche jedoch, ein POSIX- Shell-Skript zu schreiben. Es beginnt folgendermaßen:
#!/bin/sh
[ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1
readonly raw_input_string=${1}
[ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1
Und ich weiß nicht warum, aber ich verstehe die Nachricht nicht :
Das angegebene Argument ist leer.
wenn ich das script so aufrufe:
./test_empty_argument ""
Warum das?
shell-script
arguments
LinuxSecurityFreak
quelle
quelle
if [ X”” = X”$var” ] ; then echo isempty ; fi
[ "" = "$var" ]
würde gut funktionieren; Eine in Anführungszeichen gesetzte leere Zeichenfolge wird nicht aus der Argumentliste von entfernt[
. Aber das ist auch nicht nötig, weil es[ -z "$var" ]
auch gut funktioniert.Antworten:
Beachten Sie, dass Ihre Linie
das ist das selbe wie
(Ein nicht
;
zitiertes Zeichen kann in den meisten Fällen durch ein Zeilenvorschubzeichen ersetzt werden.)Dies bedeutet, dass die
exit 1
Anweisung immer ausgeführt wird, unabhängig davon, wie viele Argumente an das Skript übergeben wurden. Dies bedeutet wiederum, dass die NachrichtThe given argument is empty.
niemals die Chance haben würde, gedruckt zu werden.Gruppieren Sie die Anweisungen in, um nach einem Test mehr als eine einzelne Anweisung mit der "Kurzschlusssyntax" auszuführen
{ ...; }
. Die Alternative ist die Verwendung einer richtigenif
Anweisung (die in einem Skript meiner Meinung nach sauberer aussieht):Sie haben das gleiche Problem mit Ihrem zweiten Test.
Bezüglich
Dies würde für das gegebene Beispiel funktionieren, aber für das generische
wäre nicht das gleiche wie
Stattdessen ist es eher so
oder
Das heißt, wenn entweder der Test oder der erste Befehl fehlschlägt, wird der zweite Befehl ausgeführt, was bedeutet, dass alle drei beteiligten Anweisungen ausgeführt werden können.
quelle
Dies:
ist nicht:
Aber stattdessen ist:
Ihr Skript wird beendet, unabhängig davon, wie viele Argumente Sie an das Skript übergeben haben.
quelle
Eine Möglichkeit, die Lesbarkeit zu verbessern, besteht darin, eine
die
Funktion (à laperl
) wie folgt zu definieren :Sie können bei Bedarf weitere Schnickschnack wie Farben, Präfixe, Zeilennummern usw. hinzufügen.
quelle
die
Funktion in der Praxis jemals mit mehreren Argumenten auf? (Wenn ja, können Sie ein Beispiel nennen?) Ich verwende eine fast identischedie
Funktion, verwende aber"$*"
stattdessen, welche könnte mehr sein, als Sie beabsichtigen?"$@"
ist, dass es mehrzeilige Nachrichten ermöglicht, ohne dass wörtliche Zeilenumbrüche hinzugefügt werden müssen."$*"
zum Verknüpfen von Argumenten mit Leerzeichen verwenden, müssen Sie auch$IFS
SPC einstellen , damit dies in allen Kontexten funktioniert, einschließlich der Kontexte, in denen$IFS
Änderungen vorgenommen wurden. Alternativ mitksh
/zsh
können Sie verwenden ,print -r -- "$@"
oderecho -E - "$@"
inzsh
.die
-Typ-Funktion gesehen. Was ich frage, ist: Haben Sie in der Praxis jemals jemanden schreiben sehen, umdie "unable to blah:" "some error"
eine zweizeilige Fehlermeldung zu erhalten?die() { IFS=" "; printf >&2 "%s\n" "$*"; exit 1; }
. Haben Sie diesedie
Funktion schon einmal persönlich verwendet ,printf
um eine mehrzeilige Fehlermeldung zu generieren, indem Sie mehrere Argumente übergeben? Oder übergeben Sie immer nur ein einziges Argument,die
sodass der Ausgabe nur eine einzige neue Zeile hinzugefügt wird?Ich habe das oft als Test für eine leere Zeichenkette gesehen:
quelle
-a
,-o
,(
und)
wie derectives zu sagen ,test
mehrere Operationen in einem einzigen Aufruf zu kombinieren werden vermieden (siehe OB-Marker in pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html )./bin/sh
Version enthielt und die unmittelbare Vorgängerin von Heirloom Bourne) hatte ihn ebenfalls nicht.