Вы находитесь на странице: 1из 8

GNU/Linux – Programación en BASH

PROGRAMACIÓN EN BASH. SHELL ARCHIVOS DE PROCESAMIENTO POR


LOTES (SCRIPT)
Un archivo de procesamiento por lotes (shell script) es un grupo de comandos,
funciones y variales. Puede ser una línea de comandos que preferimos no escribir o un
complejo programa con bucles continuos, sentencias condicionales, operaciones
matemáticas y estructuras de control. Los archivos de procesamiento por lotes (shell
script) tienen la misma sintaxis de varios lenguajes de programación y son capaces de
manejar las mismas tareas.
Hay dos tipos de archivos de procesamiento por lotes (shell scripts): los basados en
bourne shell y los derivados de C. Se escriben en un archivo de texto al que se le
otorgan permisos de ejecución. Una vez realizado este proceso se podrá escribir en la
consola el nombre del archivo y éste se ejecutará como un comando.
Para escribir nuestros programas en shell usaremos cualquier clase de editor de texto,
p.ej. Vi, mcedit ó cualquier otro con el cuál nos hayamos familiarizado. Un archivo de
procesamiento por lotes (shell script) es una forma de agrupar secuencias de
comandos que corren sin tener que ser escritos en el prompt. En realidad pueden ser
tan complejos como cualquier programa ejecutable.
¿Por dónde comenzar? Nuestro archivo de procesamiento por lotes (shell script) debe
comenzar con la siguiente línea (OJO! debe ser la primera línea del archivo):
#!/bin/bash
Los caracteres #! indican al sistema que el primer argumento que sigue en la línea es
el programa a utilizar para ejecutar este script. En este caso usamos el shell /
bin/bash. Esto quiere decir que se invocará al shell bash para interpretar estos
comandos y ejecutarlos. Luego de esta línea escribiremos los comandos que queremos
que ejecute nuestro script.
Una vez que el archivo de procesamiento por lotes (shell script)ha sido terminado y
guardado, tenemos que hacerlo ejecutable para poder correrlo. Para hacer el archivo
de procesamiento por lotes (shell script) ejecutable escribiremos el siguiente
comando:
#chmod 755 nombre-del-script
Después vamos a poder ejecutar el archivo de procesamiento por lotes (shell script)
escribiendo en la consola lo siguiente:
./nombre-del-archivo de procesamiento por lotes (shell script)

Marco Antonio de Hoyos Pág 1 http://tecnicoslinux.com.ar


GNU/Linux – Programación en BASH

Recordemos que el ./ sirve para remplazar la ruta.


Ejemplo:
#!/bin/bash
clear
echo Ejecutando el comando ls.
ls
echo el comando se ejecutó con éxito.
VARIABLES La asignación de variables se realiza simplemente indicando su nombre,
un signo =, y el valor, como en el siguiente ejemplo: nombre="Luis"
El valor de una variable se toma anteponiendo un signo $ al nombre, así si queremos
imprimir en pantalla el valor de la variable nombre que creamos antes, deberemos
escribir: echo $nombre
echo es el comando que nos permite enviar a la salida por pantalla el valor de la
variable pasada como argumento. Este comando suele utilizarse si queremos testear
en pantalla el progreso de un archivo de procesamiento por lotes (shell script) o si
deseamos que el pueda ir obteniendo información mientras el archivo de
procesamiento por lotes (shell script) se ejecuta.
MANEJANDO ENTRADAS Y SALIDAS La entrada/salida puede manejarse con los
comandos echo y read. Con ellos el archivo de procesamiento por lotes (script)podrá
interacturar con el usuario, recibiendo datos de él y mostrando en pantalla resultados.
Ejemplo:
#!/bin/bash
clear
echo "Por favor introduzca su nombre:"
read nombre
echo "Introduzca ahora su apellido"
echo read apellido
echo "Bienvenido al Departamento Computación $nombre $apellido"
VARIABLES PREDEFINIDAS Veamos las variables ya definidas por el shell y que
podremos usar en nuestros scripts.
Variable Descripción
$# Número de argumentos
$* Todos los argumentos del shell
$- Opciones suministradas al shell
$? Valor de retorno del último comando ejecutado
$$ Identificación del PID (número de proceso)

Marco Antonio de Hoyos Pág 2 http://tecnicoslinux.com.ar


GNU/Linux – Programación en BASH

ARGUMENTOS Los argumentos sirven para pasarle a un programa o una función


