@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:
${var?if unset parent shell dies and this message is output to stderr}
To jest fragment mojej innej odpowiedzi i myślę, że bardzo dobrze pokazuje, jak działają:
sh <<-\CMD
_input_fn() { set -- "$@" #redundant
echo ${*?WHERES MY DATA?}
#echo is not necessary though
shift #sure hope we have more than $1 parameter
: ${*?WHERES MY DATA?} #: do nothing, gracefully
}
_input_fn heres some stuff
_input_fn one #here
# shell dies - third try doesnt run
_input_fn you there?
# END
CMD
heres some stuff
one
sh: line :5 *: WHERES MY DATA?
Kolejny przykład z tego samego :
sh <<-\CMD
N= #N is NULL
_test=$N #_test is also NULL and
v="something you would rather do without"
( #this subshell dies
echo "v is ${v+set}: and its value is ${v:+not NULL}"
echo "So this ${_test:-"\$_test:="} will equal ${_test:="$v"}"
${_test:+${N:?so you test for it with a little nesting}}
echo "sure wish we could do some other things"
)
( #this subshell does some other things
unset v #to ensure it is definitely unset
echo "But here v is ${v-unset}: ${v:+you certainly wont see this}"
echo "So this ${_test:-"\$_test:="} will equal NULL ${_test:="$v"}"
${_test:+${N:?is never substituted}}
echo "so now we can do some other things"
)
#and even though we set _test and unset v in the subshell
echo "_test is still ${_test:-"NULL"} and ${v:+"v is still $v"}"
# END
CMD
v is set: and its value is not NULL
So this $_test:= will equal something you would rather do without
sh: line 7: N: so you test for it with a little nesting
But here v is unset:
So this $_test:= will equal NULL
so now we can do some other things
_test is still NULL and v is still something you would rather do without
Powyższy przykład wykorzystuje wszystkie 4 formy podstawiania parametrów POSIX i ich różne :colon null
lub not 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 ...
#!/bin/sh
_top_of_script_pr() (
IFS="$nl" ; set -f #only split at newlines and don't expand paths
printf %s\\n ${strings}
) 3<<-TEMPLATES
${nl=
}
${PLACE:="your mother's house"}
${EVENT:="the unspeakable."}
${ACTION:="heroin"}
${RESULT:="succeed."}
${strings:="
I went to ${PLACE} and saw ${EVENT}
If you do ${ACTION} you will ${RESULT}
"}
#END
TEMPLATES
ŚRODKOWY
Tutaj definiujesz inne funkcje, które mają być wywoływane w funkcji drukowania na podstawie ich wyników ...
EVENT="Disney on Ice."
_more_important_function() { #...some logic...
[ $((1+one)) -ne 2 ] && ACTION="remedial mathematics"
_top_of_script_pr
}
_less_important_function() { #...more logic...
one=2
: "${ACTION:="calligraphy"}"
_top_of_script_pr
}
DOLNY
Masz już wszystko skonfigurowane, więc tutaj wykonasz i wyciągniesz wyniki.
_less_important_function
: "${PLACE:="the cemetery"}"
_more_important_function
: "${RESULT:="regret it."}"
_less_important_function
WYNIKI
Zaraz się zastanowię, dlaczego, ale uruchomienie powyższego daje następujące wyniki:
_less_important_function()'s
pierwszy bieg:
Poszedłem do domu twojej matki i zobaczyłem Disneya na lodzie.
Jeśli wykonasz kaligrafię , odniesiesz sukces.
następnie _more_important_function():
Poszedłem na cmentarz i zobaczyłem Disneya na lodzie.
Jeśli wykonasz matematykę naprawczą , odniesiesz sukces.
_less_important_function()
jeszcze raz:
Poszedłem na cmentarz i zobaczyłem Disneya na lodzie.
Jeśli uczysz matematyki naprawczej, będziesz tego żałować.
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:
${var_name
: =desired_value}
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
to globally scoped
tak wpływa _less_important_function()'s
drugą ocenę $ACTION
ponieważ _less_important_function()
zestawów $ACTION
tylko poprzez${parameter:=expansion}.
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”.