2013-10-03 13 views
5

Poszukuje poprawnej składni, która wygląda na zmienną bash i określa, czy jest ona pusta, jeśli jest to następnie ... w przeciwnym razie kontynuuj.Bash Jeśli instrukcja null

Może coś if [ $lastUpdated = null?; then... else...

+0

Nie ma „null” wartość w bash. Łańcuchy mogą być puste lub rozbrojone; jak ustawić wartość '$ lastUpdated'? –

+1

Co masz na myśli przez 'null'? – zoska

+1

W niektórych kontekstach mogą być odpowiednie oznaczenia takie jak '$ {lastUpdated: = never}' lub '$ {lastUpdated: -never}' i tak dalej. Zajrzyj pod [Rozbudowywanie parametrów] (http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter- Exxpansion). –

Odpowiedz

10

prostu przetestować, czy zmienna jest pusta:

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

Istnieje różnica między zmienną o wartości pustej (przypisaną pustym ciągiem) a zmienną nieustaloną; ta odpowiedź nie wykrywa tego rozróżnienia. – chepner

+0

@chepner Czy istnieje? Proszę rozwinąć to. – trojanfoe

+0

Przed przypisaniem zmienna jest rozbrajana. 'FOO =' (brak wartości) jest równoważne z 'FOO =" "', które ustawia wartość 'FOO' na pusty łańcuch. Różne rozszerzenia parametrów ('$ {FOO: -default}' vs '$ {FOO-default}', jako przykład) pozwalają ci na to rozróżnienie. Cytowane rozszerzenie zmiennej unset, takiej jak używasz, rozwija się do pustego łańcucha, więc '-z' nie może odróżnić dwóch stanów. – chepner

2

Rozszerzając komentarzach @ chepner jest, oto jak można przetestować dla rozbrojony (w przeciwieństwie do ustawiony na możliwie pusty wartość) zmienna:

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

Składnia ${variable+word} daje pusty ciąg jeśli $variable jest wyłączony, a string „słowo”, jeżeli jest on ustawiony:

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

Możesz bezpiecznie pominąć cudzysłowy w wyrażeniu, czyniąc je 'if [-z $ {lastUpdated + set}];'.[To odpowiedź SO] (https://stackoverflow.com/questions/3601515/how-to-check-if-a-variable-is-set-in-bash) zawiera szczegółowe wyjaśnienie. – panepeter

+1

@panepeter Prawda, ale z mojego doświadczenia wynika, że ​​łatwiej i bezpieczniej jest tylko cytować zmienne referencje niż wyczytać, kiedy można je bezpiecznie opuścić. W tym przypadku fakt, że * wymaga * szczegółowego wyjaśnienia (w tym zrozumienia, co '[-z]' robi i dlaczego) mans znacznie łatwiej użyć podwójnych cudzysłowów. Innymi słowy: jeśli ktoś myśli "[-z $ {lastUpdated + set}]" jest dobrym sposobem na przetestowanie zmiennej set, prawdopodobnie będą oni wnioskować, że '[-n $ {lastUpdated + set}] 'to dobry sposób na testowanie zmiennej unset, ale całkowicie zawiedzie. –

2

Podsumowując to wszystko: Nie ma prawdziwego zerowy wartość w bash. Komentarz Chepner jest na temat:

Dokumentacja bash używa null jako synonimu pustego łańcucha.

Dlatego sprawdzanie wartości null oznaczałoby sprawdzanie dla pusty ciąg:

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

Jeśli to, co naprawdę chcesz zrobić, to sprawdzić za rozbrojony lub pusty (tj „”, czyli podejście 'null' zmiennej), użyj trojanfoe za:

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

Jeśli chcesz sprawdź pogoda zmienna jest ustawiona, ale są w porządku z pustych strun, odpowiedź Gordona Davisson jest do zrobienia:

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

(Parameter Expansion to, co się dzieje tutaj)

+1

'-eq' służy do porównywania liczb całkowitych; aby porównać łańcuchy, potrzebujesz '='. –

Powiązane problemy