Recorrer una cadena carácter a carácter en Shell Script
A la hora de recorrer una cadena en Bash carácter a carácter nos encontramos con una serie de problemas contraintuitivos y cuestiones a tener en cuenta.
Calcular la longitud de la cadena
Para empezar, tenemos que calcular la longitud, pero nos devuelve el número total de caracteres, pero, al recorrer la cadena, el índice de la primera letra es el 0, por lo que el índice de la última letra es la longitud menos uno:
let len=${#string}-1
Recorrer la cadena
Si intentamos recorrer un for con llaves, no interpreta las variables, por lo que un for así:
for pos in {0..$len} do echo "${string:$pos:1}" done
Nos devolverá un error como este:
string: {0..10}: error sintáctico: se esperaba un operando (el elemento de error es "{0..10}")
Y es que entiende {0..$len} como una cadena, no como un rango. Si sustituyésemos echo "${string:$pos:1}"
por echo $pos
Nos devolvería:
{0..10}
Espacios en blanco
Otro punto a tener en cuenta es que si escribimos echo ${string:$pos:1}
en lugar de echo "${string:$pos:1}"
no escribiría los espacios en blanco, por lo que debemos entrecomillar la variable.
Script para recorrer una cadena carácter a carácter
Visto todo lo anterior, veamos cómo deberíamos recorrer una cadena carácter a carácter:
#!/bin/bash string="Hola, mundo" let len=${#string}-1 for (( pos=0; pos<=$len; pos++ )) do echo "${string:$pos:1}" done echo ""
Por último, podemos elegir si queremos que se muestre cada carácter en una línea distinta o queremos que echo no haga saltos de línea. Si no queremos que echo escriba cada carácter en una línea, usaremos el modificador -n.
echo -n "${string:$pos:1}"
Pingback: Evitar salto de línea con echo – Linux en Español