
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
IFS
variável seIFS
contiver pelo menos um caractere, ou separados por um<space>
ifIFS
não está definido ou sem separação seIFS
está 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.