Programando en Bash – parte 1

Si bien lo usamos generalmente para operaciones administrativas o de gestión de archivos, la consola de Linux extiende su funcionalidad mucho más allá de ese propósito, permitiéndonos programar scripts acorde a nuestras necesidades.Esta guía no pretende ser una referencia completa sobre la programación en Bash, sino una introducción a los comandos y estructuras básicas, lo cual nos permitirá ampliar el poder de nuestro sistema GNU/Linux.

¿Qué es un “Script”?

Básicamente decimos que es un archivo que contiene código escrito en determinado lenguaje de programación que el sistema usa para determinada tarea. No es necesario que tenga una entrada externa ni interfaz gráfica, pero sí que provoque una salida de datos procesados (por más de que el usuario no los vea).

El lenguaje usado por Bash está definido por su propio intérprete y combina la sintaxis de otros Shells, como el Korn Shell (ksh) o el C Shell (csh). Muchos de los comandos que usualmente se usan en la consola también pueden usarse en los scripts, salvo aquellos que pertenecen estrictamente a una distribución en particular.

Estructura de un Script

Para empezar debemos contar con un editor de texto y ganas de programar. Los archivos que guardamos con extensión .sh podrán ser ejecutados (o interpretados) por la consola, siempre y cuando la primera línea sea la siguiente:

#!/bin/bash

Esto le dice al sistema que deberá usar la consola para ejecutar el archivo. Además, el carácter # permite escribir comentarios. Para crear el ejemplo más simple agregamos una línea más, vista en la siguiente imagen:

El comando echo muestra un mensaje en pantalla, en este caso el típico “Hello world!”. Si lo guardamos y ejecutamos con la consola veremos el resultado.

Comandos básicos

Los siguientes comandos son comunes y muy útiles para cualquier tipo de programa. Aclaramos que existen muchos más, pero por ahora cubriremos los siguientes.

Alias: permite que una cadena de palabras sea sustituida por una más corta, permitiendo la reducción del código.

#creamos un alias llamado per con la dirección de la #carpeta Descargas

alias per=’/home/usuario/Descargas’

#Cada vez que queramos usarlo solo debemos llamar a #la nueva palabra

per

#Para destruir ese alias, usamos unalias

unalias per

break: permite salir inmediatamente de un ciclo for, while, until o select (más adelante estudiaremos detalladamente los ciclos)

#Creamos un ciclo que asignará los números del 1 al 5 #por cada “vuelta de ciclo”

for contador in 1 2 3 4 5

do

#Imprimimos el actual valor de la variable #contador, el cual es analizado por el carácter $

echo “$contador”

#Si el valor de contador es igual a 3

if [$contador –eq 3]

then

#El break sale del ciclo for

break

fi

done

continue: similar al break, excepto que ignora la actual vuelta de ciclo y pasa a la siguiente.

#Creamos un ciclo que asignará los números del 1 al 5 #por cada “vuelta de ciclo”

for contador in 1 2 3 4 5

do

#Si el valor de contador es igual a 3

if [$contador –eq 3]

then

#Continue impide que se analize el resto del ciclo #actual saltando a la siguiente vuelta, o sea que el #valor 3 no se imprimirá.

continue

fi

echo “$contador”

done

declare: declara variables y les asigna valores, al igual que typeset (funcionan de la misma manera). Podemos combinarla con algunas opciones: -i declara números enteros; -r para variables de solo lectura, a las cuales no se les podrá cambiar el valor; –a para matrices o “arrays”; -f para funciones; -x para variables que podrán ser “exportadas” fuera del ambiente del script propio.

declare –i num=12

declare –x pi=3.14

help: muestra la ayuda de un comando concreto.

jobs: muestra los procesos en ejecución.

#Con –c mostramos el nombre de los comandos, con –p #el pid (id de proceso) de cada proceso.

jobs -cp

let: evalúa una expresión aritmética

let a=11

let a=a+5

#Finalmente imprimimos el valor de a que es 16

echo “11 + 5 = $a”

local: crea variables locales, las cuales deben ser usadas preferentemente en funciones del propio scripts para evitar errores. Puede usar las mismas funciones del comando declare.

local v1=”Esta es una variable local”

logout: permite salir del inicio de sesión de un Shell completamente; útil para los casos donde trabajemos con más de una ventana de Shell, en los cuales el comando exit solo permitirá finalizar una ventana a la vez.

printf: permite imprimir un dato y darle formato. Cuenta con muchas opciones, así que mencionaremos algunas.

# %f imprime como número flotante, n para nueva #línea

printf “%fn” 5

5.000000

# &d permite pasar números decimales como argumentos

printf “Hay %d pedidos valuados en %d dólares.n” 20 500

Hay 20 pedidos valuados en 500 dólares.

