lunes, 13 de octubre de 2014

Ejercicios de programación en bash nivel -1 ( muy principiante )

Objetivos:
Incentivar y motivar a los usuarios a estudiar programación con una pequeña introducción acerca de bash.
Exponer una perspectiva simple sobre programación
Que es bash?
Un interprete de comandos

Mas detalles:
Bourne Shell (sh)
Creador original: Stephen Bourne, de los Laboratorios Bell de AT&T.
Año de aparición: 1977 - Actualidad
Descripción: Fue el intérprete usado en las primeras versiones de Unix y se convirtió en un estándar de facto.

Korn Shell (ksh)
Creador original: David Korn de los Laboratorios Bell de AT&T.
Año de aparición: Comienzos de los 80s - Actualidad.               
Descripción: Escrito para el proyecto GNU (GPL). Sus funciones avanzadas para manejar archivos de comandos lo pusieron a la par con lenguajes de programación especializados como awk y perl.

Bourne-Again Shell (Bash)
Creador original: Brian Fox
Año de aparición: 1987 - Actualidad
Descripción: Escrito para el proyecto GNU, se usa por defecto en la mayoría de las distribuciones de Linux actualmente. La sintaxis de órdenes de Bash incluye ideas tomadas desde Korn Shell.

Zsh
Creador original: Paul Falstad
Año de aparición: 1990 - Actualidad
Descripción: Se diseñó para poder usarse interactivamente. Reúne algunas importantes mejoras.

Estructura básica
para crear un script de bash necesitamos idenficarlo de forma correcta, para eso vamos a usar esto como encabezado.

#!/bin/bash

Se puede usar un editor de texto para crear el archivo con la sintaxis que utilizará el lenguaje de programación.
nano,geany,vim,sublime text2, etc.
al crear un archivo para que pueda ser interpretado en bash debemos asignarle los permisos de ejecución correspondiente.

$ chmod +x archivo.sh

Luego podremos escribir cualquier comentario precedido del signo numeral, gato o almohadilla "#" depende como le digan en tu pais.

#!/bin/bash
# cualquier linea precedida de signo # será ignorado como 

# una ejecución y sólo será tomada
# como un comentario.


Las órdenes de la linea de comandos

Es necesario estar familiarizado con la linea de comandos de bash para eso hay que ejercitar comandos básicos como
cd, ls, mv, cp, rm, chmod, clear,
http://www.puppylinux.org/wikka/BashCommands

Definiendo variables
Las variables son algo esencial en cualquier lenguaje de programación, ya que nos permiten almacenar cualquier dato para poder trabajar con él más adelante, guardándose durante la ejecución del script o programa.

Ejemplos de variables
var= x
var= y
var="/ruta/archivo"
var="comando"


veamos unos ejemplos mas reales
CHAT="/usr/bin/xchat"
MENSAJE="Muestra un mensaje"
LISTA="ls"


en la terminal podremos llamar a nuestras variable en un script si anteponemos el signo $ a la variable así

exec $CHAT
echo $MENSAJE
$LISTA /usr/bin


Meta caracteres
caracteres especiales que tienen un  significado propio para Bash.
   Le indica a Bash que ignore el carácter especial que viene después. Se suele usar para introducir funcionalidades al código, como saltos de línea, etc...

" "  Cuando se encierra entre comillas dobles un texto o una variable si esta es una frase (cadena de palabras) Bash lo interpretará como una cadena única.

  Identifica que lo que sigue al carácter es una variable.

' ' Las comillas simples se usan para desactivar todos los caracteres especiales encerrados dentro de ellas, así tenemos que si escribimos '$variable', Bash interpretará literalmente lo escrito y no su valor como variable.

  Cuando se coloca este carácter dentro de una línea del guión, Bash ignora el resto de la línea. Muy útil para hacer comentarios y anotaciones o para inhabilitar una línea de comandos al hacer pruebas.

  Este carácter se usa para separar la ejecución de distintos comandos en una misma línea de comandos.

``  Se utiliza para convertir la salida de un comando en una variable. El comando en cuestión se ejecuta en una sub-shell.

Operadores
Estos nos sirven para realizar comparaciones en bash, aquí algunos ejemplos.

Comparación de enteros (números) con ejemplos.

-eq Equal (es igual a) if [ "$a" -eq "$b" ]

-ne Not Equal  (no es igual a / es distinto a) if [ "$a" -ne "$b" ]

