A veces se encuentran ciertas limitaciones a la hora de escribir scripts de shell en el manejo de cadenas y es que, muchas veces, nos olvidamos de que bash tiene un montón de operaciones sobre strings. Por ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# Cadena de ejemplo: string=123.abc.456.ABC.123 # Ver la longitud de la cadena $ echo ${#string} 19 # Extraer subcadena desde una posicion $ echo ${string:4} abc.456.ABC.123 # Extraer subcadena de longitud determinada # desde una posicion $ echo ${string:4:7} abc.456 # Eliminar la cadena coincidente del principio de la cadena $ echo ${string#123} .abc.456.ABC.123 # Eliminar la cadena coincidente del final de la cadena $ echo ${string%123} 123.abc.456.ABC. # Reemplazar la primera aparación de una subcadena en la cadena $ echo ${string/123/QWE} QWE.abc.456.ABC.123 # Reemplazar todas las apariciones de una subcadena en la cadena $ echo ${string//123/QWE} QWE.abc.456.ABC.QWE # Reemplazar si hay coincidencia al pricipio o al final de la cadena: $ echo ${string/#123/QWE} QWE.abc.456.ABC.123 $ echo ${string/%123/QWE} 123.abc.456.ABC.QWE # Longitud de la coincidencia al principio de la cadena (dos formas) $ expr match "$string" '123' 3 $ expr "$string" : '123' 3 |
Otra cuestión donde no es difícil cometer errores es en las comparaciones; al no ser bash un lenguaje tipado, ciertas construcciones pueden dar lugar a errores que pasan desapercibidos y llegan a ser difíciles de detectar. Así que recordemos:
El operador de comparación es =, no -eq.
== es sinónimo de =
El operador “distinto de” es !=
Ejemplos:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ $a=foo $ $b=bar $ [ "$a" = "$b" ] && echo 'las dos variables son iguales' || echo 'las dos variables son distintas' las dos variables son distintas $ [ "$a"="$b" ] && echo 'las dos variables son iguales' || echo 'las dos variables son distintas' las dos variables son iguales $ [ "$a" == "$b" ] && echo 'las dos variables son iguales' || echo 'las dos variables son distintas' las dos variables son distintas $ if [ "$a" != "$b" ]; then echo "Las dos variables son distintas"; fi Las dos variables son distintas |
Pero, con dobles corchetes, el funcionamiento es distinto (pattern matching):
1 2 3 |
$ filename=foto.jpg $ if [[ "$filename" != *.gif ]]; then echo "El fichero no parece un gif"; fi El fichero no parece un gif |
Si las expresiones son compuestas, se pueden usar los operadores -a (y lógico) y -o (o lógico). Y, sólo en el caso de usar dobles corchetes, sus “casi” equivalentes && y || o
1 2 |
$ if [ "$a" = "foo" -a "$b" = "bar" ]; then echo "foobar"; fi $ if [[ "$a" == "foo" && "$b" == "bar" ]]; then echo "foobar"; fi |
buena man
Hola,
me gusta el artículo, pero no encuentro lo que busco.
¿Podría extraer todas las palabras de un archivo de texto que comiencen con una «@»‘?
Muchas gracias
sed -n -e ‘/^@.*/p’ a2ps-site.cfg
Muchas gracias