UT3.
Scripting en Linux
¿Que son los scripts?
En Linux los procedimientos de comandos se conocen como scripts. Linux dispone de
varios Shell diferentes csh, bash, sh, ksh, etc. Cualquiera de ellos es mucho más potente
que cmd.
¿Cómo crear un script en Linux?
Para crear un script utilizaremos cualquiera de los editores de texto plano como vi, vim,
nano, joe, etc.
Una vez escrito el script, para ejecutarlo hay que añadirle el permiso de ejecución chmod
+x [Link]
y en ese momento ya podremos ejecutarlo. Para esto habrá que poner el nombre del
script precedido del directorio en el que se encuentra, incluso si es el directorio en el
que estamos. En este caso bastará con poner ./ delante del nombre del script.
./[Link]
Si se quisiese ver cómo se va ejecutando los comandos y que valor va tomando las
variables durante la ejecución a efectos de depuración del programa, se puede ejecutar
el script con la sentencia bash -x delante del nombre del script. bash -x ./[Link]
Estructura del lenguaje. (bash)
Es recomendable poner en la primera línea, a partir del primer carácter la sentencia:
#!/bin/bash
Esto hace que el sistema operativo sepa con qué intérprete de comandos va a ejecutar
las instrucciones siguientes. Aquí se puede añadir -x o -v para que se vean las líneas de
comandos en tiempo de ejecución. Con -x sustituye las variables por su valor y con -v
no.
1
Por supuesto, se pueden utilizar todos los comandos del Shell, y en la siguiente tabla
aparecen algunos comandos y opciones para scripts.
# Comentario. No interpreta lo que hay a partir de este símbolo
read Para que el usuario introduzca un dato
echo Muestra el mensaje que viene a continuación por pantalla
& Puesto después del comando, ejecuta este en segundo plano
orden1 && orden2 Ejecuta la orden 1 y si va bien, ejecuta la orden 2
orden1 || orden2 Ejecuta la orden 1 y si va mal, ejecuta la orden2
; Ejecuta todas las órdenes una tras otra ls -l; catprac.c; date
Para mostrar por pantalla con echo, podemos utilizar las siguientes secuencias de
escape.
\n Salto de línea
\r Return
\t Tabulador
\v Tabulador vertical
\b Retroceso
\a Pitido
\" Comillas dobles (dentro de otras comillas dobles)
\$ El carácter $
\\ La barra \
Además hay que saber cómo funcionan las comillas en bash. Las comillas dobles
permiten que se evalúen las variables que contienen, mientras que las comillas simples
ponen todo literalmente.
Crear un script, método paso por paso.
• Comenzaremos creando un Simple y clásico "Hola Mundo", escribiendo en tu plantilla
el siguiente código:
#!/bin/bash
# declaramos la variable cadena
cadena="Hola Mundo"
2
# mostramos la variable por pantalla
echo $cadena
Variable= Para definir una variable
$variable Para coger el valor de la variables
Para ejecutar recuerde:
chmod + x [Link]
./[Link]
• Script que lee un valor del usuario y lo muestra por pantalla
#!/bin/bash
# leemos un valor del usuario
echo "Introduce un texto: "
read texto
echo "El texto introducido fue: $texto"
• Script que realiza una copia de seguridad del directorio descargas de tu usuario.
#!/bin/bash
# copia del directorio home
destino=copia_descargas.[Link]
echo "Copiando directorio home en descargas: "
$destino tar -czf $destino /home/miusuario/Descargas
echo "Terminado"
• Script que se le pasa diferentes parámetros.
#!/bin/bash
# paso de parámetros
echo "Este script muestra los parámetros que has pasado"
echo "El primer parámetro es $1"
echo "El segundo parámetro es $2"
echo "El tercero parámetro es $3"
echo "En total has pasado $#"parámetros"
echo "Y la lista de parámetros total es $* "
3
$0 Nombre del script
$1 1 º parámetro
$2 2 º parámetro
$3 3 º parámetro
$# total parámetros
$* Número de parámetros
• Script que cuenta el número de palabras de un archivo pasado por parámetros.
#!/bin/bash
#número de palabras
echo "Este script cuenta las palabras del archivo que has pasado "
num=$(cat $1|wc -w)
echo "El fichero $1 tiene $num palabras"
• Utilizar el comando SHIFT. Este comando hace que los parámetros vayan
"pasando" uno a uno. Ejemplo: ./prueba_shift.sh uno dos tres
#!/bin/bash
#Paso de parámetros con SHIFT
echo el primer parámetro es $1.
shift
echo el segundo parámetro es $2.
shift
echo el tercer parámetro es $1.
• Script que te calcula las tablas de multiplicar.
#!/bin/bash
#Tablas de multiplicar
echo "Indica el valor que quieres multiplicar: "
read valor
echo 1 x $valor =$(1*$valor )
echo 2 x $valor =$(2*$valor )
echo 3 x $valor =$(3*$valor )
echo 4 x $valor =$(4*$valor )
echo 5 x $valor =$(5*$valor )
4
echo 6 x $valor =$(6*$valor )
echo 7 x $valor =$(7*$valor )
echo 8 x $valor =$(8*$valor )
echo 9 x $valor =$(9*$valor )
echo 10 x $valor =$(10*$valor )
Símbolo Operación
+ Suma
- Resta
* Multiplicación
/ División
% Resto de la división entera
() Sirven para agrupar operaciones
+= Acumulación de suma
-= Acumulación de resta
*= Acumulación de producto
/= Acumulación de división
%= Resto de la división
++ Incremento de 1
-- Decremento de 1
• Script con variables del entorno.
#!/bin/bash
#Variables del entorno
echo "El nombre de usuario actual es $LOGNAME"
echo "El directorio de trabajo es $HOME"
echo "Los ficheros ejecutables se encuentran en $PATH"
5
• Sentencias condicionales:
if [ "codicion" ]; then
"comandos"
[ elif "condicion" then
"comandos"]
[ else
"comandos"]
fi
Operador para números:
Operador Verdad (TRUE) si:
x -lt y x menor que y
x -le y x menor o igual que y
x -eq y x igual que y
x -ge y x mayor o igual que y
x -gt y x mayor que y
x -ne y x no igual que y
Operador para cadenas:
Operador Verdad (TRUE) si:
cadena Cadena contiene algo
-n string La longitud de la cadena no es 0
-z cadena La longitud de la cadena es 0
cadena1 = cadena2 Las dos cadena son iguales
cadena1 !=cadena2 Las dos cadenas son distintas
cadena1 < cadena2 Cadena1 es menor que cadena2
cadena1 > cadena2 Cadena1 es mayor que cadena 2
6
Operador para ficheros:
Operador Verdad (TRUE) si:
-d fichero Fichero existe y es un directorio
-e fichero Fichero existe
-f fichero Fichero existe y es un fichero regular (ni directorio ni fichero
especial)
-b fichero Es un dispositivo de bloque (disco duro, etc.)
-c fichero Es un dispositivo de carácter (ratón, teclado, etc, etc.)
-p fichero Es una tubería
-s fichero Fichero existe y no está vacío
-w fichero Tienes permiso de escritura en fichero
-x fichero Tienes permiso x en fichero (o de búsqueda si es un
directorio)
-O fichero Eres el dueño del fichero
-G fichero El grupo del fichero es igual al tuyo
fichero1 -nt fichero2 Fichero1 es más reciente que fichero2
fichero1 -ot fichero2 Fichero1 es más antiguo que fichero2
! Niega la condición
• Script que lee por teclado un fichero e indica si existe o no.
#!/bin/bash
#Fichero existe o no
echo "Introduce un nombre del fichero: "
read fichero
if [ -e $fichero ] ; then
echo "El fichero existe"
else
echo " El fichero no existe "
fi
7
• Script que compara un valor numérico.
#!/bin/bash
#Compara valor numérico
echo "Introduce un número: "
read numero
if [ $numero -gt 1000 ]; then
echo "El número es mayor de 1000"
else
echo " El número es menor que 1000 "
fi
• Script que comprueba las tres primeras columnas de un fichero (que contiene
solamente una línea) son iguales o diferentes.
#!/bin/bash
#Compara columnas de archivo
palabra1=`cat [Link]|cut -d " " -f 1`
palabra2=`cat [Link]|cut -d " " -f 2`
palabra3=`cat [Link]|cut -d " " -f 3`
echo $palabra1
echo $palabra2
echo $palabra3
if [ $palabra1 = $palabra2 ] ; then
if [ $palabra1 = $palabra3 ] ; then
echo "Son iguales"
else
echo " No son iguales"
fi
else
echo " No son iguales "
fi
8
Estructura de selección múltiple CASE.
case variable in
patron1) comando1
comando2;;
patron2) comando3
comando4;;
....
....
*)
default;;
esac
Script que indica si el mes introducido es el primero o el segundo.
#!/bin/bash
#Indica si es mes uno o dos
echo "Introduce un mes: "
read mes
case $mes in
Ene*|ene*|ENE*)
echo "Es el primer mes ";;
Feb*|feb*|FEB*)
echo "Es el segundo mes ";;
*)
echo "No es ni el primer ni el segundo mes ";;
esac
9
• Sentencias repetitivas (bucles):
o Estas sentencias hacen que se repita una serie de comandos de forma varias
veces, hasta que se cumpla una condición.
• Sentencia repetitiva FOR, tenemos dos opciones:
o For realizará las acciones una vez por cada elemento de la lista que se le pasa.
Las variables del for irá recibiendo un elemento de esto en cada vuelta. La
sintaxis es:
for variable [[ in [lista]]
do
instrucciones
done
o En esta otra acepción de for, se ejecuta el bucle, un número fijo de veces y
hay una ariable que va cambiando en cada vuelta desde un valor inicial hasta
que llega o sobrepasa un valor final y se dice también el valor del incremento
de la variable en cada vuelta. La sintaxis es:
for (( expr1;expr2;expr3))
do
instrucciones
done
• Script que muestra las características de los ficheros de un directorio
#!/bin/bash
#For lista de archivos
for fich in `ls `
do
stat $fich
done
Script que muestra los números del 1 al 20 saltando de 2 en 2
#!/bin/bash
#For del 1 al 20
for ((a=1;$a<=20;a=$a+2))
do
echo $a
done
10
Imaginemos que tengo 3 archivos en determinada carpeta,
llamados respectivamente desde el número 1 hasta el 3. Imaginemos después que si
el archivo contiene un gusano (la variable $gusano), entonces la variable ya
mencionada tendrá un valor igual a 1, y si no, tendrá un valor igual a 0. Realiza dicho
Script.
#!/bin/bash
# El script importa la variable guardada en cada archivo
# y determina si "tiene o no gusano"
##Cambiando al directorio especificado
lastdir=(echo $PWD)
cd $1
## Inicializando aplicación
contador=0
patron="gusano"
# Lee todos los archivos del directorio
for archivo in `ls $1`
do
if [ -f $archivo ]
then
for linea in $(cat $archivo)
do
echo $linea
if [ $linea != $patron ]
then
echo "El $archivo no tiene gusano"
else
echo "El $archivo tiene gusano, eliminando"
rm $archivo
fi
done
fi
done
11
Sentencia repetitiva While y Until.
While ejecuta una serie de instrucciones mientras se cumpla la condición que se
dice. Se ejecutan hasta que la condición da un valor de falso, o distinto de 0.
La sintaxis es:
while codicion
do
comandos
done
Until hace exactamente lo mismo, pero con la condición contraria, es decir, hace el
bucle hasta que se cumple la condición que se indica.
La sintaxis es:
until codicion
do
comandos
done
• Script que muestra los números del 1 al 20 saltando de 2 en 2 con while.
#!/bin/bash
#While del 1 al 20
a=1
while [ $a -le 20 ]
do
echo $a
a=$(($a+2))
done
• Script que muestra los números del 1 al 20 saltando de 2 en 2 con until.
#!/bin/bash
#Until del 1 al 20
a=1
until [ $a -ge 20 ]
do
echo $a
a=$(($a+2))
done
12
Script que lee una línea en un bucle hasta que introduce la palabra salir.
#!/bin/bash
# leemos de stdin hasta que se introduzca la palabra 'salir'
read linea
while [$linea !="salir"]
do
read linea
done
Sentencia SELECT. Permite seleccionar al usuario una opción de una lista de opciones
en un menú.
La sintaxis de esta construcción es la siguiente:
select nombre [in lista]
do
comandos que pueden utilizar $nombre
done
Script con la sentencia SELECT.
#!/bin/bash
select OPCION in opcion_1 opcion_2 opcion_3
do
if [ $OPCION ]
then
echo "Opción elegida: $OPCION"
break
else
echo "Opción no valida"
fi
done
13