Muszę sprawdzić istnienie zmiennej w if
instrukcji. Coś w efekcie:
if [ -v $somevar ]
then
echo "Variable somevar exists!"
else
echo "Variable somevar does not exist!"
Najbliższym pytaniem było to , które tak naprawdę nie odpowiada na moje pytanie.
$somevar
na wartość / string jeśli zmienna nie istnieje:${somevar:=42}
.[ -n "$var" ]
lub[ ! -z "$var" ]
). Myślę, że kontrole istnienia / nieistnienia są zbyt subtelne i wolę mój kod zgrubny i prosty.[ -n "$var" ]
? Powiązane: stackoverflow.com/questions/3601515/…Odpowiedzi:
W nowoczesnej wersji bash (wersja 4.2 i nowsze):
Od
help test
:źródło
[ -v name_of_var ]
.$1
,$-
,$#
...test
lub[
; Nie jest dostępny w/usr/bin/test
. Porównajman test
zhelp test
.Zależy, co masz na myśli, istnieje .
Czy zmienna została zadeklarowana ale nie przypisano istnieć ?
Czy tablica (lub hash) zmienną, która została przypisana pusta lista istnieje ?
Robi nameref zmienna wskazując na zmienną, która obecnie nie jest przypisany istnieć ?
Czy uważają Państwo
$-
,$#
,$1
zmienne? (POSIX nie).W muszlach podobnych do Bourne'a kanoniczny sposób to:
Że pracuje dla zmiennych skalarnych i innych parametrów, aby stwierdzić, czy zmienna została przypisana wartość (pusty lub nie, automatycznie, z otoczenia, assigments,
read
,for
lub inne).Dla powłok, które mają komendę
typeset
lubdeclare
, które nie zgłosiłyby się jako ustawione zmienne, które zostały zadeklarowane, ale nie zostały przypisane, z wyjątkiemzsh
.Muszli, które obsługują macierze, z wyjątkiem
yash
izsh
że nie będzie Zgłoś jako zestaw zmiennych tablicowych chyba element índice 0 został ustawiony.Do
bash
(ale nieksh93
niezsh
), dla zmiennych typu asocjacyjnej , która nie zgłosić je jako zestaw , chyba że ich elementem kluczowym „0” został ustawiony.For
ksh93
ibash
, dla zmiennych typu nameref , zwraca wartość true tylko wtedy, gdy zmienna, do której odwołuje się nameref, jest uważana za ustawioną .Na
ksh
,zsh
ibash
, potencjalnie lepszym rozwiązaniem mogłoby być:Na
ksh93
,zsh
ibash
4,4 lub powyżej, istnieje również:Który zgłosi zmienne, które zostały ustawione lub zadeklarowane.
źródło
declare -p
/ teżtypeset -p
działabash
teraz.bash -c 'typeset -i a; typeset -p a'
i porównaj zksh93
lubzsh
.Jak wspomniano w odpowiedzi na SO , oto sposób na sprawdzenie:
gdzie $ {somevar + x} jest rozwinięciem parametru, którego wynikiem jest null, jeśli var jest nieustawiony i w przeciwnym razie zastępuje ciąg „x”.
Użycie
-n
, jak sugeruje druga odpowiedź, sprawdzi tylko, czy zmienna zawiera pusty ciąg znaków. Nie sprawdzi jego istnienia.źródło
$somevar
aby sobie poradzićIFS=x
. Albo to, albo cytatx
.if [ -z "${somevar+x}" ]
? Czy wycena nadal byłaby wymagana w środku[[
i]]
?[ test
procedury akceptować parametry wiersza poleceń, a więc zwykłe rozszerzenia i interpretacje jak zamawiać w zwykły sposób powinny być powołane do świadczenia na pw teście zastosowano to, co powinno doprowadzić do odczytania sposób przez każdego wiersza poleceń programu. test {! + "!"}set -u
obowiązuje, a wersja Bash jest wcześniejsza niż 4.2.POSIXly:
lub możesz pozwolić swojej powłoce pokazać ci wiadomość:
źródło
trap
może działać tylko na EXIT. To wszystko, co mówię - po prostu nie ma zastosowania jako zaliczenie / niezaliczenie. I to nie ja też mówię - zrobiłem to już wcześniej i potrzebowałem krótkiego komentarza na czacie, aby mnie przekonać. Pomyślałem, że zapłacę to dalej.źródło
sh
kompatybilne, a tego właśnie potrzebuję.... nic nie wydrukuje, gdy nie będzie. Lub...
... powie ci tak czy inaczej.
możesz użyć wartości zwracanej testu, aby dynamicznie rozwinąć ciąg znaków do odpowiedniego formatu dla swojego stanu:
Możesz również
printf
zawieść na podstawie zamiany ...... który wypisuje
$var does not exist!
na stderr i zwraca wartość inną niż 0, gdy$var
jest rozbrojony, ale drukuje$var does exist!
na stdout i zwraca 0, gdy$var
jest ustawiony.źródło
Ta prosta linia działa (i działa na większości powłok POSIX):
Lub, napisane w dłuższej formie:
Rozszerzenie to:
${var+"false"}
Ekspansja rozszerza albo „null” na „false”.Następnie wykonywane jest „nic” lub „fałsz” i ustawiany jest kod wyjścia.
Nie ma potrzeby wywoływania polecenia
test
([
lub[[
), ponieważ wartość wyjścia jest ustawiana przez (wykonanie) samego rozszerzenia.źródło
$IFS
zawiera f, a, l, s lub e. Podobnie jak w przypadku innych odpowiedzi, mamy do czynienia z tablicami, skrótami lub innymi typami zmiennych, o których warto wspomnieć.most POSIX shells
.most
znaczyIn the greatest number of instances
nie wszystko. ... ... Tak, w niejasnym staniewhen $IFS contains f, a, l, s or e
i dla jakiejś niejasnej powłokisome old versions of zsh
to się nie udaje: co za szok! Powinienem założyć, że taki błąd został rozwiązany dawno temu. ... ... Czy proponujesz, że musimy napisać kod dla już dawno zepsutych powłok?Czysty sposób:
Skrypt testowy:
Wyniki:
źródło
W wersji bash 4.4.19 działało dla mnie następujące. Oto kompletny przykład
źródło
Nie można użyć
if
polecenia do sprawdzenia istnienia deklarowanych zmiennych w bash, jednak-v
opcja istnieje w nowszym bash, ale nie jest przenośna i nie można jej używać w starszychbash
wersjach. Ponieważ kiedy używasz zmiennej, jeśli ona nie istnieje, narodzi się w tym samym czasie.Np. Wyobraź sobie, że nie użyłem ani nie przypisałem wartości do
MYTEST
zmiennej, ale kiedy używasz polecenia echo, nic ci to nie pokazuje! Lub jeśliif [ -z $MYTEST ]
go używasz zwrócił wartość zerową! Nie zwrócił innego statusu wyjścia, co oznacza, że ta zmienna nie istnieje!Teraz masz dwa rozwiązania (bez
-v
opcji):declare
polecenia.set
polecenia.Na przykład:
Ale niestety te polecenia pokazują również załadowane funkcje w pamięci! Możesz użyć
declare -p | grep -q MYTEST ; echo $?
polecenia, aby uzyskać czystszy wynik.źródło
Funkcja sprawdzająca, czy zmienna jest zadeklarowana / rozbrojona
w tym pusty
$array=()
Oprócz @ Gilles za odpowiedź
- czego nie znaleźć sposób, aby ująć go w obrębie funkcji - chciałbym dodać prostą wersję, która jest częściowo oparte na Richard Hansen „s odpowiedzi , ale odnosi się również pułapki, który występuje z pustym
array=()
:$1
zawiera nazwę pustego$array=()
, wywołanie deklaracji upewni się, że otrzymamy właściwy wynikZa pomocą następującego kodu można przetestować funkcje:
Skrypt powinien wrócić
źródło
funkcja bash, która działa zarówno na typy skalarne, jak i tablicowe :
definicja
wezwanie
źródło