Chciałbym się upewnić, że w pewnym momencie skryptu, po source
wczytaniu pliku konfiguracyjnego, ustawionych jest kilka zmiennych, a jeśli tak nie jest, zatrzymanie wykonywania, informowanie użytkownika o brakującej zmiennej. próbowałem
for var in $one $two $three ; do
...
ale jeśli na przykład $two
nie jest ustawiony, pętla nigdy nie zostanie wykonana $two
. Następną rzeczą, jakiej próbowałem, było
for var in one two three ; do
if [ -n ${!var} ] ; then
echo "$var is set to ${!var}"
else
echo "$var is not set"
fi
done
Ale jeśli dwa nie są ustawione, nadal otrzymuję „dwa są ustawione na” zamiast „dwa nie są ustawione”.
Jak mogę się upewnić, że wszystkie wymagane zmienne są ustawione?
Aktualizacja / rozwiązanie: Wiem, że istnieje różnica między „zestawem” a „zestawem, ale pustym”. Teraz używam (dzięki /programming//a/16753536/3456281 i odpowiedzi na to pytanie):
if [ -n "${!var:-}" ] ; then
więc jeśli var
jest ustawione, ale puste, nadal jest uważane za nieprawidłowe.
źródło
set -u
na początku skryptu, aby zakończyć go natychmiast po użyciu zmiennej nieustalonej.Odpowiedzi:
Błąd cytowania.
Na przyszłość: ustawienie
przed uruchomieniem kodu pokazałby ci problem. Zamiast dodawać to do kodu, możesz wywołać swój skrypt za pomocą
źródło
set -- $(IFS=, ; echo $cs)
? Ludzie, którzy muszą zapytać, dlaczegoif [ -n ${!var} ] ; then
nie działa? Prawdopodobnie nie.Jedyne, czego potrzebujesz, to cytaty w teście:
Pracuje dla mnie.
źródło
Jeśli chcesz zatrzymać program:
To załatwi sprawę. Każda wiadomość po znaku zapytania jest drukowana
stderr
i skorupa rodzica umiera. Cóż, OK, więc nie każda wiadomość - tylko jedna - tylko pierwsza, która się nie powiedzie, drukuje wiadomość, ponieważ powłoka umiera. Lubię używać tych testów w ten sposób:Miałem dużo więcej do powiedzenia na ten temat tutaj .
źródło
Możesz dodać
na początku skryptu, aby zakończył się, gdy próbuje użyć zmiennej nieustawionej.
Skrypt jak
spowoduje
Jeśli
bash
zamiast tego używasz , błąd będzie wyglądał następująco:źródło
set -u
zapobiega dokładnie temu rodzajowi błędu, którego OP próbuje uniknąć i (w przeciwieństwie do wszystkich innych rozwiązań) nie ogranicza się do określonego zestawu zmiennych. W rzeczywistości jest użytecznym środkiem ostrożności dla prawie wszystkich skryptów powłoki, aby bezpiecznie zawiodły, zamiast robić nieoczekiwane rzeczy, gdy zmienna nie jest ustawiona. Ten artykuł stanowi przydatne odniesienie do tematu.set -u
myślę, że można go również użyć, ale nie jest tak elastyczny, jak poprawne rozszerzenie parametrów (zobacz moje zaktualizowane pytanie). Przy pomocyset -u
musiałbym uzyskać dostęp do wszystkich zmiennych docelowych, jeśli chcę sprawdzić ich obecność w jednym miejscu.Rozwiązanie, które jest maksymalnie przyjazne, testuje wszystkie wymagania i zgłasza je razem, zamiast zawodzić przy pierwszym i wymagając w jedną i drugą stronę, aby wszystko działało poprawnie:
Używam zmiennej tablicowej do śledzenia, które zmienne nie zostały ustawione, i wykorzystuję wynik do napisania komunikatu skierowanego do użytkownika.
Uwagi:
${required_vars[@]}
wfor
pętli głównie z przyzwyczajenia - nie radziłbym umieszczać żadnych metaznaków powłoki w nazwach zmiennych!${#missing_vars[@]}
, ponieważ zawsze jest to liczba całkowita, nawet jeśli jesteś wystarczająco przewrotny, aby zignorować poprzednią radę.%q
podczas drukowania;%s
byłoby zwykle wystarczające.>&2
, więc nie są przekazywane do dalszych poleceńźródło
bash
4.2 pozwala ci sprawdzić, czy zmienna jest ustawiona z-v
operatorem; nieustawiona zmienna i zmienna ustawiona na pusty ciąg znaków to dwa różne warunki:źródło
-v
bierze nazwę zmiennej, takfor var in one two three; [[ -v $var ]] && ...; done
by sprawdzić, czy każdaone
,two
ithree
są ustawione w kolejności.Myślę, że jeśli masz na myśli
not set
, więc zmiennej nigdy nie wolno inicjować. Jeśli użyjesz[ -n "${!var}" ]
, więc pusta zmienna jak nietwo=""
będzie działać, gdy jest ustawiona . Możesz spróbować:źródło
Zwięzłe (choć nieco zhackowane) rozwiązanie, aby obsłużyć przypadek, w którym
source
skrypt d ustawia zmienne na wartość zerową, to inicjuje zmienne do jakiejś specjalnej wartości przed pozyskaniem skryptu, a następnie sprawdza tę wartość później npźródło
Rozszerzyłem odpowiedź @ mikeserv .
Ta wersja pobiera listę zmiennych w celu sprawdzenia obecności, wypisuje nazwę brakującej zmiennej i wyzwala wywołanie funkcji use () w przypadku błędu.
Przykładowe dane wyjściowe, gdy brakuje wartości:
Zauważ, że możesz zmienić zmienną o nazwie VALUE na alternatywną nazwę, która bardziej odpowiada twojemu pożądanemu wynikowi.
źródło