read: lee una línea de standard input (módulo usado en la carga de datos por medio del teclado por ejemplo). Podemos pasar opciones como: -t para dar un tiempo límite de lectura; -a para que cada palabra sea asignada a una posición del array aname; -d para usar un delimitador que se escribirá al final de la línea; entre otros.

echo “Ingresá tu nombre y presioná ENTER”

#Leemos la variable nombre

read nombre

echo “Tu nombre es $nombre”

type: describe un comando y su comportamiento. Puede ser útil para averiguar las definiciones de datos de cada comando.

type –a ‘[’

#type nos dice que [ es un comando builtin del Shell

[ is a Shell builtin

# -a permite encontrar los directorios que contienen #un ejecutable con el nombre escrito.

[ is /usr/bin/[

ulimit: limita el acceso y uso de ciertos recursos del sistema a los procesos, ideal para programas que permiten hacer cambios administrativos o que están orientados a distintos tipos de usuarios. Al establecer un límite escribimos un número que representa los kilobytes del límite.

#Vemos nuestros límites actuales

ulimit –a

# -f permite limitar a los usuarios a que no puedan #crear archivos de mayor tamaño que 512000 Kb (500 #Mb)

ulimit –f 512000

# -v limita la memoria virtual del proceso.

ulimit –v 512000

wait: espera a que se realice determinado proceso o trabajo para continuar.

#El script espera a que se realice el proceso de pid #2585

wait 2585

Otros comandos útiles que podemos agregar a los scripts están representados por símbolos.

!!: ejecuta nuevamente el último comando

!wer: ejecuta el último comando que comenzaba con la expresión “wer”.

‘==’, ‘!=’, ‘>’, ‘< ‘, ‘>=’, y ‘< =’: operadores relacionales.

|: el operador OR usado generalmente para unir dos expresiones regulares.

: comando de escape que permite formatear las expresiones. Por ejemplo: a para una alerta de sonido, n para nueva línea, b para el retroceso, etc.

¡Gracias Juan Carlos Ortiz!

10 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   Medio Dificil dijo

    Buenísimo! De todas formas 2 comentarios: El tag de Ubuntu esta medio de más, como que generaliza algo que es genérico. Y si estos tutos siguen avanzando estaría bueno que estén vinculados entre si….
    Aparte de eso, esta movida esta interesante!

  2.   Usemos Linux dijo

    Buen aporte! Genial!

  3.   Giovanni Escobar Sosa dijo

    Sólo faltaron referencias para quien quiera meterse más al asunto. Unos buenos aunque no tan fáciles de encontrar en nuestros países son
    – A practical Guide to Linux Commands, Editors, and Shell Programming, Mark Sobell (capítulo 8)
    – Pro Bash Programming, Chris F.A. Johnson (aunque éste es para quien tenga otras referencias o algo más de conocimientos).

    Buen artículo.

  4.   Usemos Linux dijo

    Buen dato! Gracias!

  5.   Patricio Dorantes Jamarne dijo

    :@ La función de «log in as» borró mi comentario anterior, así que lo resumiré más:
    jobs -cp
    bash: jobs: -c: invalid option
    jobs: usage: jobs [-lnprs] [jobspec …] or jobs -x command [args]

    -eq -gt -lt no aceptan variables de punto decimal, entre foro y foro descubrí que bc es un buen aliado:
    if [ `echo 9.999>10 | bc` -eq 1 ]; then
    echo «9.999 es mayor que 10, asegurate que tu procesador sigue funcionando»
    else
    echo «9.999 no es mayor que 10, todo marcha normalmente
    fi

  6.   NotFromBrooklyn dijo

    Este post te resume muy bien todas las generalidades del bash scripting:
    http://www.aboutlinux.info/2005/10/10-seconds-guide-to-bash-shell.html

    En este sitio se encuentran muchas preguntas y respuestas sobre particularidades de bash:
    http://unix.stackexchange.com/questions/tagged/bash

    Aquí hay algunos script muy interesantes y, ¡ehh!, se puede aprender leyendo los scripts de otros:
    http://snipplr.com/search.php?q=bash&btnsearch=go

  7.   NotFromBrooklyn dijo

    Tienes razón con lo que dices, salvo para bash. Todos los sistemas que he visto han tenido bash en /bin/bash.

    Pero para python, perl, ruby, etc, está muy bien utilizar eso. Yo lo hago

  8.   Guille dijo

    Casualmente en la facultad estamos con bash scripting asi que la data me viene de 10, muy bueno!

  9.   alex vi dijo

    una version en pdf para bajarlo estaria bueno!! 😀

  10.   Marco Antonio De Fuentes dijo

    Muy buen sitio. Por fin encontré algo útl. Gracias.