Ich kämpfe mit dieser Situation:
$ set -- 1 2 3
$ a="$@"
$ echo "$a"
1 2 3
Was ich unerwartet finde, ist die Aufgabe selbst.
man bash
sagt dies über die "$@"
Erweiterung:
Wenn die Erweiterung in doppelten Anführungszeichen erfolgt, wird jeder Parameter zu einem separaten Wort erweitert.
Das sollte also analog sein zu:
b="1" "2" "3"
bash: 2: command not found
Und dafür ist die "$*"
Erweiterung gedacht:
Wenn die Erweiterung in doppelten Anführungszeichen erfolgt, wird sie zu einem einzelnen Wort erweitert, wobei der Wert jedes Parameters durch das erste Zeichen der IFS-Spezialvariablen getrennt ist. Das heißt, "$ *" entspricht "$ 1c $ 2c ...", wobei c das erste Zeichen des Werts der IFS-Variablen ist. Wenn IFS nicht gesetzt ist, werden die Parameter durch Leerzeichen getrennt. Wenn IFS null ist, werden die Parameter ohne dazwischenliegende Trennzeichen verbunden.
Und so sollte das richtig sein:
$ set -- 1 2 3
$ a="$*"
$ echo "$a"
1 2 3
Warum ergibt sich "$@"
das gleiche? Sie sollen sich in diesem Punkt unterscheiden. Ist das ein Bash-Problem oder mein Missverständnis?
Shellcheck erkennt dies als SC2124 . Ich kann auch ein Beispiel liefern, das SC2145 auslöst .
Es wird beobachtet am:
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
4.9.0-6-amd64 #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02) x86_64 GNU/Linux