1. Requisitos
Si estas familiarizado con las líneas de comandos de GNU/Linux así como también con los conceptos básicos de programación, estas serán herramientas básicas de mucha ayuda.
2. Scripts Básicos
Este documento intenta mostrar el panorama de la programación en shell basado en ejemplos aplicativos asimismo algunos scripts que ayudaran a desarrollar técnicas acerca de este tema.
2.1 El famoso Hola Mundo
Para poder correr el programa de una manera sencilla por medio de la consola es abriendo un editor en el cual colocaremos todo nuestro script.
vi prueba1 #!/bin/bash echo Hola Mundo
En la primera línea del script indica la dirección donde el programa es usado para correr el archivo
La segunda línea es la única acción de este script, el cual imprime “Hola Mundo” en la consola.
Grabamos dicho archivo modificado y cambiamos los permisos:
chmod 777 prueba1 Por ultimo ejecutamos este ejemplo: ./prueba1 El cual te mostrara: Hola Mundo
3. Redirecciones
3.1 Teoría
ENTRADA/SALIDA ESTÁNDAR Y LOS DESCRIPTORES DE ARCHIVO
La entrada y salida estándar es la capacidad del intérprete de comandos o shell para controlar y dirigir la entrada de datos de los programas, la salida de información útil y la información de errores. Cuando un programa se ejecuta, automáticamente se le proporcionan tres descriptores de
archivo:
ETRADA ESTÁNDAR (STDIN) o DESCRIPTOR DE ARCHIVO 0
El descriptor de archivo STDIN está asociado a la entrada de texto. Por defecto está asociado al teclado.
SALIDA ESTÁNDAR (STDOUT) o DESCRIPTOR DE ARCHIVO 1
El descriptor de archivo STDOUT se corresponde con la salida de texto normal de los programas. Por defecto está asociado al erminal de pantalla.
EROR ESTÁNDAR (STDERR) o DESCRIPTOR DE ARCHIVO 2
El descriptor de archivo STDERR también es una salida de texto, ero se usa exclusivamente para mostrar los errores generados or los programas. Por defecto también está asociado al terminal de pantalla.
El descriptor stdout de los programas está asociado por efecto a la pantalla del terminal. Pero de la misma manera ue es posible redireccionar la salida de un comando a la entrada de otro, también es posible redireccionar cualquiera de los tres descriptores a un archivo. Operador descripción
cmd < file
El contenido de file se utilizará como entrada de la orden cmd
cmd 1> file1 cmd > file1
La salida estándar de la orden cmd se guardará en file. Si el archivo file existe se sobrescribirá.
cmd 1>> file1 cmd >> file1
L salida estándar de la orden cmd se guardará enfile. La información se escribirá al final del archivo.
cmd 2> file2
Los errores de la orden cmd se guardarán en file. Si el archivo file existe se sobrescribirá.
cmd 2>> file2
Los errores de la orden cmd se guardarán en file. La información se escribirá al final del archivo.
cmd > file 2>&1
La salida estándar y la de errores de la orden cmd se guardarán en file. Si el archivo file existe se sobrescribirá.
cmd >> file 2>&1
La salida estándar y la de errores de la orden cmd se uardarán en file. La información se escribirá al final del archivo.
cmd1 | cmd2
Redirecciona la salida del comando cmd1 hacia la entrada del comando cmd2.
4. Pipes
Ahora explicaremos, de manera muy simple como usar los pipes y porque querrán usarlos.
4.1 ¿Qué cosa son los Pipes y porque usarlos?
Usar los pipes les permitirá de manera muy fácil usar la salida de un programa para que esta sea la entrada para otro programa.
4.2 Ejemplo: Un pipe simple con ‘sed’
Primero un simple ls –l del directorio /boot ls -l | sed -e "s/[aeio]/u/g"
Ahora explicaremos lo que pasa, el comando ls –l es ejecutado, la salida de este comando en vez de ser impresa en pantalla como es lo usual, es enviada (“piped”) al programa sed, el cual imprime lo que debe.
4.3 Ejemplo: Un ls –l alternativo a *.txt
Probablemente, este es uno de los modos mas difíciles de hacer un ls –l *.txt, pero esto sirve bastante para ilustrar los pipes, obviamente no para estar realizando listados.
ls -l | grep "\.txt$"
Aquí, la salida del ls –l, será enviada al grep, el cual imprimirá las líneas que concuerden el regex "\.txt$".
4.4 Otras detalles de los Pipes
# cat mifichero | grep gato
Lo que este comando hará será lo siguiente: La primera parte antes de la barra vertical, conseguirá el contenido del fichero mifichero, y con la barra vertical, en lugar de sacarlo por la pantalla, lo enviará a la entrada estándar (stdin) de tal forma que el programa grep leerá desde stdin el contenido del fichero mifichero. El concepto del efecto que esto produce es fácil de entender: el comando que va detrás de la barra lee de la salida que dió el comando anterior. Es obvio que lo que obtendremos serán las líneas del fichero ifichero que contienen la palabra "gato" por la pantalla
(stdout). # grep gato < mifichero
Esta línea es equivalente a la del ejemplo anterior. El contenido del fichero que ponemos a la derecha del signo se va a la entrada estándar de la que lee el comando que ponemos a su izquierda, por lo tanto esta línea conseguiría exactamente el mismo efecto que la del ejemplo anterior.
# echo "Esta es otra línea" >> texto
Vemos en qué es similar a lo anterior; la línea "Esta es otra línea se ha escrito al fichero texto. Si el fichero no existía, ha sido creado, y la diferencia, si existía y tenía contenido, la línea se ha escrito al final del fichero, debajo del contenido que ya tenía. Este comportamiento nos puede ser muy útil de cara a ir añadiendo líneas a un archivo sin necesidad de tener que abrirlo con un editor.
5. Variables
El uso de variables es casi el mismo que en cualquier leguaje de programación. No hay tipos de datos, en bash una variable puede contener un número, un carácter, una cadena de caracteres. Tampoco se necesita declarar la variable, solo asignarle el valor será más que suficiente para que se cree.
5.1 Ejemplo: El clásico Hola Mundo usando variables
Línea 1 #!/bin/bash Línea 2 STR="Hello World!" Línea 3 echo $STR
La línea 2 crea la variable llamada STR y le asigna la cadena de caracteres “Hello Worl”. Luego el valor de esta variable es mandado usando el signo ‘$’ al inicio de la variable, usenlo y prueben si quieren sin el signo y verán que el resultado es diferente.
5.2 Ejemplo: Un scritp simple de backup
Línea 1 #!/bin/bash Línea 2 OF=/var/my-backup-$(date +%Y%m%d).tgz Línea 3 tar -cZf $OF /home/me/
Este script es un buen ejemplo, lo que hace es un backup de una carpeta, la comprime y la guarda en un lugar especifico. Primero que nada, la variable de asignación de la Línea 2. Nótese que este script, al momento de ejecutarse la fecha cambiara no será la misma, debido al formato de date command(+%Y%m%d). En esta parte del script podra colocar cualquier formato que uno quiera.
Otros ejemplos:
echo ls echo $(ls)
5.3 Variables Locales
Las variables locales pueden ser creadas con la palabra "local”
#!/bin/bash HELLO=Hello function hello { local HELLO=World echo $HELLO } echo $HELLO hello echo $HELLO
Con este ejemplo simple se puede ver como se usan las variables locales.
6. Condicionales
Las condicionales permite decidir el realizar una acción o no, esta decisión se toma evaluando un expresión dada.
6.1 Teoría
Las condicionales tienen muchas formas. La clásica y la mas básica es if expresión then instrucción, donde instrucción es ejecutada solo si la expresión es verda. Las condicionales tienen otras formas como if exprecion1 then instruccion1 else instruccion2. Aca solo se ejecuta la instruccion1 si la expresión1 es verdad sino sera ejecutada la instruccion2.
Básicamente las mismas estructuras usadas en cualquier otro lenguaje de programación son usadas aca también. La construcción básica del if en bash seria:
if [expresión]; then code if 'expresión' is true. fi
6.2 Ejemplo: Ejemplo básico de condicional if .. then ... else
#!/bin/bash if [ "algo" = "algo" ]; then echo expresión evaluada como verdadera else echo expresión evaluada como falsa fi
6.3 Ejemplo: Condicionales con variables
#!/bin/bash T1="algo" T2="algos" if [ "$T1" = "$T2" ]; then echo expresión evaluada como verdadera else echo expresión evaluada como falsa fi
6.4 Ejemplo: comprobando si existe un fichero
#!/bin/bash FILE=~/.basrc if [ -f $FILE ]; then echo el fichero $FILE existe else echo fichero no encontrado fi if [ 'test -f $FILE'] fi
7. Los bucles for, while y until
En esta sección se encontrará con los bucles for, while y until. La mayoría de ellos son muy parecidos al modo de usar que en cualquier otro lenguaje de programación. El bucle for es distinto a los de otros lenguajes de programación. Básicamente, le permite iterar sobre una serie de `palabras' contenidas dentro de una cadena.
El bucle while ejecuta un trozo de código si la expresión de control es verdadera, y sólo se para cuando es falsa (o se encuentra una interrupción explícita dentro del código en ejecución). El bucle until es casi idéntico al bucle loop, excepto en que el código se ejecuta mientras la expresión de control se evalúe como falsa.
Si sospecha que while y until son demasiado parecidos, está en lo cierto.
7.1 Por ejemplo
Línea 1 #!/bin/bash Línea 2 for i in $( ls ); do Línea 3 echo item: $i Línea 4 done
En la segunda línea declaramos i como la variable que recibirá los diferentes valores contenidos en $( ls ). La tercera línea podría ser más larga o podría haber más líneas antes del done (4).`done' (4) indica que el código que ha utilizado el valor de $i ha acabado e $i puede tomar el nuevo valor.
Este script no tiene mucho sentido, pero una manera más útil de usar el bucle for sería hacer que concordasen sólo ciertos ficheros en el ejemplo anterior.
7.2 for tipo-C
Es un bucle for más parecido al for de C/perl...
#!/bin/bash for i in `seq 1 10`; do echo $i done
7.3 Ejemplo de while
#!/bin/bash CONTADOR=0 while [ $CONTADOR -lt 10 ]; do echo El contador es $CONTADOR let CONTADOR=CONTADOR+1 done
Este script 'emula' la conocida (C, Pascal, perl, etc) estructura `for'.
7.4 Ejemplo de until
#!/bin/bash CONTADOR=20 until [ $CONTADOR -lt 10 ]; do echo CONTADOR $CONTADOR let CONTADOR-=1 done
8. Funciones
Como en casi todo lenguaje de programación, puede utilizar funciones para agrupar trozos de código de una manera más lógica, o practicar el divino arte de la recursión. Declarar una función es sólo cuestión de escribir function mi_func { mi_código }. Llamar a la función es como llamar a otro programa, sólo hay que escribir su nombre.
8.1 Ejemplo de funciones
Línea 1 #!/bin/bash Línea 2 function salir { Línea 3 exit Línea 4 } Línea 5 function hola { Línea 6 echo ¡Hola! Línea 7 } Línea 8 hola Línea 9 salir Línea 10 echo algo
Las líneas 2-4 contienen la función 'salir'. Las líneas 5-7 contienen la función 'hola'. Hay que tener en cuenta que una función no necesita que sea declarada en un orden específico. Cuando ejecute el script se dará cuenta de que: primero se llama a la función 'hola', luego a la función 'quit', y el
programa nunca llega a la línea 10.
9. Interfaces de usuario
9.1 Utilizando select para hacer menús sencillos
#!/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
Si ejecuta este script verá que es el sueño de un programador para hacer menús basados en texto. Probablemente se dará cuenta de que es muy similar a la construcción 'for', sólo que en vez de iterar para cada 'palabra' en $OPCIONES, se lo pide al usuario. Imagínense que ahora en vez de que haga un simple echo ahora ejecute un subprograma u otro script según sea la opción escogida, la utilidad de esto es muy grande.
10. Miscelánea
10.1 Leyendo información del usuario
En muchas ocasiones, puede querer solicitar al usuario alguna información, y existen varias maneras para hacer esto. Ésta es una de ellas:
#!/bin/bash echo Por favor, introduzca su nombre read NOMBRE echo "¡Hola $NOMBRE!"
Como variante, se pueden obtener múltiples valores con read. Este ejemplo debería clarificarlo.
#!/bin/bash echo Por favor, introduzca su nombre y primer apellido read NO AP echo "¡Hola $AP, $NO!"
10.2 Evaluación aritmética
Pruebe esto en la línea de comandos (o en una shell): echo 1 + 1 Si esperaba ver '2', quedará desilusionado.
¿Qué hacer si quiere que BASH evalúe unos números? La solución es ésta: echo $((1+1))
Esto producirá una salida más 'lógica'. Esto se hace para evaluar una expresión aritmética. También puede hacerlo de esta manera:
echo $[1+1]
Si necesita usar fracciones, u otras matemáticas, puede utilizar bc para evaluar expresiones aritméticas.
Si ejecuta "echo $[3/4]" en la línea de comandos, devolverá 0, porque bash sólo utiliza enteros en sus respuestas. Si ejecuta "echo 3/4|bc -l", devolverá 0.75.
ALGUNOS EJEMLOS VARIADOS DE BASH
Re-nombrador de ficheros (sencillo)
#!/bin/bash # renombra.sh # renombrador de ficheros básico criterio=$1 expresion=$2 sustituto=$3 for i in $( ls *$criterio* ); do orig=$i dest=$(echo $i | sed -e "s/$expresion/$sustituto/") mv $orig $dest done
Un script de copia de seguridad muy simple (algo mejor)
#!/bin/bash ORIG="/home/" DEST="/var/copias_de_seguridad/" FICH=home-$(date +%Y%m%d).tgz tar -cZf $DEST$FICH $ORIG Un script sencillo #!/bin/bash echo "" echo " EJEMPLO DE INGRESO DE DATOS" echo -n "Pon el dia de tu nacimiento: " read dia echo -n "Pon el mes de tu nacimiento: " read mes echo -n "Pon el Año de tu nacimiento:" read numero echo "La Fecha de tu nacimiento" echo "El dia: $dia" echo "El mes : $mes" echo "El Año : $numero" echo "" echo "La fecha completa es:" echo "El dia $dia en el mes de $mes del año $numero "
Suma de Datos
#!/bin/bash echo "" echo " EJEMPLO DE SUMA DE DATOS" echo " Suma de 2 valores " echo -n "Pon el primer valor a sumar: " read numero1 echo -n "Pon el segundo valor a sumar: " read numero2 numero3=$[numero1+numero2] echo "" echo "Los dos numeros a sumar seran $numero1 mas el $numero2" echo "El total es = $numero3 "
Ejemplo De Condicion Para Comparar Si Un Numero Es Igual 40"
echo "" echo " EJEMPLO DE CONDICION PARA COMPARAR SI UN NUMERO ES IGUAL 40" echo "" echo -n " Ingresa un valor para compararlo con 40 = " read valor if [ $valor = 40 ] then echo "" echo " El valor que ingresaste es igual 40 " echo "" else echo "" echo " El valor que ingresaste es no es igual a 40" echo "" fi
Autores: Henry Carrion Martin Kenneth Lopez
Referencias
o http://www.wikilearning.com/scripts_basicos_para_bash_i-wkccp-9574-20.htm o http://www.ubuntu-es.org/node/20639 o http://es.tldp.org/Manuales-LuCAS/AA_Linux_colegio-1.1/AA_Linux_colegio-1.1-html/x3772.htm o http://www.zonasiete.org/manual/ch07.html o http://www.insflug.org/COMOs/Bash-Prog-Intro-COMO/Bash-Prog-Intro-COMO-2.html o http://www.insflug.org/COMOs/Bash-Prog-Intro-COMO/Bash-Prog-Intro-COMO.html |