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}"

 

Un comentario en «Recorrer una cadena carácter a carácter en Shell Script»

Deja una respuesta

Tu dirección de correo electrónico no será publicada.