Por que o separador do IFS não funciona para expansão de array?

Por que o separador do IFS não funciona para expansão de array?

Quero limitar a alteração no separador apenas ao seguinte comando echo, não ao shell:

$ myarr=(1 2 3)

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

Por que o separador não funciona para expansão de array? Obrigado.

Responder1

Do POSIX,a respeito de$*:

Quando a expansão ocorrer em um contexto onde não será realizada a divisão de campos, os campos iniciais deverão ser unidos formando um único campo com o valor de cada parâmetro separado pelo primeiro caractere da IFSvariável se IFScontiver pelo menos um caractere, ou separados por um <space>if IFSnão está definido ou sem separação se IFSestá definido como uma string nula.

Para juntar palavras com um separador, você terá que usar $*, ou ${array[*]}em bash:

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

Ou, com um array em bash:

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

Com seu código:

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

Responder2

Comparar:

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

Do homem bash:

@
… Quando a expansão ocorre entre aspas duplas, cada parâmetro se expande para uma palavra separada. Aquilo é,"$@" é equivalente a "$1" "$2"...

*
… Quando a expansão ocorre entre aspas duplas, ela se expande para uma única palavra como valor de cada parâmetro separado pelo primeiro caractere da variável especial IFS. Aquilo é,"$*" é equivalente a "$1c$2c...", onde c é o primeiro caractere do valor da variável IFS.

A descrição acima é para parâmetros posicionais, mas também se aplica a expansões de array.

informação relacionada