Andreas Kohlbach <
a...@spamfence.net>:
Wenn der Parser im Shell, der die Kommandozeile zerlegt, erkennt,
dass das dem „$“ folgende Zeichen der Beginn eines
Variablennamens sein könnte, versucht er, auch die ihm folgenden
Zeichen dem Variablennamen zuzuschlagen; und er fährt damit so
lange fort, bis er auf ein Zeichen stößt, das nicht Teil eines
Variablennamens sein kann.
=> Da die Zeichen „_“, „n“, „u“, „m“, „e“ und „r“ in
Variablennamen vorkommen können, vereinnahmt sie der Parser
dafür. Ob es dabei eine Variable mit dem so entstandenen
Namen tatsächlich gibt, juckt den Parser nicht.
Im Gegensatz dazu können die Zeichen „"“ und „}“ kein Teil eines
Variablennamens sein. Daher zeigen sie dem Parser das Ende des
Variablennamens an.
Die eine Lösung, Variablennamen stets in Anführungszeichen zu
setzen, hast du bereits selbst erkannt, die andere, sie stets
mittels der Variablenexpansionssyntax „${…}“ zu verwenden, hat
Stefan in seiner unnachahmlichen Art aufgezeigt. (Auch die
Kombination mit Schweifklammern und Anführungszeichen „"${…}"“
ist möglich.)
Weil es hier gerade um Parameter‐Expansionen („parameter“ ist im
POSIX‐Standard der Oberbegriff, der Variable mit Namen, spezielle
Parameter wie beispielsweise „$?“, „$!“, „$#“ oder „$-“, und die
positional parameters (s. u.) umfasst) geht:
Ein wenig anders verhält es sich bei den positional parameters,
die „Namen“ haben, die nur aus Ziffern bestehen, wie „$0“,
„$1“ und so fort. Da erkennt der Parser ohne die
Schweifklammerschreibweise „${…}“ nur einstellige Zahlen, also
von 0 bis 9. Ab dem zehnten Parameter sind die Schweifklammern
(also Stefans Rat) Pflicht.
Probiere die folgende Kommandozeile aus:
(
set -- eins zwei drei vier fuenf \
sechs sieben acht neun zehn elf zwoelf &&
printf '%s\n' 'Ohne Schweifklammern:' &&
printf '%s\n' "$1" "$2" "$3" "$4" "$5" \
"$6" "$7" "$8" "$9" "$10" "$11" "$12" &&
printf '%s\n' 'Mit Schweifklammern:' &&
printf '%s\n' "${1}" "${2}" "${3}" "${4}" "${5}" \
"${6}" "${7}" "${8}" "${9}" "${10}" "${11}" "${12}"
)
Beobachte, was aus „"$10"“, „"$11"“ und „"$12"“ für eine Ausgabe
entsteht.