-gt Greater Than (es mayor que) if [ "$a" -gt "$b" ]

-ge Greater Equal (es mayor que o igual a) if [ "$a" -ge "$b" ]

-lt Lower Than (es menor que) if [ "$a" -lt "$b" ]

-le Lower Equal (es menor que o igual a) if [ "$a" -le "$b" ]

<  Menor que (usar con doble paréntesis) (("$a" < "$b"))

<= Menor que o igual a (usar con doble paréntesis) (("$a" <= "$b"))

>  Mayor que (usar con doble paréntesis) (("$a" > "$b"))

>= Mayor que o igual a (usar con doble paréntesis) (("$a" >= "$b"))

Comparación de cadenas

= Igual a if [ "$a" = "$b" ]

== Igual a if [ "$a" == "$b" ]

!= No igual a / Distinto a if [ "$a" != "$b" ]

< Menor que (orden alfabético ASCII) if [[ "$a" < "$b" ]]

>  Mayor que (orden alfabético ASCII) if [[ "$a" > "$b" ]]
-z Cadena vacía (null) o de longitud cero if [ -z “$cadena” ]

-n Cadena no vacía (con contenido) if [ -n “$cadena” ]

Las estructuras de control
Son elementos de programación que pueden controlar y modificar el flujo de ejecución de las instrucciones de un programa

Ejecutar de acuerdo a una condición, ejecutar un grupo u otro de sentencias (If-Then-Else,  Select y Case)
Ejecutar un grupo de sentencias mientras exista una condición (While-do)
Ejecutar un grupo de sentencias hasta que exista una condición (Until-do)
Ejecutar un grupo de sentencias un número determinado de veces (For-Next)

Bueno después de la teoría obligatoria, vamos a comenzar con nuestro ejercicio.
"Adiós mundo" el ejemplo de hola mundo ya todos lo conocen así que vamos a saltarnos eso.

Problema a resolver:
Crear un script que revise si esta instalado un programa para que pueda ejecutarse.
si no está, que nos muestre un mensaje donde nos avise que requiere ser instalado.

Suena fácil eh, pero seamos mas específicos.

Crear un script que revise si esta instalado abiword para que abra como texto el script que vamos a crear.
Si abiword no esta en el sistema entonces enviaremos un mensaje al escritorio que nos avise que falta.

Para eso usaremos la estructura de control if-then-else y algunos operadores.
agregaré comentarios para mayor entendimiento y usaré la terminal y sublime text2 como mi editor de texto, Empecemos. 

sublime mi-script.sh
 
#!/bin/bash
### DEFINIENDO LAS VARIABLES
ABW="/usr/bin/abiword"
MSG="Requiere Abiword instalado"
SCRIPT="mi-script.sh"

## ASI DEFINIMOS DONDE EL SCRIPT VA A BUSCAR ABIWORD
## Y CUAL SERA EL MENSAJE DE ERROR SI ESTE FALTA
## USANDO OPERADORES Y ESTRUCTURAS DE CONTROL
## DETECTANDO ABIWORD
if [ -f "$ABW" ]; then
## SI CUMPLE LA CONDICIÓN QUE EXISTE ABIWORD
## ENTONCES EJECUTA EL SCRIPT
$ABW $SCRIPT
## SI NO CUMPLE LA CONDICION Y NO
## ENCUENTRA ABIWORD ENTONCES EJECUTA LA SEGUNDA ORDEN
else if [ ! -f "$ABW" ]; then
## SE PUEDE UTILIZAR CUALQUIER FORMA
## DE AVISO (AUDIBLE, XMESSAGE, XDIALOG ETC)
yaf-splash -bg orange -fg black -text "$MSG" -close box -fontsize large
## PARA UNA CORRECTA SINTAXIS POR
## CADA IF DEBE IR UNA ESTRUCTURA FI
 fi
fi

El script sin los comentarios quedaría de esta manera.


luego le damos permisos de ejecución y probamos en terminal
chmod +x mi-script.sh
./mi-script.sh
Para probar la segunda condicion voy a renombrar abiword para que el script lo detecte como faltante
mv /usr/bin/abiword /usr/bin/abiword.old
luego pruebo el script nuevamente
./mi-script.sh
Les apareció el mensaje?

Y así es como se escribe código, con un poco de practica y lectura se van aclarando los conceptos.

Estas notas son sacadas de manuales de bash y mi poca experiencia escribiendo código
Nos leemos en un próximo ejercicio.
Saludos.