Tengo una variable que contiene una cadena delimitada por espacios:
line="1 1.50 string"
Quiero dividir esa cadena con espacio como delimitador y almacenar el resultado en una matriz, de modo que lo siguiente:
echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}
salidas
1
1.50
string
En algún lugar encontré una solución que no funciona:
arr=$(echo ${line})
Si ejecuto las declaraciones de eco anteriores después de esto, obtengo:
1 1.50 string
[empty line]
[empty line]
También intenté
IFS=" "
arr=$(echo ${line})
con el mismo resultado ¿Puede alguien ayudar, por favor?

set -f; arr=($string); set +fParece ser más rápido queread -r -a <<< $string.Respuestas:
Para convertir una cadena en una matriz, utilice
o
Es crucial no usar comillas ya que esto funciona.
fuente
for i in ${arr[@]}; do echo $i; doneecho ${arr[@]}$linetiene caracteres globulares.mkdir x && cd x && touch A B C && line="*" arr=($line); echo ${#arr[@]}da 3declare -a "arr=($line)"ignorará losIFSdelimitadores dentro de las cadenas citadasline='*',read -a arr <<<$linesiempre funciona, pero soloarr=($line)falla.Prueba esto:
fuente
line='*'En:
arr=( $line ). La "división" viene asociada con "glob".Los comodines (
*,?y[]) se expandirán a nombres de archivo coincidentes.La solución correcta es solo un poco más compleja:
No hay problema de globbing; se establece el carácter dividido
$IFS, variables citadas.fuente
arr=($line)en la respuesta aceptada adolece de problemas globales. Por ejemplo, trate de:line="twinkling *"; arr=($line); declare -p arr.<<<pero puede ser una buena idea utilizar comillas dobles para mantener la coherencia y la legibilidad.Si necesita expansión de parámetros, intente:
Por ejemplo, tome el siguiente código.
Si el directorio actual contiene los archivos
a.txt,b.txtyc.txt, a continuación, ejecutar el código produciría la siguiente salida.fuente
fuente
tres superfluo, pero en su lugar debería"${arr[@]}"$arr