Frage Wie überprüft man, ob eine Variable in Bash gesetzt ist?


Woher weiß ich, ob eine Variable in Bash gesetzt ist?

Wie überprüfe ich zum Beispiel, ob der Benutzer einer Funktion den ersten Parameter gegeben hat?

function a {
    # if $1 is set ?
}

1067
2017-08-30 14:54


Ursprung


Antworten:


(Normalerweise) Der richtige Weg

if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi

woher ${var+x} ist ein Parametererweiterung was ergibt nichts wenn var ist nicht gesetzt und ersetzt die Zeichenfolge x Andernfalls.

Zitate Exkurs

Zitate können weggelassen werden (so können wir sagen ${var+x} Anstatt von "${var+x}") Da diese Syntax und Verwendung dies garantiert, wird dies nur zu etwas erweitert, das keine Anführungszeichen benötigt (da es entweder auf x (die keine Wortumbrüche enthält, so dass sie keine Anführungszeichen benötigt) oder zu nichts (was zu [ -z ], die bequem auf den gleichen Wert (wahr) auswertet [ -z "" ] macht es auch)).

Während Zitate jedoch sicher weggelassen werden können, und es war nicht sofort für alle offensichtlich (es war nicht einmal offensichtlich zu der erste Autor dieser Zitate Erklärung Wer auch ein großer Bash-Coder ist), wäre manchmal besser, die Lösung mit Anführungszeichen zu schreiben [ -z "${var+x}" ], zu den sehr kleinen möglichen Kosten einer O (1) Geschwindigkeitsstrafe. Der erste Autor hat dies auch als Kommentar neben dem Code hinzugefügt, indem er diese Lösung verwendet, die die URL zu dieser Antwort enthält, die jetzt auch die Erklärung enthält, warum die Anführungszeichen sicher weggelassen werden können.

(Oft) Der falsche Weg

if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi

Das ist oft falsch, da nicht zwischen einer Variablen, die nicht festgelegt ist, und einer Variablen, die auf die leere Zeichenfolge festgelegt ist, unterschieden wird. Das heißt, wenn var=''Dann gibt die obige Lösung "var is blank" aus.

Die Unterscheidung zwischen "unset" und "auf die leere Zeichenfolge festlegen" ist in Situationen wichtig, in denen der Benutzer eine Erweiterung oder eine zusätzliche Liste von Eigenschaften angeben muss und diese nicht standardmäßig einen nicht leeren Wert angibt, während die leere Zeichenfolge angeben sollte Machen Sie das Skript eine leere Erweiterung oder Liste von zusätzlichen Eigenschaften verwenden.

Die Unterscheidung ist jedoch möglicherweise nicht in jedem Szenario von Bedeutung. In diesen Fällen [ -z "$var" ] wird gut gehen.


1596
2017-12-13 17:04



Um nach Zeichenkettenvariablen zu suchen, die nicht Null sind / nicht Null, d. H. Wenn sie gesetzt sind, verwenden Sie

if [ -n "$1" ]

Es ist das Gegenteil von -z. Ich benutze mich -n mehr als -z.


650
2017-08-30 15:17



So testen Sie, ob ein Parameter vorhanden ist nicht gesetzt, oder leer ("Null") oder eingestellt mit einem Wert:

+--------------------+----------------------+-----------------+-----------------+
|                    |       parameter      |     parameter   |    parameter    |
|                    |   Set and Not Null   |   Set But Null  |      Unset      |
+--------------------+----------------------+-----------------+-----------------+
| ${parameter:-word} | substitute parameter | substitute word | substitute word |
| ${parameter-word}  | substitute parameter | substitute null | substitute word |
| ${parameter:=word} | substitute parameter | assign word     | assign word     |
| ${parameter=word}  | substitute parameter | substitute null | assign word     |
| ${parameter:?word} | substitute parameter | error, exit     | error, exit     |
| ${parameter?word}  | substitute parameter | substitute null | error, exit     |
| ${parameter:+word} | substitute word      | substitute null | substitute null |
| ${parameter+word}  | substitute word      | substitute word | substitute null |
+--------------------+----------------------+-----------------+-----------------+

Quelle: POSIX: Parametererweiterung:

In allen mit "substitute" gezeigten Fällen wird der Ausdruck durch den angezeigten Wert ersetzt. In allen Fällen, die mit "assign" angezeigt werden, wird dem Parameter der Wert zugewiesen, der auch den Ausdruck ersetzt.


389
2018-05-25 20:20



Es gibt viele Möglichkeiten, dies zu tun, wobei das Folgende einer von ihnen ist:

if [ -z "$1" ]

Dies ist erfolgreich, wenn $ 1 null oder nicht gesetzt ist


168
2017-08-30 15:00



