VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR
Resultado:
[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')
Como posso dizer readarray
para não adicionar a nova linha final \n
? Qual é o significado do $
símbolo mais recente?
O caractere de nova linha à direita implícito não é adicionado pelo
readarray
builtin, mas pela string here (<<<
) debash
, consulte Por que uma string here bash adiciona um caractere de nova linha à direita? . Você pode se livrar disso imprimindo a string sem a nova linha usandoprintf
e lendo-a sobre uma técnica de substituição de processo< <()
geraria corretamente agora
Você pode usar split+glob (o que acontece quando você deixa uma expansão sem aspas em contextos de lista). Atrapalha o nosso caminho na maioria das vezes, seria uma pena não usá-lo quando realmente precisamos:
Isso é um pouco menos complicado do que escrever um arquivo temporário e chamá
readarray
-lo como nareadarray <<< "$string"
abordagem (observe também quereadarray -d
precisa de uma versão muito recente dobash
).Observe que, apesar do
S
inIFS
(que significa separador ), isso funciona da mesma maneirareadarray
quea,,b,
é dividido em"a"
,""
e"b"
somente.Para um operador de divisão real, você pode usar
zsh
:(as
@
e aspas duplas para preservar os elementos vazios).Uma versão enlatada da resposta de @StéphaneChazelas:
O
local -
fará opções comoset -f
(noglob
) locais para a função, assim como variáveis.O
declare -n a=$1
irá criar uma variável locala
como um alias para a variável global nomeada por$1
(o primeiro argumento para a função).