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

2

Eu quero limitar a alteração ao separador apenas ao seguinte comando echo não ao shell:

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

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

    
por Tim 02.06.2018 / 03:26

2 respostas

3

De POSIX, sobre $* :

When the expansion occurs in a context where field splitting will not be performed, the initial fields shall be joined to form a single field with the value of each parameter separated by the first character of the IFS variable if IFS contains at least one character, or separated by a <space> if IFS is unset, or with no separation if IFS is set to a null string.

Para unir palavras a um separador, você precisará usar $* ou ${array[*]} em bash :

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

Ou com uma matriz 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
    
por 02.06.2018 / 09:50
2

Compare:

$ 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:

@
… When the expansion occurs within double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2" ...

*
… When the expansion occurs within double quotes, it expands to a single word with the value of each parameter separated by the first character of the IFS special variable. That is, "$*" is equivalent to "$1c$2c...", where c is the first character of the value of the IFS variable.

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

    
por 02.06.2018 / 09:52

Tags