Ejemplos en BASH
Publicado: Mar, 31 May 2011, 14:59
Nota:En este Post pretendo ayudarles mediante ejemplos a comenzar a programar shell scripts a un nivel básico...
Clásico script `hola mundo'
Codigo:
#!/bin/bash
echo Hola Mundo
Sencillo Script para copia de seguridad
Codigo:
#!/bin/bash
tar -cZf /var/my-backup.tgz /home/yo/
stdout (redirigir) a un fichero
Esto hará que la salida de un programa se escriba en un fichero.
Codigo:
ls -l > ls-l.txt
stderr a un fichero
Esto hará que la salida stderr de un programa se escriba en un fichero.
Codigo:
grep da * 2> errores-de-grep.txt
stdout a stderr
Esto hará que la salida stdout de un programa se escriba en el mismo descriptor de fichero que stderr.
Codigo:
grep da * 1>&2
stderr a stdout
Esto hará que la salida stderr de un programa se escriba en el mismo descriptor de fichero que stdout.
Codigo:
grep * 2>&1
stderr y stdout a un fichero
Esto colocará toda la salida de un programa en un fichero. A veces, esto es conveniente en las entradas del cron, si quiere que un comando se ejecute en absoluto silencio.
Codigo:
rm -f $(find / -name core) &> /dev/null
Una tubería sencilla con sed
Ésta es una manera muy sencilla de utilizar tuberías.
Codigo:
ls -l | sed -e "s/[aeio]/u/g"
Una alternativa a ls -l *.txt
Probablemente ésta es una manera más difícil de hacer un ls -l *.txt, pero se muestra para ilustrar el funcionamiento de las tuberías, no para resolver ese dilema.
Codigo:
ls -l | grep "\.txt$"
¡Hola Mundo! utilizando variables
La segunda línea crea una variable llamada STR y le asigna la cadena "¡Hola Mundo!". Luego se recupera el VALOR de esta variable poniéndole un '$' al principio.
Codigo:
#!/bin/bash
MUNDO="¡Hola Mundo!"
echo $MUNDO
Script de copia de seguridad utilizando Variables
Este script introduce algo nuevo, fíjese en la expresión "$(date +%Y%m%d)" - Ej: $(Fecha +%Año %Mes %dia) y la salida seria asi: 20110301
Codigo:
#!/bin/bash
backup=/home/backup-$(date +%Y%m%d).tgz
tar -cZf $backup /home/backup/
Variables locales
Las variables locales pueden crearse utilizando la palabra clave local. Con este ejemplo debería bastar para mostrarle el uso de una variable local.
Esta sería la salida
Hola
Mundo
Codigo:
#!/bin/bash
HOLA=Hola
function hola {
local HOLA=Mundo
echo $HOLA
}
echo $HOLA
hola
Ejemplo básico de if .. then
Codigo:
#!/bin/bash
if [ "expresión" = "valor" ]; then
echo expresión evaluada como verdadera
fi
Condicionales con variables
Codigo:
#!/bin/bash
var1="valor1"
var2="valor2"
if [ "$var1" = "$var2" ]; then
echo expresión evaluada como verdadera
else
echo expresión evaluada como falsa
fi
comprobando si existe un fichero
Codigo:
#!/bin/bash
FILE=~/cookies.txt
if [ -f $FILE ]; then
echo el fichero $FILE existe
else
echo fichero no encontrado
fi
Ejemplo usando bucles
Codigo:
#!/bin/bash
for i in $( ls ~/ ); do echo $i; done
Bucles for parecido al C/perl.
Este script 'emula' la conocida (C, Pascal, perl, etc) estructura `for'.
Codigo:
#!/bin/bash
for i in `seq 1 10`; do echo $i; done
Ejemplo con while
Codigo:
#!/bin/bash
CONTADOR=0
while [ $CONTADOR -lt 10 ]; do
echo El contador es $CONTADOR
let CONTADOR=CONTADOR+1
done
Ejemplo de until
Codigo:
#!/bin/bash
CONTADOR=20
until [ $CONTADOR -lt 10 ]; do
echo CONTADOR $CONTADOR
let CONTADOR-=1
done
Ejemplo de funciones
Codigo:
#!/bin/bash
function salir {
exit
}
function hola {
echo ¡Hola Mundo!
}
hola
salir
Funciones con parámetros
Codigo:
#!/bin/bash
function salir {
exit
}
function shell {
echo $1
}
shell Hola
shell Mundo
salir
Utilizando select para hacer menús sencillos
1) Hola
2) Salir
#?
Codigo:
#!/bin/bash
OPCIONES="Hola Salir"
select opt in $OPCIONES; do
if [ "$opt" = "Salir" ]; then
echo done
exit
elif [ "$opt" = "Hola" ]; then
echo Hola Mundo
else
clear
echo opción errónea
fi
done
Utilizando líneas de comandos
La expresión del primer condicional comprueba si el programa ha recibido algún argumento ($1) y sale si no lo ha recibido, mostrándole al usuario un pequeño mensaje de uso
Codigo:
#!/bin/bash
if [ -z "$1" ]; then
echo uso: $0 directorio
exit
fi
ORIG=$1
DEST="/home/backups/"
OF=home-$(date +%Y%m%d).tgz
tar -cZf $DEST$OF $ORIG
Leyendo información del usuario
Codigo:
#!/bin/bash
echo Por favor, introduzca su nombre y primer apellido
read NO AP
echo "¡Hola $AP, $NO!"
Obteniendo el valor devuelto por un programa
rv: 1
rv: 0
Codigo:
#!/bin/bash
cd /home/noexiste &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?
Capturando la salida de un comando
Este pequeño script muestra todas las tablas de todas las bases de datos (suponiendo que tenga MySQL instalado).
Codigo:
#!/bin/bash
DB=`mysql -u root -p -e "show databases"`
for b in $DB ; do mysql -u root -p -e "show tables from $b"; done
sed (editor de flujo)
Codigo:
sed 's/a_sustituir/sustituto/g' /tmp/test
awk (manipulación de bases de datos, extracción y proceso de texto)
Codigo:
awk '/test/ {print}' /tmp/test
grep (impresión de líneas que coinciden con un patrón de búsqueda)
Codigo:
grep "error" /var/log/messages -c
wc (cuenta líneas, palabras y bytes)
Codigo:
wc --words --lines --bytes /tmp/test
sort (ordena líneas de ficheros de texto)
Codigo:
sort /tmp/test
bc (un lenguaje de programación de cálculos matemáticos)
Codigo:
bc -q
tput (inicializa una terminal o consulta la base de datos de terminfo)
La línea de comandos aparece en (y10,x4).
Codigo:
tput cup 10 4
Limpia la pantalla y la línea de comandos aparece en (y1,x1)
Codigo:
tput reset
Muestra el número de caracteres que caben en la dirección x (80)
Codigo:
tput cols
Mas adelante agrego mas...
Salud2s...
Clásico script `hola mundo'
Codigo:
#!/bin/bash
echo Hola Mundo
Sencillo Script para copia de seguridad
Codigo:
#!/bin/bash
tar -cZf /var/my-backup.tgz /home/yo/
stdout (redirigir) a un fichero
Esto hará que la salida de un programa se escriba en un fichero.
Codigo:
ls -l > ls-l.txt
stderr a un fichero
Esto hará que la salida stderr de un programa se escriba en un fichero.
Codigo:
grep da * 2> errores-de-grep.txt
stdout a stderr
Esto hará que la salida stdout de un programa se escriba en el mismo descriptor de fichero que stderr.
Codigo:
grep da * 1>&2
stderr a stdout
Esto hará que la salida stderr de un programa se escriba en el mismo descriptor de fichero que stdout.
Codigo:
grep * 2>&1
stderr y stdout a un fichero
Esto colocará toda la salida de un programa en un fichero. A veces, esto es conveniente en las entradas del cron, si quiere que un comando se ejecute en absoluto silencio.
Codigo:
rm -f $(find / -name core) &> /dev/null
Una tubería sencilla con sed
Ésta es una manera muy sencilla de utilizar tuberías.
Codigo:
ls -l | sed -e "s/[aeio]/u/g"
Una alternativa a ls -l *.txt
Probablemente ésta es una manera más difícil de hacer un ls -l *.txt, pero se muestra para ilustrar el funcionamiento de las tuberías, no para resolver ese dilema.
Codigo:
ls -l | grep "\.txt$"
¡Hola Mundo! utilizando variables
La segunda línea crea una variable llamada STR y le asigna la cadena "¡Hola Mundo!". Luego se recupera el VALOR de esta variable poniéndole un '$' al principio.
Codigo:
#!/bin/bash
MUNDO="¡Hola Mundo!"
echo $MUNDO
Script de copia de seguridad utilizando Variables
Este script introduce algo nuevo, fíjese en la expresión "$(date +%Y%m%d)" - Ej: $(Fecha +%Año %Mes %dia) y la salida seria asi: 20110301
Codigo:
#!/bin/bash
backup=/home/backup-$(date +%Y%m%d).tgz
tar -cZf $backup /home/backup/
Variables locales
Las variables locales pueden crearse utilizando la palabra clave local. Con este ejemplo debería bastar para mostrarle el uso de una variable local.
Esta sería la salida
Hola
Mundo
Codigo:
#!/bin/bash
HOLA=Hola
function hola {
local HOLA=Mundo
echo $HOLA
}
echo $HOLA
hola
Ejemplo básico de if .. then
Codigo:
#!/bin/bash
if [ "expresión" = "valor" ]; then
echo expresión evaluada como verdadera
fi
Condicionales con variables
Codigo:
#!/bin/bash
var1="valor1"
var2="valor2"
if [ "$var1" = "$var2" ]; then
echo expresión evaluada como verdadera
else
echo expresión evaluada como falsa
fi
comprobando si existe un fichero
Codigo:
#!/bin/bash
FILE=~/cookies.txt
if [ -f $FILE ]; then
echo el fichero $FILE existe
else
echo fichero no encontrado
fi
Ejemplo usando bucles
Codigo:
#!/bin/bash
for i in $( ls ~/ ); do echo $i; done
Bucles for parecido al C/perl.
Este script 'emula' la conocida (C, Pascal, perl, etc) estructura `for'.
Codigo:
#!/bin/bash
for i in `seq 1 10`; do echo $i; done
Ejemplo con while
Codigo:
#!/bin/bash
CONTADOR=0
while [ $CONTADOR -lt 10 ]; do
echo El contador es $CONTADOR
let CONTADOR=CONTADOR+1
done
Ejemplo de until
Codigo:
#!/bin/bash
CONTADOR=20
until [ $CONTADOR -lt 10 ]; do
echo CONTADOR $CONTADOR
let CONTADOR-=1
done
Ejemplo de funciones
Codigo:
#!/bin/bash
function salir {
exit
}
function hola {
echo ¡Hola Mundo!
}
hola
salir
Funciones con parámetros
Codigo:
#!/bin/bash
function salir {
exit
}
function shell {
echo $1
}
shell Hola
shell Mundo
salir
Utilizando select para hacer menús sencillos
1) Hola
2) Salir
#?
Codigo:
#!/bin/bash
OPCIONES="Hola Salir"
select opt in $OPCIONES; do
if [ "$opt" = "Salir" ]; then
echo done
exit
elif [ "$opt" = "Hola" ]; then
echo Hola Mundo
else
clear
echo opción errónea
fi
done
Utilizando líneas de comandos
La expresión del primer condicional comprueba si el programa ha recibido algún argumento ($1) y sale si no lo ha recibido, mostrándole al usuario un pequeño mensaje de uso
Codigo:
#!/bin/bash
if [ -z "$1" ]; then
echo uso: $0 directorio
exit
fi
ORIG=$1
DEST="/home/backups/"
OF=home-$(date +%Y%m%d).tgz
tar -cZf $DEST$OF $ORIG
Leyendo información del usuario
Codigo:
#!/bin/bash
echo Por favor, introduzca su nombre y primer apellido
read NO AP
echo "¡Hola $AP, $NO!"
Obteniendo el valor devuelto por un programa
rv: 1
rv: 0
Codigo:
#!/bin/bash
cd /home/noexiste &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?
Capturando la salida de un comando
Este pequeño script muestra todas las tablas de todas las bases de datos (suponiendo que tenga MySQL instalado).
Codigo:
#!/bin/bash
DB=`mysql -u root -p -e "show databases"`
for b in $DB ; do mysql -u root -p -e "show tables from $b"; done
sed (editor de flujo)
Codigo:
sed 's/a_sustituir/sustituto/g' /tmp/test
awk (manipulación de bases de datos, extracción y proceso de texto)
Codigo:
awk '/test/ {print}' /tmp/test
grep (impresión de líneas que coinciden con un patrón de búsqueda)
Codigo:
grep "error" /var/log/messages -c
wc (cuenta líneas, palabras y bytes)
Codigo:
wc --words --lines --bytes /tmp/test
sort (ordena líneas de ficheros de texto)
Codigo:
sort /tmp/test
bc (un lenguaje de programación de cálculos matemáticos)
Codigo:
bc -q
tput (inicializa una terminal o consulta la base de datos de terminfo)
La línea de comandos aparece en (y10,x4).
Codigo:
tput cup 10 4
Limpia la pantalla y la línea de comandos aparece en (y1,x1)
Codigo:
tput reset
Muestra el número de caracteres que caben en la dirección x (80)
Codigo:
tput cols
Mas adelante agrego mas...
Salud2s...