¿Por qué el separador de IFS no funciona para la expansión del arreglo?

¿Por qué el separador de IFS no funciona para la expansión del arreglo?

Quiero limitar el cambio al separador solo al siguiente comando echo, no al shell:

$ myarr=(1 2 3)

$ echo $( IFS="|"; echo "${myarr[@]}" )
1 2 3

¿Por qué el separador no funciona para la expansión de la matriz? Gracias.

Respuesta1

Desde POSIX,acerca de$*:

Cuando la expansión ocurre en un contexto donde no se realizará la división de campos, los campos iniciales se unirán para formar un solo campo con el valor de cada parámetro separado por el primer carácter de la IFSvariable si IFScontiene al menos un carácter, o separados por a <space>if IFSno está establecido, o sin separación si IFSestá establecido en una cadena nula.

Para unir palabras con separador, tendrás que utilizar $*, o ${array[*]}en bash:

$ set -- word1 word2 word3 "some other thing" word4
$ IFS='|'
$ echo "$*"
word1|word2|word3|some other thing|word4

O, con una matriz en bash:

$ arr=( word1 word2 word3 "some other thing" word4 )
$ IFS='|'
$ echo "${arr[*]}"
word1|word2|word3|some other thing|word4

Con tu código:

$ myarr=( 1 2 3 )
$ echo "$( IFS="|"; echo "${myarr[*]}" )"
1|2|3

Respuesta2

Comparar:

$ myarr=(1 2 3)
$ printf '%s\n' $( IFS="|"; echo "${myarr[@]}" )
1
2
3
$ printf '%s\n' $( IFS="|"; echo "${myarr[*]}" )
1|2|3

De hombre bash:

@
... Cuando la expansión se produce entre comillas dobles, cada parámetro se expande a una palabra separada. Eso es,"$@" equivale a "$1" "$2"...

*
… Cuando la expansión ocurre entre comillas dobles, se expande a una sola palabra conel valor de cada parámetro separado por el primer carácter de la variable especial IFS. Eso es,"$*" equivale a "$1c$2c...", donde c es el primer carácter del valor de la variable IFS.

La descripción anterior es para parámetros posicionales pero también se aplica a expansiones de matrices.

información relacionada