Eine andere Möglichkeit, dies zu tun, besteht darin, den zu deklarierenden Parameter zu benennen und dies dann zu tun:
{ cat >./foo
chmod +x ./foo
eight=declared ./foo
eight=declared_and_preferred \
./foo 1 2 3 4 5 6 7 8
./foo 1 2 3 4 5 6 7 8
./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT
AUSGABE
$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default
Im obigen Beispiel wird die explizit deklarierte Umgebungsvariable dem Befehlszeilenargument vorgezogen, das Befehlszeilenargument wird jedoch verwendet, wenn die Umgebungsvariable entweder leer oder nicht gesetzt ist. Wenn sowohl die 8. Positions- als auch die Umgebungsvariable $eight
leer oder nicht gesetzt sind, wird der Standardwert some_default zugewiesen $eight
. In beiden Fällen :
kann das aus den Anweisungen :-
oder entfernt werden :=
, wenn leer ein akzeptabler Wert sein sollte.
Die Variable $eight
hätte auch so eingestellt werden können:
printf '$eight = %s\n' "${eight:=${8:-some_default}}"
... und die vorherige Zeile wurde komplett weggelassen, aber ich wollte demonstrieren, dass das Deklarieren einer Variablen auf diese Weise zu einem dauerhaften Wert führt, und habe dies in zwei Befehlen getan. In beiden Fällen $eight
wird der endgültige Wert dieser zusammengesetzten Parametererweiterung festgelegt.
getopts
- für robuste Skripte - ist oft die beste Möglichkeit, mit Befehlsoptionen umzugehen . Andererseits sind Positionsparameter fast immer das einfachste Mittel, um Operanden in einem Skript robust zu behandeln .
Beispielsweise:
touch file$(seq -ws\ file 100)
./foo *
AUSGABE
$eight = file008
Dort sehen wir nur den achten Operanden, aber 101 davon sind aus meinem Testverzeichnis entfernt.