Ich schreibe ein Bash-Skript, das hat set -u
, und ich habe ein Problem mit der Erweiterung des leeren Arrays: Bash scheint ein leeres Array während der Erweiterung als nicht gesetzte Variable zu behandeln:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
( declare -a arr
hilft auch nicht.)
Eine übliche Lösung hierfür besteht darin, ${arr[@]-}
stattdessen eine leere Zeichenfolge anstelle des ("undefinierten") leeren Arrays zu verwenden. Dies ist jedoch keine gute Lösung, da Sie jetzt nicht zwischen einem Array mit einer einzelnen leeren Zeichenfolge und einem leeren Array unterscheiden können. (@ -expansion ist etwas Besonderes in Bash, es erweitert sich "${arr[@]}"
in "${arr[0]}" "${arr[1]}" …
, was es zu einem perfekten Werkzeug zum Erstellen von Befehlszeilen macht.)
$ countArgs() { echo $#; }
$ countArgs a b c
3
$ countArgs
0
$ countArgs ""
1
$ brr=("")
$ countArgs "${brr[@]}"
1
$ countArgs "${arr[@]-}"
1
$ countArgs "${arr[@]}"
bash: arr[@]: unbound variable
$ set +u
$ countArgs "${arr[@]}"
0
Gibt es also einen Weg, um dieses Problem zu umgehen, außer die Länge eines Arrays in einem zu überprüfen if
(siehe Codebeispiel unten) oder die -u
Einstellung für dieses kurze Stück zu deaktivieren?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
Update: Entfernt - bugs
Tag aufgrund Erklärung von Ikegami.
"${arr[@]}"
. Vermisse ich etwas Soweit ich sehen kann, funktioniert es zumindest in5.x
.