2010-12-14 17 views
82

$ {parametr: = słowo} Przypisz wartości domyślne. Jeśli parametr jest nieustawiony lub nie ma wartości null, rozszerzenie wyrazu jest przypisane do parametru . Wartość parametru to , a następnie podstawiona. Parametry pozycji i specjalne parametry mogą nie być przypisane w ten sposób.bash przypisz wartość domyślną

Myślałem, że mogę korzystać z tej funkcji, aby napisać ${LONG_VARIABLE_NAME:=hello} zamiast dłuższej LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}, ale teraz bash także próbuje wykonać „cześć” i że wyda polecenie nie znaleziono. Jakikolwiek sposób tego uniknąć? Czy będę musiał trzymać się tego ostatniego? Czy ktoś może podać przykład, w którym domyślne przypisanie jest rzeczywiście przydatne?

+10

Przy cytowaniu tekstu pomocne jest dołączenie linku do źródła. –

Odpowiedz

137

pomocą dwukropka:

: ${A:=hello} 

okrężnicy null poleceń, które nic nie robi i ignoruje swoje argumenty. Jest wbudowany w bash, więc nowy proces nie jest tworzony.

+58

Nie mogę pomóc, ale zauważ, że ': $ {A: = hello}' jest dokładnie tak długie jak 'A = $ {A: -hello}'.Wydaje się również, że ta ostatnia jest nieco mniej ezoteryczna, a jej intencje są bardziej jasne. Używanie ':', które jest zasadniczo no-op, wydaje się kludgy w porównaniu do sposobu, w jaki OP robił to wcześniej. –

+0

@DanMoulding: Nie sądzę, aby którekolwiek z tych rozwiązań było zadowalające. Nie lubię jąkania drugiego formularza, więc nieco wolę przebieg linii ':' na początku skryptu, aby ustawić wartości domyślne. (również są one tej samej długości dla nazw zmiennych pojedynczego znaku). – camh

+2

@camh: Zgoda. Widzę, gdzie, gdybyś miał wiele zmiennych do zainicjowania wartości domyślnych i mają długie nazwy, podejście ":" byłoby preferowane, zarówno do pisania, jak i czytania. Tak, wygląda to na obszar, w którym Bash może trochę poprawić. –

14

Rozbudowywanie domyślnego parametru wartości jest często przydatne w skryptach kompilacji, takich jak przykład poniżej. Jeśli użytkownik po prostu wywołuje skrypt jak jest, Perl nie zostanie zbudowany w. Użytkownik musi jawnie ustawić WITH_PERL na wartość inną niż „nie” mają to wbudowane w.

$ 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 

Budowanie bez Perl

$ ./defvar.sh 
not building with perl 

Budowa z Perl

$ WITH_PERL=yes ./defvar.sh 
building with perl 
+0

dzięki za odpowiedź. – zedoo

31

Proszę spojrzeć na http://www.tldp.org/LDP/abs/html/parameter-substitution.html przykłady

${parameter-default}, ${parameter:-default} 

Jeśli parametr nie ustawione, użyj domyślnego. Po wywołaniu parametr nadal nie jest ustawiony.
Obie formy są prawie równoważne. Dodatkowa wartość : ma znaczenie 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 do wartości domyślnych.
Obie formy są prawie równoważne. : Robi różnicę tylko wtedy, gdy parametr został zadeklarowany i jest 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 zestaw parametrów, należy użyć alt_value, innego wykorzystania łańcuch pusty. Po zakończeniu połączenia wartość parametru nie uległa zmianie.
Obie formy są prawie równoważne. The: 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 
+2

to nie jest bardzo jasne, niestety :( –

Powiązane problemy