valores desde la línea de comando. Sólo podemos pasar nueve argumentos. Si por
algún motivo queremos usar más de nueve: con el comando shift borramos el
argumento n°1 transformando al que hasta este momento era el n°2 en n°1 y así
sucesivamente hasta que el n°9 se transforma en 8 y deja uno libre para ser usado.
Como veremos en la tabla siguiente, si quisiéramos hacer mención a todos los
argumentos introducidos por pantalla podríamos hacer uso de la variable $*. Si por
ejemplo queremos indicar que debe utilizarse el primer argumento pasado tendremos
que usar la variable $1 y así sucesivamente según el argumento que deseemos utilizar
en nuestro archivo de procesamiento por lotes (shell script).

Variable Significado
$* Todos los argumentos
$# Cant. de argumentos
$0 Nombre del archivo de procesamiento por lotes (shell script)
$1 Primer argumento
$2 Segundo argumento
$n Argumento 'enésimo'

Ejemplo:
#!/bin/bash
# Programa que recibe argumentos y los imprime por pantalla
echo "\$*: $*"
echo "\$#: $#"
echo "\$0: $0"
echo "\$1: $1"
echo "\$2: $2"
En la líneas de impresión (echo), para imprimir el símbolo "$" (pesos) se tiene que
anteponer el símbolo "\" (contra barra), de lo contrario el shell lo va a interpretar
como una variable, y si ésta existe imprimirá su contenido. Los argumentos que se
pasan en el momento de invocar el archivo de procesamiento por lotes (script)se
asignan a las variables automáticas $1, $2, $3, etc:
./archivo de procesamiento por lotes (shell script)perro gato loro
$1 vale perro
$2 vale gato
$3 vale loro.
En ocasiones se desea asignar a una variable el valor obtenido mediante la ejecución
de otro comando. Esto se logra encerrando el comando entre ' como podemos ver en
este ejemplo horaydia='date'

Marco Antonio de Hoyos Pág 3 http://tecnicoslinux.com.ar


GNU/Linux – Programación en BASH

Otras variables automáticas son $0 que contiene el nombre del script, y $# que
contiene la cantidad de argumentos ingresados durante la ejecución del script.
EXPRESIONES Como en cualquier lenguaje de programación podemos evaluar
expresiones y hacer depender de dicha evaluación la ejecución de un comando o
secuencias de comandos. El comando test devuelve verdadero o falso como resultado
(usualmente se utiliza con el comando if test "$nombre" = "Luis"
Este ejemplo chequea igualdad.
Si deseamos chequear desigualdad debemos usar el operador != como en el lenguaje
“C”: test "$nombre" != "Carlos"
test $variable
Chequea si la variable contiene algún dato, en cuyo caso devuelve verdadero.
test -z $variable
Chequea si la variable no contiene datos (longitud cero), en cuyo caso devuelve
verdadero.
test $variable1 -eq $variable2
Chequea igualdad entre variables numéricas enteras, si son iguales devuelve
verdadero.
test $variable1 -ge $variable2
Chequea si el primer valor es mayor o igual que el segundo, en cuyo caso devuelve
verdadero.
test $variable1 -gt $variable2
Chequea si el primer valor es mayor que el segundo, en cuyo caso devuelve
verdadero.
test $variable1 -le $variable2
Chequea si el primer valor es menor o igual que el segundo, en cuyo caso devuelve
verdadero.
test $variable1 -lt $variable2
Chequea si el primer valor es menor que el segundo, en cuyo caso devuelve
verdadero.
test $variable1 -ne $variable2
Chequea que los dos valores no sean iguales, en cuyo caso devuelve verdadero.
test $archivo1 -nt $archivo2
Chequea las fechas de modificación de dos archivos, devolviendo verdadero si el
archivo1 es más nuevo que el archivo2.
test -f $archivo
Chequea si el archivo existe, en caso afirmativo devuelve verdadero.
test -d $archivo
Chequea si el archivo en cuestión es un directorio y si existe, en cuyo caso devuelve
verdadero

Marco Antonio de Hoyos Pág 4 http://tecnicoslinux.com.ar


GNU/Linux – Programación en BASH

test -r $archivo
Chequea si tenemos permiso de lectura sobre el archivo, devolviendo verdadero en
caso afirmativo.
test -w $archivo
Chequea si tenemos permiso de escritura sobre el archivo, devolviendo verdadero en
caso afirmativo.
test -x $archivo
Chequea si tenemos permiso de ejecución sobre el archivo, devolviendo verdadero en
caso afirmativo.
test -b $archivo
Chequea si el archivo es un dispositivo de bloque (block device), devolviendo
verdadero en caso afirmativo.
test -c $archivo
Chequea si el archivo es un dispositivo de caracter (character device), devolviendo
verdadero en caso afirmativo.
ESTRUCTURAS DE CONTROL Dentro de las estructuras de control encontramos dos
categorías:
 Estructuras de decisión
 Estructuras de bucle
ESTRUCTURAS DE DECISIÓN Son las que nos permiten decidir por un camino entre
dos ó más posibles dada una condición. Si la condición se evalúa como verdadera, se
cumplirá el camino inmediato de secuencias, en caso de ser evaluada la condición
como falsa, se ejecutará el bloque de secuencias alternativas. Entre estas estructuras
veremos dos: if y case.
if .. then ... else ... fi Esta instrucción usa el status del último comando y
condicionalmente ejecuta la siguiente instrucción.
La sintaxis general es la siguiente.
if test
then
comandos
else
comandos
fi
Ejemplo:
#!/bin/bash
echo Ingrese estado del tiempo:
read tiempo

Marco Antonio de Hoyos Pág 5 http://tecnicoslinux.com.ar


GNU/Linux – Programación en BASH

if [ $tiempo = lluvia ]
then
echo $llueve
else
echo lindo dia!!!!
fi
Dos estructuras nos permiten ejecutar un código si algo inmediatamente anterior
resultó verdadero, ó lo contrario, ejecutarlo sólo si lo anterior ha ido falso.
&& Permite un if...then rápido, en realidad es un AND lógico
test "$nombre" = "Luis" && echo "Hola Luis!"
|| Similar al anterior pero para el caso falso, en realidad es un XOR lógico.
test "$nombre" = "Luis" || echo "Ud. no es Luis!"
La forma de acordarse de qué produce cada estructura, es tener bien en claro que el
shell sólo va ha ejecutar lo estrictamente necesario para saber cómo termina la
condición.
case .. in ... esac Esta estructura evalúa el valor de una variable y ejecuta varias
instrucciones en función de su valor. Es similar a usar varios if anidados. Si la variable
no es igual a ninguno de los valores se ejecutan las instrucciones especificadas en el
asterisco.
#!/bin/bash
echo Ingrese estado del tiempo:
read estado
case $estado in
lluvia)
echo llevar paraguas;;
sol)
echo hoy esta lindo;;
*)
echo Es un dia variable;;
esac
ESTRUCTURAS CICLICAS Estas estructuras se utilizan para ejecutar un bloque de
instrucciones un número dado ó un número de veces hasta que la condición se
cumpla. Llamaremos bucle o ciclo a todo proceso que se repite un cierto número de
veces dentro de un archivo de procesamiento por lotes (shell script) o programa.
Dentro de estas estructuras encontramos while, until y for.

