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 +f
Parece 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; done
echo ${arr[@]}
$line
tiene caracteres globulares.mkdir x && cd x && touch A B C && line="*" arr=($line); echo ${#arr[@]}
da 3declare -a "arr=($line)"
ignorará losIFS
delimitadores dentro de las cadenas citadasline='*'
,read -a arr <<<$line
siempre 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.txt
yc.txt
, a continuación, ejecutar el código produciría la siguiente salida.fuente
fuente
tr
es superfluo, pero en su lugar debería"${arr[@]}"
$arr