Por que um elemento de um array construído com 'readarray' ganha um fictício '\ n' quando está entre aspas duplas?

0

Encontrei um comportamento de readarray que não consigo chegar ao fundo de mim mesmo.

O seguinte código:

readarray array < <(echo -e "Jenny\nJane\nJessica")

echo "* Not enclosed:"
for ((i=0; i<${#array[@]}; i++)); do
    echo ${array[$i]}
done

echo "* Enclosed:"
for ((i=0; i<${#array[@]}; i++)); do
    echo "${array[$i]}"
done

Produz a seguinte saída:

* Not enclosed:
Jenny
Jane
Jessica
* Enclosed:
Jenny

Jane

Jessica

Por que exatamente os elementos se tornam espaçados quando estão entre " " como este?
Mesmo se eu substitui echo "${array[$i]}" por uma variável como esta:

foo=${array[$i]}
echo "$foo"

A saída ainda fica espaçada.
Mas note que se eu declarar o array da maneira usual, array=("Jenny" "Jane "Jessica") no espaçamento será inserido independentemente das aspas.

Razão pela qual isso está causando problemas porque estou fazendo um loop em uma matriz e preciso usar o elemento dentro de uma frase e fazer o eco. Por exemplo:

readarray array < <(echo -e "Jenny\nJane\nJessica")
for ((i=0; i<${#array[@]}; i++)); do
    echo "Hello, ${array[$i]}!"
done

No entanto, ${array[$i]} está entre " " , então \n é inserido e a saída se torna:

Hello, Jenny
!
Hello, Jane
!
Hello, Jessica
!
    
por Yanevski 05.04.2017 / 03:05

1 resposta

2

É porque o readarray não remove o delimitador (nova linha por padrão), a menos que seja chamado com a opção -t .

Usando o declare -p var mais simples para imprimir valores de matriz, veja isto:

$ readarray array < <(echo -e "Jenny\nJane\nJessica")
$ declare -p array
declare -a array=([0]=$'Jenny\n' [1]=$'Jane\n' [2]=$'Jessica\n')

Você pode ver as novas linhas finais de cada elemento.

Enquanto isso:

$ readarray -t array < <(echo -e "Jenny\nJane\nJessica")
$ declare -p array
declare -a array=([0]="Jenny" [1]="Jane" [2]="Jessica")

não tem novas linhas iniciais.

O uso de uma expansão de variável sem nome é apenas uma má ideia, apenas não.

    
por 05.04.2017 / 08:18