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 saber readarray
para não adicionar a nova linha final \n
? Qual é o significado do último $
símbolo?
bash
bash-array
user1156544
fonte
fonte
"What is the meaning of the latest $ symbol?"
Respostas:
O caractere de nova linha à direita implícito não é adicionado pelo
readarray
built-in, mas pela string here (<<<
) debash
, consulte Por que uma string aqui bash adiciona um caractere à 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
fonte
Você pode usar split + glob (o que acontece quando você deixa uma expansão sem aspas nos contextos da lista). Isso fica no 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 depois invocá
readarray
-lo como nareadarray <<< "$string"
abordagem (observe também quereadarray -d
precisa de uma versão muito recentebash
).Note-se que apesar do
S
emIFS
(que significa separação ), que funciona da mesma forma quereadarray
na medida em quea,,b,
é dividido em"a"
,""
e"b"
única.Para um operador de divisão real, você pode usar
zsh
:(
@
aspas duplas e para preservar os elementos vazios).fonte
readarray <<< "$string"
grava em um arquivo tempp e o exclui em vez de usar a memória?readarray -d
Uma versão em lata da resposta de @ StéphaneChazelas:
O
local -
fará opções comoset -f
(noglob
) local para a função, assim como variáveis.O
declare -n a=$1
criará um local de variávela
como um alias para a variável global nomeada por$1
(o primeiro argumento para a função).fonte