$ {parametr: = słowo} Przypisz wartości domyślne. Jeśli parametr jest nieustawiony lub pusty, interpretacja słowa jest przypisywana do parametru. Wartość parametru jest następnie podstawiana. Nie można w ten sposób przypisywać parametrów pozycyjnych i parametrów specjalnych.
Pomyślałem, że mógłbym użyć tej funkcji do pisania ${LONG_VARIABLE_NAME:=hello}
zamiast dłuższego LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}
, ale teraz bash również próbuje wykonać `` cześć '', a to daje polecenie, którego nie znaleziono. Jakiś sposób, aby tego uniknąć? A może będę musiał trzymać się tego drugiego? Czy ktoś może podać przykład, w którym przypisanie wartości domyślnej jest rzeczywiście przydatne?
Odpowiedzi:
Użyj dwukropka:
: ${A:=hello}
Dwukropek to puste polecenie, które nic nie robi i ignoruje jego argumenty. Jest wbudowany w bash, więc nie jest tworzony nowy proces.
źródło
: ${A:=hello}
jest dokładnie tak długiA=${A:-hello}
. Wydaje się też, że ta ostatnia jest trochę mniej ezoteryczna, a jej cel jest wyraźniejszy. Używanie:
, które w zasadzie jest no-op, wydaje się niezdarne w porównaniu do sposobu, w jaki OP robił to wcześniej.:
podejście byłoby lepsze, zarówno do pisania, jak i do czytania. Tak, wydaje się, że to obszar, w którym Bash przydałby się niewielka poprawa.: ${VERY_LONG_VARIABLE_NAME:=hello}
vsVERY_LONG_VARIABLE_NAME=${VERY_LONG_VARIABLE_NAME:-hello}
. : . Mam nadzieję, że używasz w swoim kodzie opisowych nazw zmiennych :)VERY_LONG_VARIABLE_NAME=${VERY_LOGN_VARIABLE_NAME:-hello}
. Ups.A=$A:-hello
podejścia jest to, że samodokumentuje się, gdy jest uruchamiany zset -x
. Oznacza to, że przypisanie zostanie wydrukowane jako,A=hello
podczas gdy polecenie null wypisze tylko wartość (hello
).Przykłady można znaleźć pod adresem http://www.tldp.org/LDP/abs/html/parameter-substitution.html
${parameter-default}, ${parameter:-default}
Jeśli parametr nie jest ustawiony, użyj wartości domyślnej. Po wywołaniu parametr nadal nie jest ustawiony.
Obie formy są prawie równoważne. Dodatek
:
robi różnicę tylko wtedy, gdy parametr został zadeklarowany, ale ma wartość null.unset EGGS echo 1 ${EGGS-spam} # 1 spam echo 2 ${EGGS:-spam} # 2 spam EGGS= echo 3 ${EGGS-spam} # 3 echo 4 ${EGGS:-spam} # 4 spam EGGS=cheese echo 5 ${EGGS-spam} # 5 cheese echo 6 ${EGGS:-spam} # 6 cheese
${parameter=default}, ${parameter:=default}
Jeśli parametr nie jest ustawiony, ustaw wartość parametru na domyślną.
Obie formy są prawie równoważne. : Robi różnicę tylko wtedy, gdy parametr został zadeklarowany i ma wartość null
# sets variable without needing to reassign # colons suppress attempting to run the string unset EGGS : ${EGGS=spam} echo 1 $EGGS # 1 spam unset EGGS : ${EGGS:=spam} echo 2 $EGGS # 2 spam EGGS= : ${EGGS=spam} echo 3 $EGGS # 3 (set, but blank -> leaves alone) EGGS= : ${EGGS:=spam} echo 4 $EGGS # 4 spam EGGS=cheese : ${EGGS:=spam} echo 5 $EGGS # 5 cheese EGGS=cheese : ${EGGS=spam} echo 6 $EGGS # 6 cheese
${parameter+alt_value}, ${parameter:+alt_value}
Jeśli parametr jest ustawiony, użyj alt_value, w przeciwnym razie użyj łańcucha null. Po wywołaniu wartość parametru nie uległa zmianie.
Obie formy są prawie równoważne. : Robi różnicę tylko wtedy, gdy parametr został zadeklarowany i ma wartość null
unset EGGS echo 1 ${EGGS+spam} # 1 echo 2 ${EGGS:+spam} # 2 EGGS= echo 3 ${EGGS+spam} # 3 spam echo 4 ${EGGS:+spam} # 4 EGGS=cheese echo 5 ${EGGS+spam} # 5 spam echo 6 ${EGGS:+spam} # 6 spam
źródło
Rozwijanie parametru wartości domyślnej jest często przydatne w skryptach budowania, takich jak przykład poniżej. Jeśli użytkownik wywoła skrypt w takiej postaci, w jakiej jest, perl nie zostanie wbudowany. Użytkownik musi jawnie ustawić
WITH_PERL
wartość inną niż „nie”, aby został wbudowany.$ cat defvar.sh #!/bin/bash WITH_PERL=${WITH_PERL:-no} if [[ "$WITH_PERL" != no ]]; then echo "building with perl" # ./configure --enable=perl else echo "not building with perl" # ./configure fi
Buduj bez Perla
Buduj z Perlem
źródło
Możesz także użyć
:=
konstrukcji, aby przypisać i zdecydować o działaniu w jednym kroku. Rozważ następujący przykład:# Example of setting default server and reporting it's status server=$1 if [[ ${server:=localhost} =~ [a-z] ]] # 'localhost' assigned here to $server then echo "server is localhost" # echo is triggered since letters were found in $server else echo "server was set" # numbers were passed fi
Jeśli
$1
nie jest puste,localhost
zostanie przypisaneserver
w poluif
warunku, wyzwalanie dopasowania i zgłoszenie wyniku dopasowania. W ten sposób możesz przypisać w locie i wywołać odpowiednią akcję.źródło