2013-10-03 17 views
5

Suche nach der richtigen Syntax, die eine Bash-Variable betrachtet und bestimmt, ob es Null ist, wenn es dann tun ... sonst weitermachen.Bash If-Anweisung null

Vielleicht so etwas wie if [ $lastUpdated = null?; then... else...

+0

Es gibt keine „Null“ Wert in bash. Strings können leer oder nicht gesetzt sein; Wie setzt man den Wert von $ lastUpdated? –

+1

Was meinst du mit 'null'? – zoska

+1

In einigen Kontexten können Notationen wie '$ {lastUpdated: = nie}' oder '$ {lastUpdated: -never}' usw. angebracht sein. Sehen Sie unter [Parametererweiterung] (http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion) nach. –

Antwort

10

einfach testen, ob die Variable leer ist:

if [ -z "$lastUpdated" ]; then 
    # not set 
fi 
+0

Es gibt einen Unterschied zwischen einer nullwertigen Variablen (der leeren Zeichenfolge zugewiesen) und einer nicht gesetzten Variablen; Diese Antwort macht diese Unterscheidung nicht erkennbar. – chepner

+0

@chepner Gibt es da? Bitte erweitern Sie das. – trojanfoe

+0

Vor jeder Zuweisung ist eine Variable nicht gesetzt. 'FOO =' (kein Wert geben) ist äquivalent zu 'FOO = "" ', was den Wert von' FOO' auf die leere Zeichenfolge setzt. Die verschiedenen Parametererweiterungen (zum Beispiel $ {FOO: -default} 'vs' $ {FOO-default} ') ermöglichen Ihnen diese Unterscheidung. Eine zitierte Erweiterung einer nicht gesetzten Variable, wie Sie sie verwenden, wird auf die leere Zeichenfolge erweitert, sodass '-z' die beiden Zustände nicht unterscheiden kann. – chepner

2

, hier Aufbauend auf Kommentare des @ chepner, wie Sie für eine ungesetzt testen konnte (im Gegensatz zu einem möglicherweise leer setzen gegen value) Variable:

if [ -z "${lastUpdated+set}" ]; then 

${variable+word} die Syntax gibt eine leere Zeichenfolge, wenn $variable nicht gesetzt ist, und die string "Wort", wenn es gesetzt ist:

$ fullvar=somestring 
$ emptyvar= 
$ echo "<${fullvar+set}>" 
<set> 
$ echo "<${emptyvar+set}>" 
<set> 
$ echo "<${unsetvar+set}>" 
<> 
+0

Sie können die Anführungszeichen in Ihrem Ausdruck mit Sicherheit weglassen, indem Sie sie als if [-z $ {lastUpdated + set}]; '.[Diese SO Antwort] (https://stackoverflow.com/questions/3601515/how-to-check-if-a-variable-is-set-in-bash) gibt eine detaillierte Erklärung. – panepeter

+1

@panepeter Richtig, aber meine Erfahrung ist, dass es einfacher und sicherer ist, variable Referenzen doppelt anzugeben, als es herauszufinden, wann es sicher ist, sie zu belassen. In diesem Fall ist die Tatsache, dass es * eine detaillierte Erklärung erfordert (einschließlich Verständnis, was '[-z]' tut und warum), viel einfacher, doppelte Anführungszeichen zu verwenden. Um es anders auszudrücken: Wenn jemand denkt, dass '[-z $ {lastUpdated + set}]' eine gute Methode ist, um nach einer gesetzten Variable zu suchen, werden sie wahrscheinlich folgern, dass '[-n $ {lastUpdated + set}] 'ist eine gute Möglichkeit, auf eine nicht gesetzte Variable zu testen, aber sie wird vollständig fehlschlagen. –

2

Um es alle zu: Es gibt keinen wirklichen null Wert in bash. Chepners Kommentar ist auf Punkt:

Die Bash-Dokumentation verwendet null als Synonym für die leere Zeichenfolge.

Daher wäre für null Kontrolle bedeuten für einen leeren String Überprüfung:

if [ "${lastUpdated}" = "" ]; then 
    # $lastUpdated is an empty string 
fi 

Wenn das, was Sie wirklich tun möchte, ist Prüfung für eine nicht gesetzt oder leer (dh „“, dh 'null') Variable, die Verwendung trojanfoe Ansatz:

if [ -z "$lastUpdated" ]; then 
    # $lastUpdated could be "" or not set at all 
fi 

Wenn Sie möchten, Wetter überprüfen die Variable ist nicht gesetzt, sondern sind in Ordnung mit leeren Saiten, Gordon Davisson Antwort ist der Weg zu gehen:

if [ -z ${lastUpdated+set} ]; then 
    # $lastUpdated is not set 
fi 

(Parameter Expansion ist das, was hier vor sich geht)

+1

'-eq' dient zum Vergleichen ganzer Zahlen; Sie brauchen '=' um Strings zu vergleichen. –