Marco Antonio de Hoyos Pág 6 http://tecnicoslinux.com.ar


GNU/Linux – Programación en BASH

while .. do ... done


while
do
...
done
while sleep 3
do
echo hola mundo.
done
until .. do ... done
until
do
...
done
until sleep 3
do
echo pasaron 3 segundos.
done
La instrucción break termina la ejecución del bucle ocasionando la ejecución de la
instrucción done más cercana.
for .. in ... do ... done
Es otra de las estructuras importantes, permite dos sintáxis: la primera, la del for más
o menos tradicional, es decir, dar un nombre de una variable y los valores por los que
tiene que pasar:
for i in `ls /`
do
file $i
done

Marco Antonio de Hoyos Pág 7 http://tecnicoslinux.com.ar


GNU/Linux – Programación en BASH

FUNCIONES Las funciones son un recurso esencial para la buena programación,


permiten escribir una sola vez un pedazo de código que se repita varias veces, y así
lograr minimizar el margen de error y también la cantidad de líneas codificadas en el
programa. Para utilizarlas simplemente tendremos que hacer un llamado a la función.
Las funciones pueden estar dentro del mismo archivo de procesamiento por lotes
(shell script), o en un archivo aparte. Cuando se escriben las funciones en un archivo
aparte, es muy importante utilizar el comando "." (punto) para cargarlas en memoria.
Si no se cargan en memoria de esta manera, las funciones no estarán disponibles.
# Cargando las funciones en memoria
# (Hay un espacio despues del .)
. /home/pepe/funciones/funciones-arch.sh
for i in `ls /`
do
evaluar $i
done
archivo: lib/arch.sh
# Funciones para manipulación de archivos
evaluar() {
# A partir de aquí empieza la función
file $1
#Termina la función
}
VARIABLES LOCALES A LA FUNCIÓN Existe la posibilidad de utilizar variables
locales a la función, esto significa que la variable solamente va a existir durante la
ejecución de la función.
Para crear una variable local a la función se utiliza el operador "local
<nombre_de_variable>".
Veamos como incluímos esta opción en una función:
func () {
local x
x=$1
echo "Dentro de la función \$x vale ($x)"
}
echo "Antes de ejecutar la función \$x vale ($x)"
func HOLA!!
echo "Después de ejecutar la función \$x vale ($x)"

Marco Antonio de Hoyos Pág 8 http://tecnicoslinux.com.ar