Patrzyłem na kilka skryptów, które napisali inni ludzie (szczególnie Red Hat), a wiele ich zmiennych przypisuje się za pomocą poniższej notacji
VARIABLE1="${VARIABLE1:-some_val}"
lub niektóre rozwijają inne zmienne
VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
Po co używać tej notacji zamiast po prostu deklarować wartości bezpośrednio (np. VARIABLE1=some_val
)?
Czy są jakieś zalety tej notacji lub możliwe błędy, których można by uniknąć?
Czy :-
ma to szczególne znaczenie w tym kontekście?
bash
shell-script
scripting
variable
Rothgar
źródło
źródło
man bash
; wyszukaj blok „Rozszerzanie parametrów” (około 28%). Te przypisania to np. Funkcje domyślne: „Użyj wartości domyślnej tylko wtedy, gdy nie ustawiono jeszcze żadnej”.Odpowiedzi:
Ta technika pozwala na przypisanie zmiennej wartości, jeśli inna zmienna jest pusta lub niezdefiniowana. UWAGA: Ta „inna zmienna” może być tą samą lub inną zmienną.
fragment
UWAGA: Formularz ten działa również
${parameter-word}
. Jeśli chcesz zobaczyć pełną listę wszystkich form ekspansji parametrów dostępnych w Bash, gorąco polecam przyjrzeć się temu tematowi w wiki Bash Hackera zatytułowanym: „ Rozbudowa parametrów ”.Przykłady
zmienna nie istnieje zmienna istniejeTo samo można zrobić, oceniając inne zmienne lub uruchamiając polecenia w części wartości domyślnej notacji.
Więcej przykładów
Możesz również użyć nieco innej notacji, gdy jest to po prostu
VARX=${VARX-<def. value>}
.W powyższym
$VAR1
i$VAR2
zostały już zdefiniowane z napisu „ma inną wartość”, ale$VAR3
była niezdefiniowana, więc wartość domyślna użyto zamiast0
.Inny przykład
Sprawdzanie i przypisywanie za pomocą
:=
notacjiWreszcie będę wspominać operatora poręczne
:=
. Spowoduje to sprawdzenie i przypisanie wartości, jeśli badana zmienna jest pusta lub niezdefiniowana.Przykład
Zauważ, że
$VAR1
teraz jest ustawiony. Operator:=
wykonał test i przydział w jednej operacji.Jeśli jednak wartość zostanie ustawiona wcześniej, pozostawia się ją samą.
Poręczna tabela referencyjna Dandy
Bibliografia
źródło
bash
. Ten${var:-word}
w Q jest, ale nie${var-word}
powyższy. Dokumentacja POSIX ma jednak fajną tabelę, być może warto ją skopiować do tej odpowiedzi - pubs.opengroup.org/onlinepubs/9699919799/utilities/…echo "${FOO:=default}"
jest świetne, jeśli naprawdę chceszecho
. Ale jeśli tego nie zrobisz, wypróbuj:
wbudowany ...: ${FOO:=default}
Twój$FOO
jest ustawionydefault
jak wyżej (tzn. Jeśli nie jest jeszcze ustawiony). Ale$FOO
w tym procesie nie ma echa .${4:-$VAR}
będzie działać.@slm zawiera już dokumenty POSIX - które są bardzo pomocne - ale tak naprawdę nie rozwijają sposobu łączenia tych parametrów, aby wpływać na siebie nawzajem. Nie ma jeszcze żadnej wzmianki o tym formularzu:
To jest fragment mojej innej odpowiedzi i myślę, że bardzo dobrze pokazuje, jak działają:
Kolejny przykład z tego samego :
Powyższy przykład wykorzystuje wszystkie 4 formy podstawiania parametrów POSIX i ich różne
:colon null
lubnot null
testy. Więcej informacji znajduje się w powyższym linku, a oto znowu .Inną rzeczą, o której ludzie często nie myślą,
${parameter:+expansion}
jest to, jak bardzo może być przydatna w niniejszym dokumencie. Oto kolejny fragment innej odpowiedzi :TOP
Tutaj ustawisz niektóre wartości domyślne i przygotujesz się do ich wydrukowania po wywołaniu ...
ŚRODKOWY
Tutaj definiujesz inne funkcje, które mają być wywoływane w funkcji drukowania na podstawie ich wyników ...
DOLNY
Masz już wszystko skonfigurowane, więc tutaj wykonasz i wyciągniesz wyniki.
WYNIKI
Zaraz się zastanowię, dlaczego, ale uruchomienie powyższego daje następujące wyniki:
JAK TO DZIAŁA:
Kluczową cechą tutaj jest koncepcja
conditional ${parameter} expansion.
Można ustawić zmienną na wartość tylko wtedy, gdy jest ona nieustawiona lub zerowa przy użyciu formularza:Jeśli zamiast tego chcesz ustawić tylko zmienną nieuzbrojoną, pominiesz,
:colon
a wartości null pozostaną bez zmian.W ZAKRESIE:
Możesz zauważyć to w powyższym przykładzie
$PLACE
i$RESULT
zmienić się po ustawieniu za pośrednictwem,parameter expansion
nawet jeśli_top_of_script_pr()
zostało już wywołane, prawdopodobnie ustawiając je po uruchomieniu. Powodem, dla którego to działa,_top_of_script_pr()
jest( subshelled )
funkcja - ja ją zawarłem,parens
a nie{ curly braces }
użyłem dla innych. Ponieważ jest wywoływana w podpowłoce, każda ustawiona przez nią zmienna jest,locally scoped
a po powrocie do powłoki macierzystej wartości te znikają.Ale kiedy
_more_important_function()
ustawia$ACTION
toglobally scoped
tak wpływa_less_important_function()'s
drugą ocenę$ACTION
ponieważ_less_important_function()
zestawów$ACTION
tylko poprzez${parameter:=expansion}.
źródło
Osobiste doświadczenie.
Czasem używam tego formatu w swoich skryptach, aby zastępować wartości ad-hoc, np. Jeśli mam:
Mogę biec:
bez konieczności zmiany oryginalnej wartości domyślnej
SOMETHING
.źródło