Während die meisten der hier genannten Techniken korrekt sind, Bash 4.2 unterstützt einen tatsächlichen Test auf das Vorhandensein einer Variablen (Mann bash), anstatt den Wert der Variablen zu testen.

[[ -v foo ]]; echo $?
# 1

foo=bar
[[ -v foo ]]; echo $?
# 0

foo=""
[[ -v foo ]]; echo $?
# 0

145
2017-07-09 02:28



Um zu sehen, ob eine Variable nicht leer ist, verwende ich

if [[ $var ]]; then ...       # `$var' expands to a nonempty string

Das Gegenteil wird getestet, wenn eine Variable entweder nicht gesetzt oder leer ist:

if [[ ! $var ]]; then ...     # `$var' expands to the empty string (set or not)

Um zu sehen, ob eine Variable gesetzt ist (leer oder nicht leer), benutze ich

if [[ ${var+x} ]]; then ...   # `var' exists (empty or nonempty)
if [[ ${1+x} ]]; then ...     # Parameter 1 exists (empty or nonempty)

Das Gegenteil testet, wenn eine Variable nicht gesetzt ist:

if [[ ! ${var+x} ]]; then ... # `var' is not set at all
if [[ ! ${1+x} ]]; then ...   # We were called with no arguments

54
2018-05-08 08:32



Ich finde den POSIX - Tisch immer im andere Antwort langsam zu grok, also hier ist meine Meinung dazu:

   +----------------------+------------+-----------------------+-----------------------+
   |   if VARIABLE is:    |    set     |         empty         |        unset          |
   +----------------------+------------+-----------------------+-----------------------+
 - |  ${VARIABLE-default} | $VARIABLE  |          ""           |       "default"       |
 = |  ${VARIABLE=default} | $VARIABLE  |          ""           | $(VARIABLE="default") |
 ? |  ${VARIABLE?default} | $VARIABLE  |          ""           |       exit 127        |
 + |  ${VARIABLE+default} | "default"  |       "default"       |          ""           |
   +----------------------+------------+-----------------------+-----------------------+
:- | ${VARIABLE:-default} | $VARIABLE  |       "default"       |       "default"       |
:= | ${VARIABLE:=default} | $VARIABLE  | $(VARIABLE="default") | $(VARIABLE="default") |
:? | ${VARIABLE:?default} | $VARIABLE  |       exit 127        |       exit 127        |
:+ | ${VARIABLE:+default} | "default"  |          ""           |          ""           |
   +----------------------+------------+-----------------------+-----------------------+

Beachten Sie, dass jede Gruppe (mit und ohne vorangestellten Doppelpunkt) dasselbe hat einstellen und nicht gesetzt Fälle, so ist das einzige, was sich unterscheidet, wie die leer Fälle werden behandelt.

Mit dem vorhergehenden Doppelpunkt, dem leer und nicht gesetzt Fälle sind identisch, so würde ich diejenigen verwenden, wo möglich (d. h. verwenden :=, nicht nur =, weil der leere Fall inkonsistent ist).

Überschriften:

  • einstellen meint VARIABLE ist nicht leer (VARIABLE="something")
  • leer meint VARIABLE ist leer / null (VARIABLE="")
  • nicht gesetzt meint VARIABLE ist nicht vorhanden (unset VARIABLE)

Werte:

  • $VARIABLE bedeutet, dass das Ergebnis der ursprüngliche Wert der Variablen ist.
  • "default" bedeutet, dass das Ergebnis die Ersatzzeichenfolge war.
  • "" bedeutet, dass das Ergebnis null ist (eine leere Zeichenfolge).
  • exit 127 bedeutet, dass das Skript mit dem Beendigungscode 127 nicht mehr ausgeführt wird.
  • $(VARIABLE="default") bedeutet, dass das Ergebnis der ursprüngliche Wert der Variablen ist und Die Ersatzzeichenfolge wird der Variablen für die zukünftige Verwendung zugewiesen.

30
2018-06-17 15:19



Auf einer modernen Version von Bash (4.2 oder später, denke ich; ich weiß es nicht sicher) würde ich Folgendes versuchen:

if [ ! -v SOMEVARIABLE ] #note the lack of a $ sigil
then
    echo "Variable is unset"
elif [ -z "$SOMEVARIABLE" ]
then
    echo "Variable is set to an empty string"
else
    echo "Variable is set to some string"
fi

29
2017-08-26 16:24



if [ "$1" != "" ]; then
  echo \$1 is set
else
  echo \$1 is not set
fi

Für Argumente ist es normalerweise besser, $ # zu testen, was meiner Meinung nach die Anzahl der Argumente ist.

if [ $# -gt 0 ]; then
  echo \$1 is set
else
  echo \$1 is not set
fi

18
2017-08-30 15:00