1.
4 SHELL SCRIPTS
Ciertos comandos útiles para cuando nos perdamos
La mayoría de comandos soportan el argumento –h o –help:
ls –-help
Shell Scripts
Entrada y Salida
Entrada Salida
Programa
estándar estándar
Todo programa recibe información por la ENTRADA ESTÁNDAR (usualmente el teclado), y envía
información por la SALIDA ESTÁNDAR (usualmente la pantalla del shell).
Por ejemplo:
ls –l | grep carpeta
En este ejemplo, la salida de ls se la pasamos a la entrede de
grep (que lo usamos para buscar texto), para que busque la
palabra carpeta en lo que arrojó ls.
Shell Scripts
Filtros
Son programas que reciben algo desde la entrada estándar, realizan una operación, y lo
devuelven a la salida estándar. Algunos son:
1. sort: ordena las líneas de un texto
2. uniq: remueve las líneas duplicadas
3. grep: busca el patrón de texto requerido
4. head: muestra las primeras líneas del texto
5. tail: muestra las últimas líneas del texto
6. fmt: muestra el texto con formato
7. pr: divide el texto en paginas, con cabeceras y pies de página
Shell Scripts
Otros comandos útiles
ln -> crea un link a un archivo o carpeta
df -> muestra el espacio libre en disco
touch -> cambia la fecha de modificación de un archivo (lo crea si no
existe)
time -> nos da la hora
date -> nos da la fecha
Shell Scripts
Cambiando permisos
Para esto usamos la herramienta chmod:
chmod <permisos> <archivo>
Shell Scripts
Variables
En el shell, nosotros podemos almacenar información en variables.
Para crear una variables, hacemos los siguiente en el shell
$ mivar=‘/etc’
Esto creará la variable mivar con el contenido “/etc”. Para hacer
referencia a una variables, usamos el signo de dólar:
$ echo $mivar
/etc
Podemos usar estas variables dentro de string:
eduardo@ubuntu:~$ mi_text='mundo'
eduardo@ubuntu:~$ echo "hola $mi_text"
hola mundo
Tambíen podemos poner la variable dentro de llaves, para saber que hacemos
referencia a una variable:
eduardo@ubuntu:~$ mi_text='mundo'
eduardo@ubuntu:~$ echo "hola ${mi_text}"
hola mundo
Shell Scripts
Bash Scripting
Ahora que ya conocemos nuestra herramienta (el shell), nos enfocaremos en los
bash scripts.
¿Qué es un bash script?
Cuando necesitamos realizar una tarea que requiere muchos comandos, los
podemos agrupar en un archivo de texto, y luego ejecutarlo en el shell. Todo script
empieza con la siguiente línea:
#!/bin/sh
Por ejemplo, creemos el siguiente script, en el archivo
mi_script.sh:
#/bin/bash
echo “hola bash script”
Necesitamos hacerlo ejecutable, con el siguiente comando:
$ chmod +x mi_script.sh
Para ejecutarlo:
$ ./mi_script.sh
Asi como en el shell, las variables se definen así:
NOMBRE=valor
Para usar el valor de la variable, usamos el signo de $:
#!/bin/bash
QUIEN=“bash script”
echo “hola $QUIEN”
Cuando ponemos entre comillas, se toma como un string literal (se
respetan saltos de línea, etc)
Podemos también asignar el resultado de comandos:
NOMBRE=$(comando arg1 arg2 …)
Esto ejecuta el comando en un shell distinto, y lo asigna a la variable
Shell Scripts
Argumentos
Podemos mandar argumentos al script. Estos se almacenan en las variables
$1, $2, etc. Podemos modificar nuestro script:
#!/bin/bash
echo “hola $1”
Y los ejecutamos así:
$ ./mi_script “bash script”
Shell Scripts
Hay ciertas variables especiales para manejar los argumentos:
■ $0: contiene del nombre del script, en nuestro caso ./mi_script
■ $1, $2, … : los argumentos envidos al script
■ $#: contiene el número de argumentos
■ $*: contiene todos los argumentos
■ $$: ID proceso script actual
Shell Scripts
Funciones
Para scripts más largos, podemos crear funciones, de esta forma:
function <nombre función> {
comando1
comando2
Cambiemos nuestro script para que usen funciones…
#!/bin/bash
#función…
function mostrar_mensaje{
echo “hola $1”
#script principal
mostrar_mensaje
Noten que los comentarios empiezan con #.
Así como en otros lenguajes, las variables declaradas dentro de una
función son locales (usando la palabra local), y fuera de ella, globales.
#!/bin/bash
QUIEN="bash"
function mensaje {
local QUIEN_MAS
QUIEN_MAS = "world"
echo "Hello $1"
echo "Hello $QUIEN"
echo "Hello $QUIEN_MAS"
}
mensaje
echo "bye $QUIEN"
echo "bye $1"
echo "bye $QUIEN_MAS"
■ Si ejecutamos…
eduardo@ubuntu:~$ ./mi_script "bash script"
Hello
Hello bash
Hello world
bye bash
bye bash script
bye
En la última línea, no sale el nombre, por que tratamos de usar una
variable local fuera de la función.
Shell Scripts
Condicionales
Nos permiten evaluar condiciones. La sintaxis es
if [ condicion]; then
comandos
elif [condicion2]; then
comandos
else
comandos
fi indica fin de bloque if
Las condiciones van seguidas de punto y coma
¿Como hacemos las comparaciones?
Para comparaciones numéricas:
Para comparaciones de archivos (!)
Por ejemplo:
#!/bin/bash
if [ $1 -eq 0 ]; then
echo "hola"
else
echo "chao"
fi
Imprimará hola si el argumento es 0, y chao si es 1.
Para comparar strings, hay que tener cuidado:
#!/bin/bash
if [ $1 == "bash" ]; then
echo "hola $1"
else
echo "chao $1"
fi
¡Usamos el operador ==!
Shell Scripts
Lazos
Podemos tener lazos en los scripts, para realizar tareas repetitivas. Para el lazo for:
for mi_var in {inicio..fin}; do
comandos
comandos $mi_var
done
Veamos un ejemplo.
Shell Scripts
for mi_var in archivo1 archivo2; do
comandos
comandos $mi_var
done
for <variable> in ${comando_shell} do
comandos
done
Asumamos que tenemos una carpeta con cuatro archivo
llamados file1, file2, file3 y file4, además de otros archivos y
queremos borrar solo los archivos que empiezan con file
seguidos de un dígito. Podemos entonces:
#!/bin/bash
for archivo in file[[:digit:]] ; do
rm $archivo
done
Shell Scripts
Podemos tener lazos en los scripts, para realizar tareas repetitivas.
Para el lazo while:
While <condicion> ; do
comandos
done
Veamos un ejemplo.
Asumamos que tenemos una carpeta con cuatro archivo
llamados file1, file2, file3 y file4, además de otros archivos y
queremos borrar solo los archivos que empiezan con file
seguidos de un dígito. Podemos entonces:
#!/bin/bash
for archivo in file[[:digit:]] ; do
rm $archivo
done
Ejemplo, crear cuatro directorios llamados dir0, dir1, dir2, dir3:
#!/bin/bash
i=0
while [ $i -lt 4 ];
do
mkdir "dir$i"
((i++))
done
ls -l
Shell Scripts
Entrada y salida
Para leer texto desde el teclado, usamos read, y para imprimir algo en
pantalla, echo. Por ejemplo, el siguiente script lee el teclado e
imprime lo leído en pantalla.
#!/bin/bash
echo -n “Ingrese su nombre: "
read user_name
echo $user_name
Shell Scripts
■ Podemos usar redirección también. Por ejemplo, leer un archivo
linea por linea:
for read linea;
do
echo $linea
done < archivo