Warum funktioniert der Separator von IFS nicht für die Array-Erweiterung?

Warum funktioniert der Separator von IFS nicht für die Array-Erweiterung?

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 IFSVariablen getrennt sind, wenn IFSdiese mindestens ein Zeichen enthält, oder durch ein getrennt sind, <space>wenn IFSsie nicht gesetzt ist, bzw. ohne Trennung, wenn IFSsie 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.

verwandte Informationen