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 readarrayno 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
readarraybuiltin 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íneaprintfy 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
readarraycomo en elreadarray <<< "$string"enfoque (también tenga en cuenta quereadarray -dnecesita una versión muy reciente debash).Tenga en cuenta que a pesar de
SinIFS(que significa separador ), eso funciona de la misma manerareadarrayquea,,b,se divide en"a",""y"b"solo.Para un operador de división real, puede usar
zshen 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 -dUna 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=$1creará una variable localacomo un alias a la variable global nombrada por$1(el primer argumento de la función).fuente