@slm hat bereits die POSIX-Dokumente enthalten, die sehr hilfreich sind, aber nicht wirklich erläutern , wie diese Parameter kombiniert werden können, um sich gegenseitig zu beeinflussen. Dieses Formular ist hier noch nicht erwähnt:
${var?if unset parent shell dies and this message is output to stderr}
Dies ist ein Auszug aus einer anderen meiner Antworten , und ich denke, er zeigt sehr gut, wie diese funktionieren:
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?
Ein weiteres Beispiel aus demselben :
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
Das obige Beispiel nutzt alle 4 Formen der POSIX-Parametersubstitution und ihre verschiedenen :colon null
oder not null
Tests. Es gibt mehr Informationen im obigen Link und hier ist es wieder .
Eine andere Sache, über die die Leute oft nicht nachdenken, ${parameter:+expansion}
ist, wie nützlich sie in einem Here-Dokument sein kann. Hier ist ein weiterer Auszug aus einer anderen Antwort :
OBEN
Hier legen Sie einige Standardeinstellungen fest und bereiten das Drucken vor, wenn Sie dazu aufgefordert werden ...
#!/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
MITTE
Hier definieren Sie andere Funktionen, um Ihre Druckfunktion basierend auf deren Ergebnissen aufzurufen ...
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
}
UNTERSEITE
Sie haben jetzt alles eingerichtet. Hier können Sie Ihre Ergebnisse ausführen und abrufen.
_less_important_function
: "${PLACE:="the cemetery"}"
_more_important_function
: "${RESULT:="regret it."}"
_less_important_function
ERGEBNISSE
Ich werde gleich auf das Warum eingehen, aber das Ausführen des obigen Befehls führt zu den folgenden Ergebnissen:
_less_important_function()'s
erster Lauf:
Ich bin zum Haus deiner Mutter gegangen und habe Disney on Ice gesehen.
Wenn Sie Kalligraphie machen, werden Sie Erfolg haben.
dann _more_important_function():
Ich ging zum Friedhof und sah Disney on Ice.
Wenn Sie Heilmathematik machen, werden Sie Erfolg haben.
_less_important_function()
nochmal:
Ich ging zum Friedhof und sah Disney on Ice.
Wenn Sie Heilmathematik machen, werden Sie es bereuen.
WIE ES FUNKTIONIERT:
Das Hauptmerkmal hierbei ist das Konzept von. conditional ${parameter} expansion.
Sie können eine Variable nur dann auf einen Wert setzen, wenn sie in der folgenden Form nicht gesetzt oder null ist:
${var_name
: =desired_value}
Wenn Sie stattdessen nur eine nicht festgelegte Variable :colon
festlegen möchten , lassen Sie die Werte weg, und Nullwerte bleiben unverändert .
ON SCOPE:
Möglicherweise bemerken Sie dies im obigen Beispiel $PLACE
und $RESULT
werden geändert, wenn die Einstellung über ausgeführt wird parameter expansion
, obwohl _top_of_script_pr()
sie bereits aufgerufen wurde. Möglicherweise werden sie beim Ausführen festgelegt. Der Grund, warum dies funktioniert, ist, dass _top_of_script_pr()
es sich um eine ( subshelled )
Funktion handelt - ich habe sie eingeschlossen, parens
anstatt { curly braces }
sie für die anderen zu verwenden. Da es in einer Subshell aufgerufen wird, ist jede Variable, die es setzt, locally scoped
und wenn es zu seiner übergeordneten Shell zurückkehrt, verschwinden diese Werte.
Aber wenn _more_important_function()
legt $ACTION
es globally scoped
so wirkt es _less_important_function()'s
zweite Auswertung von $ACTION
da _less_important_function()
Sätze $ACTION
nur über${parameter:=expansion}.
man bash
; Suchen Sie nach dem Block "Parametererweiterung" (bei ca. 28%). Diese Zuweisungen sind z. B. Standardfunktionen: "Verwenden Sie den Standardwert nur, wenn noch keine festgelegt wurden."