
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
IFS
variable siIFS
contiene al menos un carácter, o separados por a<space>
ifIFS
no está establecido, o sin separación siIFS
está 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.