¿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:
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"
|
${foo##t*is} |
borra la coincidencia posible más larga desde la izquierda |
export $foo="this is a test"
|
${foo%t*st} |
borra la coincidencia posible más corta desde la derecha |
export $foo="this is a test"
|
${foo%%t*st} |
borra la coincidencia posible más larga desde la derecha |
export $foo="this is a test"
|
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
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=""
|
${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=""
|
${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"
|
${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"
|
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.