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')
¿Cómo puedo decir que readarray
no agregue la nueva línea final \n
? ¿Cuál es el significado del último $
símbolo?
bash
bash-array
usuario1156544
fuente
fuente
"What is the meaning of the latest $ symbol?"
Respuestas:
El carácter implícito de la nueva línea final no se agrega por el
readarray
builtin incorporado, sino por el here-string (<<<
) debash
, vea ¿Por qué un bash here-string agrega un carácter de nueva línea final? . Puede deshacerse de eso imprimiendo la cadena sin usar la nueva líneaprintf
y leerla sobre una técnica de sustitución de proceso< <()
generaría correctamente ahora
fuente
Puede usar split + glob (lo que sucede cuando deja una expansión sin comillas en contextos de lista). Se interpone en nuestro camino la mayor parte del tiempo, sería una pena no usarlo cuando realmente lo necesitamos:
Eso es un poco menos complicado que escribir un archivo temporal y luego invocarlo
readarray
como en elreadarray <<< "$string"
enfoque (también tenga en cuenta quereadarray -d
necesita una versión muy reciente debash
).Tenga en cuenta que a pesar de
S
inIFS
(que significa separador ), eso funciona de la misma manerareadarray
quea,,b,
se divide en"a"
,""
y"b"
solo.Para un operador de división real, puede usar
zsh
en su lugar:(las
@
comillas dobles y para preservar los elementos vacíos).fuente
readarray <<< "$string"
Escribe en un archivo tempp y luego lo elimina en lugar de usar la memoria?readarray -d
Una versión enlatada de la respuesta de @ StéphaneChazelas:
El
local -
hará que las opciones comoset -f
(noglob
) sean locales a la función, solo como variables.El
declare -n a=$1
creará una variable locala
como un alias a la variable global nombrada por$1
(el primer argumento de la función).fuente