"La Gaceta de Linux... haciendo de Linux algo un poco más divertido!"


Sustitución de Variables en Bash con Operadores de Cadenas

Por: Pat Eyler

Traducción al Español por: Lucas Maximiliano Sola
el día 7 de Septiembre 2000, para La Gaceta de Linux.


Sumario

¿Ha querido alguna vez cambiar los nombres de varios archivos a la vez? ¿Qué hay acerca del uso de un valor por defecto para una variable si ésta no posee valor? Estas y otras más opciones están disponibles para usted a través de los operadores de cadenas en la shell bash y otras shells derivadas de la Bourne Shell.

Los operadores de cadenas le permiten a usted manipular el contenido de una variable sin tener que escribir sus propias funciones de shell para realizar eso. Son proporcionados a través de la sintaxis de las llaves {}. Cualquier variable puede ser presentada de esta forma ${foo} sin cambiar su significado. Esta funcionalidad es utilizada a menudo para proteger un nombre de variable de los caracteres que la rodean.

     bash-2.02$ export foo=foo
     bash-2.02$ echo ${foo}bar # foo existe por lo tanto funciona
     foobar
     bash-2.02$ echo $foobar # foobar no existe, por lo tanto falla

     bash-2.02$ 

Para el final de este artículo, usted será capaz de utilizarlo para un montón de cosas más.

Hay tres clases de sustituciones de variables:

Hablaré acerca de los dos primeros y dejaré la sustitución de comandos para otro artículo.

Coincidencia de Patrones

Hay dos clases de coincidencia de patrones disponibles, coincidencia desde la izquierda y coincidencia desde la derecha. Los operadores, con sus funciones y ejemplos, son mostrados en la siguiente tabla:

Operador Función Ejemplo
${foo#t*is} borra la coincidencia posible más corta desde la izquierda export $foo="this is a test"
echo ${foo#t*is}
is a test
${foo##t*is} borra la coincidencia posible más larga desde la izquierda export $foo="this is a test"
echo ${foo##t*is}
a test
${foo%t*st} borra la coincidencia posible más corta desde la derecha export $foo="this is a test"
echo ${foo%t*st}
this is a
${foo%%t*st} borra la coincidencia posible más larga desde la derecha export $foo="this is a test"
echo ${foo%%t*is}
 

Nota: Mientras que los identificadores # y % pueden no parecer obvios, ellos poseen una conveniencia mnemotécnica. La almohadilla # está sobre el lado izquierdo de la variable y opera desde la izquierda. El signo %  está sobre el lado derecho de la variable y opera desde la derecha.

Estos operadores pueden ser utilizados para hacer una variedad de cosas. Por ejemplo, el siguiente guión cambiará la extensión de todos los archivos '.html' a '.htm'.

#!/bin/bash
# quickly convert html filenames for use on a dossy system
# only handles file extensions, not file names

for i in *.html; do 
   if [ -f ${i%l} ]; then
       echo ${i%l} already exists
   else
       mv $i ${i%l}
   fi
done

Sustitución

Otra clase de sustitución de variables que usted pudiera querer emplear es la sustitución. Hay cuatro operadores de sustitución en Bash. Ellos son mostrados en la siguiente tabla:

Operador Función Ejemplo
${foo:-bar} Si $foo existe y no es nula, retorna $foo. Si no existe, o es nula, retorna bar. export foo=""
echo ${foo:-one}
one
echo $foo
 
${foo:=bar} Si $foo existe y no es nula, retorna $foo. Si no existe, o si es nula, $foo toma el valor bar y retorna bar export foo=""
echo ${foo:=one}
one
echo $foo
one
${foo:+bar} Si $foo existe y no es nula, retorna bar. Si no existe, o si es nula, retorna un valor nulo. export foo="this is a test"
echo ${foo:+bar}
bar
${foo:?"error message"} Si $foo existe y no es nula, retorna su propio valor. Si no existe, o si es nula, imprime el mensaje de error. Si ningún mensaje de error le es dado, imprime parameter null or not set.
Nota: En una shell no interactiva, esto abortará el guión en ejecución. En un shell interactiva, esto imprimirá sólo el mensaje de error.
export foo="one"
for i in foo bar baz; do
eval echo \${$foo:?}
one
bash: bar: parameter null or not set
bash: baz: parameter null or not set
Nota: Los dos puntos : en los operadores de arriba pueden ser omitidos. Haciendo eso cambia el comportamiento del operador para sólo probar la existencia de la variable. Esto causará la creación de la variable en el caso de ${foo=bar}

Estos operadores pueden ser utilizados en una variedad de formas. Un buen ejemplo sería darle un valor por defecto a una variable que normalmente lee argumentos desde la línea de comandos cuando no se le dan argumentos. Esto es mostrado en el siguiente guión.

#!/bin/bash

export INFILE=${1-"infile"}

export OUTFILE=${2-"outfile"}

cat $INFILE > $OUTFILE

Por suerte esto le da a usted algo en que pensar y jugar hasta el próximo artículo. Si usted está interesado en más sugerencias acerca de bash (u otra cosa que yo haya escrito al respecto), por favor eche un vistazo a mi página personal. Si usted posee preguntas o comentarios, por favor tíreme unas líneas.


Copyright © 2000, Pat Eyler
Publicado en la edición 57 de La Gaceta de Linux, Septiembre del 2000