Scripts en linux
Implantacin de sistemas operativos.
1 asir.
I.E.S. francisco romero Vargas.
Jose Antonio carrasco Diaz.
Nuestro primer script
mkdir ~/scripts
nano ~/scripts/primer_script.sh
#!/bin/bash
echo Hola Mundo, mi primer script en Linux !!
echo De momento no parece difcil el tema :-)
chmod a+x ~/scripts/primer_script.sh
~/scripts/primer_script.sh
cd ~/scripts/
./primer_script.sh
Usando source
cd ~/scripts
nano segundo_script.sh
#!/bin/bash
echo voy a contar cuantos scripts tenemos
ls *.sh | wc l
source segundo_script.sh
. segundo_script.sh
Usando source
cd ~/scripts
nano segundo_script.sh
#!/bin/bash
echo voy a contar cuantos scripts tenemos
ls *.sh | wc l
source segundo_script.sh
. segundo_script.sh
Expansin de comandos
cd ~/scripts
nano tercer_script_1.sh
#!/bin/bash
echo Tenemos $( ls *.sh | wc l ) scripts
chmod a+x tercer_script_1.sh
./tercer_script_1.sh
Expansin de comandos
cd ~/scripts
nano tercer_script_2.sh
#!/bin/bash
echo n Tenemos
echo n $( ls *.sh | wc l )
echo scripts
chmod a+x tercer_script_2.sh
./tercer_script_2.sh
Expansin de comandos
cd ~/scripts
nano tercer_script_3.sh
#!/bin/bash
NUMERO=$( ls *.sh | wc l )
echo Tenemos $NUMERO scripts
chmod a+x tercer_script_3.sh
./tercer_script_3.sh
Expansin de comandos
cd ~/scripts
nano tercer_script_4.sh
#!/bin/bash
LINEA=$( ls *.sh | wc l )
LINEA=Tenemos $LINEA scripts
echo $LINEA
chmod a+x tercer_script_4.sh
./tercer_script_4.sh
Expansin aritmtica
cd ~/scripts
nano cuarto_script.sh
#!/bin/bash
echo Dime un nmero :
read NUMERO
DOBLE=$(( $NUMERO * 2 ))
echo Has introducido $NUMERO y su doble es $DOBLE
chmod a+x cuarto_script.sh
./cuarto_script.sh
Expansin aritmtica
nano cuarto_script.sh
#!/bin/bash
clear
echo Dime un nmero :
read NUMERO
DOBLE=$[ $NUMERO * 2 ]
echo Has introducido $NUMERO y su doble es $DOBLE
Expansin aritmtica
nano quinto_script.sh
#!/bin/bash
CUENTA_BAR=100
GENTE=3
CADA_UNO=$[ $CUENTA_BAR / $GENTE ]
# Lnea de comentario
# Este script no funciona bien
echo Cada uno debemos pagar $CADA_UNO euros
Expansin aritmtica. bc.
sexto_script.sh
#!/bin/bash
CUENTA=100
GENTE=3
# Hacemos la divisin con dos decimales
CADA_UNO=$( echo scale=2; $CUENTA / $GENTE | bc l )
echo Cada uno debemos pagar $CADA_UNO euros
Script secuencial
cd ~/scripts ; mkdir ficheros
nano ficheros/nombres.txt
Nombre/Apellidos/Edad/Num_Compras/Importe_Facturado
Manuel/Quintanilla Fuentes/42/12/1897
Juan/Ortega Bellido/23/2/191
Virginia/Machado Lorca/52/9/2980
Ana/Bienvenido Sanchez/19/3/300
Script secuencial
Ejercicio: Crear un script llamado lista_clientes.sh que
procese el fichero nombres.txt y nos muestre por pantalla lo
siguiente:
LISTADO DE CLIENTES ORDENADOS POR NOMBRE
---------------------------------------------------------------------Ana Bienvenido Sanchez
Juan Ortega Bellido
Manuel Quintanilla Fuentes
Virginia Machado Lorca
Script secuencial
lista_clientes.sh
#!/bin/bash
clear
echo "LISTADO DE CLIENTES ORDENADOS POR NOMBRE"
echo "----------------------------------------------------------------------"
cat ficheros/nombres.txt | sed -e 1d > ficheros/temporal.txt
cat ficheros/temporal.txt | cut -d/ -f1,2 | sed -e "s/\// /" | sort
rm ficheros/temporal.txt
Script secuencial
Ejercicio: Crear un script llamado saldo.sh que me pida por
pantalla un nombre de cliente (solo el nombre) y me
muestre cual es su media facturada. (La media ser el
Importe Facturado dividido entre el Nmero de Compras.)
Dgame el nombre de un cliente :
Virginia
La media facturada es de 331,11 euros
Script secuencial
pasos para crear saldo.sh.
1)Limpiar la pantalla
2)Pedir que nos introduzca el usuario un nombre mediante read
3)Buscar la lnea del fichero que tiene ese nombre, y guardar dicha lnea
en un fichero temporal
4)Cortar de ese fichero temporal el Importe Total Facturado y guardarlo en
una variable
5)Cortar de ese fichero temporal el Numero de compras y guardarlo en
otra variable
6)Dividir la variable del Importe Total Facturado entre la variable del
Numero de compras (esa divisin debe hacerse con dos decimales) y
guardar el resultado en una variable.
7)Mostrar por pantalla dicha variable.
Script secuencial
#!/bin/bash
#saldo.sh Script que procesa ficheros/nombres.txt
clear
read -p Dgame el nombre de un cliente : NOMBRE
cat ficheros/nombres.txt | grep ^$NOMBRE > ficheros/temporal.txt
TOTAL=$( cat ficheros/temporal.txt | cut -d/ -f5 )
NCOMPRAS=$( cat ficheros/temporal.txt | cut -d/ -f4 )
MEDIA=$(echo "scale=2; $TOTAL / $COMPRAS" | bc -l)
echo La media facturada es de $MEDIA euros.
rm ficheros/temporal.txt
Funciones en un script.
nano saludo.sh
#!/bin/bash
function saludo {
echo Hola Mundo
}
echo Voy a saludar
saludo
echo Ya he saludado
Funciones en un script.
temperatura.sh
#!/bin/bash
function cent_2_fah {
echo $[ $GRADOS * 9 / 5 + 32 ]
}
read -p Dime los grados centigrados : GRADOS
FAHREN=$(cent_2_fah)
echo Eso son $FAHREN grados en la escala Fahrenheit
Funciones en un script.
Ejercicio: Crear un script con nombre longitud.sh que nos
pida por pantalla una palabra, y debe indicarnos a
continuacin la longitud de dicha palabra.
El script debe repetir esto 3 veces.
#!/bin/bash
function longitud {
. . . . . .
}
read -p Dime una palabra : PALABRA
.
Funciones en un script.
longitud.sh
#!/bin/bash
function longitud {
N=$( echo $PALABRA | wc -c )
N=$[ $N - 1 ]
echo $N
}
read -p "Dime una palabra : " PALABRA
echo $(longitud)
read -p "Dime una palabra : " PALABRA
echo $(longitud)
read -p "Dime una palabra : " PALABRA
echo $(longitud)
Estructuras condicionales.
Estructura condicional IF (s ... entonces haz ...)
if [ condicin ]; then
Bloque a realizar si condicin se cumple
fi
Estructuras condicionales.
Estructura condicional IF (s)
if [ condicin ]; then
Bloque a realizar si condicin se cumple
fi
Ejemplo:
if [ $NOMBRE = jose ]; then
echo Hola Jose
fi
Estructuras condicionales.
alibaba.sh
#!/bin/bash
read -p Dime la palabra secreta : PALABRA
if [ $PALABRA = abracadabra ]; then
echo Muy bien, puedes pasar
fi
Estructuras condicionales.
Estructura IF ELSE (s .. en caso contrario ..)
if [ condicin ]; then
Bloque a realizar si condicin se cumple
else
Bloque a realizar si condicin no se cumple
fi
Estructuras condicionales.
alibaba_2.sh
#!/bin/bash
read -p Dime la palabra secreta : PALABRA
if [ $PALABRA = abracadabra ]; then
echo Muy bien, puedes pasar
else
echo Esa no es la palabra secreta, fuera
fi
Estructuras condicionales.
cp alibaba_2.sh alibaba_3.sh
nano alibaba_3.sh
#!/bin/bash
# cuidado con este error que es peligroso
read -p Dime la palabra secreta : PALABRA
if [ $PALABRA=abracadabra ]; then
echo Muy bien, puedes pasar
else
echo Esa no es, fuera
fi
Operadores de comparacin de carcter
Cadena1 = Cadena2
Verdadero si son iguales
Cadena1 != Cadena2
Verdadero si NO son iguales
Cadena1 < Cadena2
Verdadero si C1 menor que C2 (no usar)
Cadena1 > Cadena2
Verdadero si C1 mayor que C2 (no usar)
-n Variable
Verdadero si Variable NO es nulo (vaco).
-z Variable
Verdadero si Variable es nulo (vaco).
Operadores de comparacin numricos.
Numero1 -eq Numero2
Verdadero si son iguales (equal)
Numero1 -ne Numero2
Verdadero si NO son iguales (not equal)
Numero1 -lt Numero2
Verdadero si N1 menor que N2 (less that)
Numero1 -gt Numero2
Verdadero si N1 mayor que N2 (greater that)
Numero1 -le Numero2
Verdadero si N1 es menor o igual que N2 (less
or equal)
Numero1 -ge Numero2
Verdadero si N1 es mayor o igual que N2
(greater or equal)
Script con estructura alternativa.
mayor_edad.sh
#!/bin/bash
read -p Dime tu edad : EDAD
if [ $EDAD -ge 18 ]; then
echo Muy bien, puedes pasar
else
echo Vete a la guardera
fi
Script con estructura alternativa.
menor_edad.sh
#!/bin/bash
read -p Dime tu edad : EDAD
if [ $EDAD -lt 18 ]; then
echo Vete a la guardera
else
echo Muy bien, puedes pasar
fi
Script con estructura alternativa.
comprobar_edad.sh
#!/bin/bash
read -p Dime tu edad : EDAD
if [ $EDAD -lt 18 ]; then
echo Vete a la guardera
else
if [ $EDAD -ge 80 ]; then
echo Haga el favor de irse de aqu abuelo.
else
echo Muy bien, puedes pasar
fi
fi
Estructuras condicionales.
Estructura IF ELIF ELSE (s .. en caso contrario s ..)
if [ condicin 1 ]; then
Bloque a realizar si condicin 1 se cumple
elif [ condicin 2 ]; then
Bloque a realizar si condicin 1 no se cumple,
pero condicin 2 si se cumple
else
Bloque a realizar si ninguna condicin se cumple
fi
Script con estructura alternativa.
comprobar_edad.sh
#!/bin/bash
read -p Dime tu edad : EDAD
if [ $EDAD -lt 18 ]; then
echo Vete a la guardera
elif [ $EDAD -ge 80 ]; then
echo Haga el favor de irse de aqu abuelo.
else
echo Muy bien, puedes pasar
fi
Operadores test.
-a fichero
Verdadero si fichero existe
-d fichero
Verdadero si fichero existe y es un directorio
-f fichero
Verdadero si fichero existe y es un fichero regular
-r fichero
Verdadero si fichero existe y se puede leer
-w fichero
Verdadero si fichero existe y se puede escribir
-x fichero
Verdadero si fichero existe y se puede ejecutar
fichero1 -nt fichero2
Verdadero si fichero1 es mas nuevo que fichero2
fichero1 -ot fichero2
Verdadero si fichero1 es mas antiguo que fichero2
Script con estructura alternativa.
Ejercicio: Crear un script con nombre cs.sh que nos va a
ayudar a crear scripts. Cuando se ejecute nos pedir por
pantalla un nombre de script, y a continuacin comprobara si
existe un fichero o directorio creado en el directorio actual
con ese mismo nombre. Si es as avisar del error.
Si no existe nada con ese nombre, crear un fichero con ese
nombre, lo har ejecutable y le aadir como primer linea
#!/bin/bash y como segunda lnea la siguiente:
# script nombre generado el 20/05/2014.
Estructuras condicionales.
Podemos combinar condiciones usando && (Y)
if [ condicin 1 ] && [ condicin 2 ]; then
Bloque a realizar si se cumple tanto condicin 1
como condicin 2
fi
if [ $EDAD -ge 18 ] && [ $EDAD -lt 80]; then
echo Puede pasar
fi
Estructuras condicionales.
Podemos combinar condiciones usando || (O)
if [ condicin 1 ] || [ condicin 2 ]; then
Bloque a realizar si se cumple condicin 1 O
se cumple condicin 2 (con que se cumpla 1 vale)
fi
if [ $EDAD -lt 18 ] || [ $EDAD -ge 80]; then
echo No tienes edad para pasar
fi
Estructuras condicionales.
Podemos combinar condiciones usando || (O)
if [ condicin 1 ] || [ condicin 2 ]; then
Bloque a realizar si se cumple condicin 1 O
se cumple condicin 2 (con que se cumpla 1 vale)
fi
if [ $EDAD -lt 18 ] || [ $EDAD -ge 80]; then
echo No tienes edad para pasar
fi
Estructuras condicionales.
Podemos negar condiciones usando ! (not)
If ! [ condicin 1 ]; then
Bloque a realizar si NO se cumple condicin 1
fi
If ! [ $EDAD -ge 18 ]; then
echo No tienes edad para pasar
fi
Estructuras iterativas. (bucles)
Estructura iterativa FOR (por cada elemento haz ...)
for VARIABLE in CONJUNTO; do
Bloque a realizar por cada elemento de conjunto
variable va tomando los valores de cada elemento
done
Estructuras iterativas. (bucles)
Estructura iterativa FOR (por cada elemento haz ...)
CONJUNTO es cualquier combinacin de valores
separados por espacios en blanco o bien por retornos
de lnea.
Estructuras iterativas. (bucles)
for VALOR in 14 87 96 perro gato; do
echo VALOR vale $VALOR
done
VALOR
VALOR
VALOR
VALOR
VALOR
vale
vale
vale
vale
vale
14
87
96
perro
gato
Estructuras iterativas. (bucles)
for VALOR in $CONJUNTO; do
echo VALOR vale $VALOR
done
Probar que resultados salen con los siguiente
conjuntos:
CONJUNTO=0 1 2 3 4 5 6 7 8 9
CONJUNTO=$(ls *.sh)
CONJUNTO=$(cat ficheros/nombres.txt)
Estructuras iterativas. (bucles)
for VALOR in $CONJUNTO; do
echo VALOR vale $VALOR
done
Probar que resultados salen con los siguiente
conjuntos:
CONJUNTO=0 1 2 3 4 5 6 7 8 9
CONJUNTO=$(ls *.sh)
CONJUNTO=$(cat ficheros/nombres.txt)
Estructuras iterativas. (bucles)
for VALOR in $(seq 20); do
echo VALOR vale $VALOR
done
for VALOR in $(seq 5 15); do
echo VALOR vale $VALOR
done
for VALOR in $(seq 1 2 20); do
echo VALOR vale $VALOR
done
Estructuras iterativas. (bucles)
Estructura iterativa while (mientras condicin haz ...)
while [ condicin ]; do
Bloque a realizar MIENTRAS la condicin se cumpla
done
Estructuras iterativas. (bucles)
Estructura iterativa until (hasta condicin haz ...)
until [ condicin ]; do
Bloque a realizar HASTA que la condicin se cumpla
done
Estructuras iterativas. (bucles)
NUM=1
while [ NUM -le 10 ]; do
echo $NUM
NUM=$[ $NUM + 1 ]
done
Estructuras iterativas. (bucles)
NUM=1
while [ NUM -le 10 ]; do
echo $NUM
NUM=$[ $NUM + 1 ]
done
1 2 3 4 5 6 7 8 9 10
Estructuras iterativas. (bucles)
NUM=1
until [ NUM -gt 10 ]; do
echo $NUM
NUM=$[ $NUM + 1 ]
done
Estructuras iterativas. (bucles)
NUM=1
until [ NUM -gt 10 ]; do
echo $NUM
NUM=$[ $NUM + 1 ]
done
1 2 3 4 5 6 7 8 9 10
Paso de parmetros
Se le pueden pasar parmetros a un script a la hora de
invocarlo.
./miprograma.sh 12 34 perro gato
12 -> parmetro 1
34 -> parmetro 2
perro -> parmetro 3
gato -> parmetro 4
Paso de parmetros
$1
Devuelve el parmetro nmero 1
$2
Devuelve el parmetro nmero 2
$n
Devuelve el parmetro nmero n (no puede ser mayor de 9)
$0
Devuelve el parmetro cero. (Esto es, el nombre del script).
$#
Devuelve el nmero de parmetros que se han pasado.
$*
Devuelve todos los parmetros pasados, uno detrs de otro.
Valores devueltos por las ordenes
Existe una variable especial $?
Esta variable valdr 0 si el ltimo comando ejecutado
funciono bien.
Si el ltimo comando ejecutado dio algn tipo de error,
esta variable no valdr 0. (valdr 1, o 2, o 3.....)
Valores devueltos por las ordenes
#!/bin/bash
clear
read -p Dime un nombre de usuario : NOM
cat /etc/passwd | cut -c: -f1 | grep -i $NOM &> /dev/null
# Ahora preguntamos si el ultimo comando (grep) funcion
if [ $? -eq 0 ]; then
echo $NOM es un usuario del sistema
else
echo usuario desconocido en este sistema
fi
Variable RANDOM
La variable $RANDOM nos devuelve un valor
aleatorio entre 0 y 32767 (por defecto).
#!/bin/bash
echo voy a generar un nmero aletario entre 0 y 5
NUMERO=$[ $RANDOM % 6 ]
# % es un operador aritmtico que nos devuelve el
# resto de una divisin (mdulo).
echo $NUMERO
Comprobar un valor vacio
#!/bin/bash
read -p Dime un nombre de usuario : NOM
cat /etc/passwd | cut -c: -f1 | grep -i $NOM 2> /dev/null
# Ahora preguntamos si el ultimo comando (grep) funcion
if [ $? -eq 0 ]; then
echo $NOM es un usuario del sistema
else
echo usuario desconocido en este sistema
fi
Comprobar un valor vaco
#!/bin/bash
read -p Dime un nombre de usuario : NOM
if [ $NOM = ]; then
echo No has escrito nada
else
Echo Has escrito el nombre $NOM
fi
Comprobar un valor vaco
#!/bin/bash
LETRA=
while [ $LETRA = ]; do
read -p Dime una letra : LETRA
done
echo Has introducido la letra $LETRA
Comprobar un valor vaco
#!/bin/bash
LETRA=X
until [ $LETRA != ]; do
read -p Dime una letra : LETRA
done
echo Has introducido la letra $LETRA
Comprobar un valor vaco
#!/bin/bash
SUMA=0
NUM=
until [ $NUM = ]; do
read -p Dime un numero : NUM
SUMA=[ $SUMA + $NUM ]
done
echo La suma es $SUMA
Variable IFS
Los conjuntos del for separan sus elementos por el espacio
en blanco o por el retorno de lnea, esto presenta
problemas si tenemos espacios en blanco en algunos
campos de un fichero, y queremos leer dicho fichero por
lneas.
# Esto no va a funcionar como esperamos
for LINEA in $(cat /ficheros/nombres.txt); do
echo Linea del fichero: $LINEA
done
Variable IFS
La variable IFS (Internal Field Separator) nos permite
cambiar el limitador del conjunto. El valor $'\n' del IFS nos
permite separar solo por retornos de lnea.
# Esto funciona bien
IFS=$'\n'
for LINEA in $(cat /ficheros/nombres.txt); do
echo Linea del fichero: $LINEA
done
unset IFS
Scripts en linux
FIN
Implantacin de sistemas operativos.
1 asir.
I.E.S. francisco romero Vargas.
Jose Antonio carrasco Diaz.