
Ich möchte die Änderung des Trennzeichens nur auf den folgenden Echo-Befehl beschränken und nicht auf die Shell:
$ myarr=(1 2 3)
$ echo $( IFS="|"; echo "${myarr[@]}" )
1 2 3
Warum funktioniert der Separator bei der Array-Erweiterung nicht? Danke.
Antwort1
Von POSIX,hinsichtlich$*
:
Wenn die Erweiterung in einem Kontext erfolgt, in dem keine Feldaufteilung durchgeführt wird, müssen die ursprünglichen Felder zu einem einzigen Feld zusammengefügt werden, wobei die Werte der einzelnen Parameter durch das erste Zeichen der
IFS
Variablen getrennt sind, wennIFS
diese mindestens ein Zeichen enthält, oder durch ein getrennt sind,<space>
wennIFS
sie nicht gesetzt ist, bzw. ohne Trennung, wennIFS
sie auf eine Nullzeichenfolge gesetzt ist.
Um Wörter mit einem Trennzeichen zu verbinden, müssen Sie $*
oder ${array[*]}
in verwenden bash
:
$ set -- word1 word2 word3 "some other thing" word4
$ IFS='|'
$ echo "$*"
word1|word2|word3|some other thing|word4
Oder mit einem Array in bash
:
$ arr=( word1 word2 word3 "some other thing" word4 )
$ IFS='|'
$ echo "${arr[*]}"
word1|word2|word3|some other thing|word4
Mit Ihrem Code:
$ myarr=( 1 2 3 )
$ echo "$( IFS="|"; echo "${myarr[*]}" )"
1|2|3
Antwort2
Vergleichen:
$ myarr=(1 2 3)
$ printf '%s\n' $( IFS="|"; echo "${myarr[@]}" )
1
2
3
$ printf '%s\n' $( IFS="|"; echo "${myarr[*]}" )
1|2|3
Von Man Bash:
@
… Wenn die Erweiterung in Anführungszeichen erfolgt, wird jeder Parameter zu einem eigenen Wort erweitert. Das heißt,"$@" ist gleichbedeutend mit "$1" "$2"...*
… Wenn die Erweiterung in Anführungszeichen erfolgt, wird sie zu einem einzelnen Wort erweitert mitder Wert jedes Parameters, getrennt durch das erste Zeichen der IFS-Sondervariable. Das ist,„$*“ entspricht „$1c$2c…“, wobei c das erste Zeichen des Wertes der IFS-Variable ist.
Die obige Beschreibung bezieht sich auf Positionsparameter, gilt jedoch auch für Array-Erweiterungen.