shell scripting en linux - cryptomex.orgcryptomex.org/slidessistop/shellscripts.pdf · sistemas...
Post on 15-Oct-2018
230 Views
Preview:
TRANSCRIPT
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 1
Dr. Roberto Gómez C.Lámina 1
Shell scripting en Linux
Roberto Gómez Cárdenasrogomez@itesm.mx
http://homepage.cem.itesm.mx/rogomez
Dr. Roberto Gómez C.Lámina 2
Introducción
• Shell– Interfaz con el usuario
– Interprete de comandos
– Aspectos de programación
• Shell script– Ejecución automática de comandos
– Procesamiento en batch de comandos
– Tareas repetitivas
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 2
Dr. Roberto Gómez C.Lámina 3
Shells en Linux
• Existen varios disponibles
• Ejemplos– Bourne shell: sh
– Korn shell: ksh
– C shell: csh
– Bash: bsh
• El shell bash es el más popular.
Dr. Roberto Gómez C.Lámina 4
El Bourne Again Shell
• Abreviado shell
• Es el shell por default en la mayoría de las distribuciones Linux
• También usado en todas las plataformas Unix
• Contiene características de– ksh, csj, sh, etc
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 3
Dr. Roberto Gómez C.Lámina 5
Características programación bash
• Soporta varías características de programación– Variables, arreglos, ciclos, operadores de
decisión, funciones, parámetro posicionales
• Pipes, redirección entrada/salida
• Características varias– Expansiones, control de trabajos (jobs)
• Comandos construidos a su interior– read, echo, source, alias
Dr. Roberto Gómez C.Lámina 6
Un script shell muy simple
#!/bin/bash# Archivo: catfile.sh# Uses the cat command to display a file
FILE=$1echo "Displaying file $FILE"cat $FILE
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 4
Dr. Roberto Gómez C.Lámina 7
Ejecutando un script shell
• Primer método
• Segundo método
$ chmod +x catfile.sh$ ./catfile.sh
$ bash catfile.sh
Dr. Roberto Gómez C.Lámina 8
Variables
• Posible usar variables como en cualquier lenguaje de programación.
• Valores siempre almacenados como strings– Existen operadores matemáticas en el lenguaje shell que
convertirá variables a número para cálculos
• No es necesario declarar una variable– Con solo asignar un valor a su referencia, esta será
creada
• Ejemplo#!/bin/bashSTR=“Hello World!”echo $STR
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 5
Dr. Roberto Gómez C.Lámina 9
Carácterísticas variables
• Las variables no cuentan con un tipo.
• Variables pueden tomar un número o un carácter.– cont = 0
– cont = domingo
• El carácter \ es el carácter de escape y preserva el valor literario del carácter que le sigue
$ ls \*ls *: No such file or directory$
Dr. Roberto Gómez C.Lámina 10
Apostrofes y comillas
• Cuando se asignan cadenas de caracteres que contiene espacios o caracteres especiales, la cadena debe estar encerrada entre apostrofes o comillas
• El uso de comillas (partial quoting) dentro de una cadena de caracteres permitira que cualquier variable dentro de las comillas sea interpretada
$ var=“test string”$ newvar=“Value of var is $var”$ echo $newvarValue of var is test string
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 6
Dr. Roberto Gómez C.Lámina 11
Apostrofes y comillas
• El uso de apostrofes (full quoing) dentro de una cadena de caracteres no permitirá una interpretación de variables
$ var=’test string’$ newvar=’Value of var is $var’$ echo $newvarValue of var is $var
Dr. Roberto Gómez C.Lámina 12
Ejemplos
$ pippo= pluto$ pippo =pluto
$ ls [Pp]*$ ls “[Pp]*”$ ls ‘[Pp]*’
$ var=“’(]\\{}\$\””$ echo $var$ echo “$var”$ echo ‘$var’
$ echo \z # z$ echo \\z # \z$ echo ‘\\z’ # \\z
error
no resuelto
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 7
Dr. Roberto Gómez C.Lámina 13
Más ejemplos
$ pippo= cat
$ echo “comando = \” $pippo \” “comando =“ cat ”
$ echo ‘comando = \” $pippo \” ‘comando =\” $pippo \”
$ echo ‘comando = ” $pippo ” ‘comando =” $pippo “$
Dr. Roberto Gómez C.Lámina 14
El comando export
• Comando activa una variable en el ambiente de tal forma que sea accesible por el proceso hijo.
• Ejemplo $ x=hello$ bash # correr un shell hijo$ echo $x # ningún valor en x$ exit # regresar al padre$ export x$ bash$ echo $xHello # aquí esta el valor$
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 8
Dr. Roberto Gómez C.Lámina 15
El comando export
• Si el proceso hijo modifica la variable, no se modificará el valor original asignado por el proceso padre.
• Esto se puede verificar de la siguiente forma:
$ x=cachafas$ exit$ echo $xHello$
Dr. Roberto Gómez C.Lámina 16
Variables de ambiente
• Existen dos tipos de variables– Variables locales
– Variables de ambiente
• Variables ambiente– Son inicializadas por el sistema y se pueden
listar con el comando env
– Almacenan valores especiales
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 9
Dr. Roberto Gómez C.Lámina 17
Ejemplo salida comando env
$ envHOSTNAME=localhostPVM_RSH=/usr/bin/rshSHELL=/bin/bashTERM=xtermHISTSIZE=1000USER=rootLS_COLORS=no=00:fi=00:di=00;34: ln=00;36:pi=40;33:so=00;35PVM_ROOT=/usr/share/pvm3USERNAME=rootMAIL=/var/spool/mail/rootPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:INPUTRC=/etc/inputrcPWD=/rootLANG=en_US.UTF-8
:::
Dr. Roberto Gómez C.Lámina 18
Ejemplo salida comando env
:::
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpassSHLVL=1HOME=/rootBASH_ENV=/root/.bashrcLOGNAME=rootLESSOPEN=|/usr/bin/lesspipe.sh %sDISPLAY=:0.0G_BROKEN_FILENAMES=1XAUTHORITY=/root/.xauthauuuYC_=/bin/env$
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 10
Dr. Roberto Gómez C.Lámina 19
Algunas variables de ambiente
• LOGNAME: contiene el nombre del usuario
• HOSTNAME: contiene el nombre de la computadora
• MACHTYPE: hardware del sistema
• PS1: secuencia caracteres mostrados antes del prompt
• UID: uid del usuario
• SHLVL: el nivel del shell
Dr. Roberto Gómez C.Lámina 20
Lo primero es lo primero: el prompt
• Símbolo que indica que el shell esta listo para recibir instrucciones.
• Existen prompts por defeault, dependiendo del shelly tipo de unix utilizado
• $ bourne shell o korn shell• % c shell o tc shell• # representa que el usuario es root
• Es posible que un usuarios defina su propio prompta través de la variable de ambiente correspondiente– En el caso de Linux es PS1, por ejemplo el valor
– produce el siguiente promptPS1 = '\[\u@\h \W]$ '
[toto@localhost bin]$
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 11
Dr. Roberto Gómez C.Lámina 21
Opciones para configurar el prompt
Carácter nnn (en octal)\nnn
Carácter de prompt según\$
La posición en el history\!
El número de comando\#
El nombre de la máquina actual\h
El nombre del shell\s
La fecha actual\d
La hora actual\t
Ruta completa de trabajo\w
Directorio trabajo\W
Nombre usuario\u
SignificadoCarácteres
Dr. Roberto Gómez C.Lámina 22
Comando exit
• Puede ser usado para terminar un script• También puede regresar un valor, el cual esta
disponible al padre del proceso• Sintaxis
– donde nnn es el status de salida– puede tomar un valor entre 0 y 255– es el programador el que decide que número usar
exit nnn
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 12
Dr. Roberto Gómez C.Lámina 23
Comando exit
• Cuando un script termina con exit que no cuenta con parámetro el status regresado es el status con el que terminó el último comando ejecutado en el script.
#!/bin/bash
COMMAND_1
. . .
# exit with status of last command. COMMAND_LAST
exit
#!/bin/bash
COMMAND_1
. . .
# exit with status of last command. COMMAND_LAST
exit $?
Dr. Roberto Gómez C.Lámina 24
Comando read
• Permite solicitar datos de entrada y almacenarlos en una variable.
• Ejemplo
#!/bin/bashecho -n “Enter name of file to delete: ”read fileecho “Type 'y' to remove it, 'n' to change your mind ... ”rm -i $fileecho "That was YOUR decision!"
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 13
Dr. Roberto Gómez C.Lámina 25
Opciones comando read
• read –s – No hace un eco de la entrada
• read –nN– Solo acepta n caracteres como entrada
• read –p “mensaje”– Despliega mensaje
• read –tT– Acepta entrada por T segundos
Dr. Roberto Gómez C.Lámina 26
Susbtitución comandos
• El backquote“`” es diferente del single quote “´”• El primero es usado para la sustitución del
comando `command`
• Ejemplo 1:
• Ejemplo 2
$ LIST=`ls`$ echo $LISThello.sh read.sh
PS1=“`pwd` >”/home/rinaldi/didattica/ >
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 14
Dr. Roberto Gómez C.Lámina 27
Susbtitución comandos
• Se puede llevar a cabo la substitución con el comando $(comando)
• Ejemplo 1
• Ejemplo 2
• Ejemplo 3
• Ejemplo 4
$ LIST=$(ls)$ echo $LISThello.sh read.sh
rm $( find / -name “*.tmp” )
ls $( pwd )
ls $( echo /bin )
Dr. Roberto Gómez C.Lámina 28
Ejemplo
$ a=`echo Hello`
$ echo $a
$ echo ‘$a’
$ b=`ls /home`
$ echo $b
$ echo $a $b
$ echo “$a $b”
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 15
Dr. Roberto Gómez C.Lámina 29
Operadores aritméticos
modulo%
multiplicación*
división/
exponenciación**
resta-
suma+
SignificadoOperador
Dr. Roberto Gómez C.Lámina 30
Enunciado let
• Usado para llevar a cabo funciones matemáticas
• Expresión puede ser evaluada con:$[expression] or $((expression))
$ let X=10+2*7$ echo $X24$ let Y=X+2*4 $ echo $Y32
$ echo $((123+20))143
$ VALORE=$[123+20]$ echo $[123*$VALORE]
1430$ echo $[2**3]$ echo $[8%3]
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 16
Dr. Roberto Gómez C.Lámina 31
Enunciados condicionales
• Decidir si una acción se lleva a cabo o no.
• Esta decisión se toma evaluando una expresión.
• Sintaxis básica:
if [expression];then
statementselif [expression];
thenstatements
elsestatements
fi
Dr. Roberto Gómez C.Lámina 32
Expresiones
• Una expresión puede ser– Comparación de strings
– Comparación numérica
– Operadores archivos
– Operadores lógicos
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 17
Dr. Roberto Gómez C.Lámina 33
Comparativos strings
Evaluar si longitud del string es igual a cero-z
Evaluar si longitud del string es mayor que cero-n
Comparar si dos strings no son iguales!=
Comparar si dos strings son iguales=
SignificadoOperador
Verdad si -z
Verdad si s1 no esta vacío, sino falso-n
Verdad si es diferente a s2 sino falso!=
Verdad si s1 es igual a s2, sino falso[ s1 = s2 ]
SignificadoEjemplo
Dr. Roberto Gómez C.Lámina 34
Comparativos numéricos
Comparar si un número es mayor que otro -gt
Comparar si dos números no son iguales-ne
Comparar si un número es mayor que otro -lt
Comparar si un número es menor que o igual a otro-le
Comparar si un número es mayor que o igual a otro-ge
Comparar si dos números son iguales-eq
SignificadoOperador
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 18
Dr. Roberto Gómez C.Lámina 35
Comparativos archivos
Verifica si el archivo tiene permiso de escritura-w
Verifica si el archivo tiene permiso de lectura-r
Verifica si el archivo tiene una longitud mayor a cero-s
Verifica si el nombre del archivo existe-e
Verifica si el archivo tiene permiso de ejecución-x
Verifica si el path es una liga simbólica-s
Verifica si el path es un archivo-f
Verifica si el path es un directorio-d
SignificadoOperador
Dr. Roberto Gómez C.Lámina 36
Ejemplo
#!/bin/bashif [ -f /etc/fstab ];
thencp /etc/fstab .
echo “Hecho.”elseecho “El archivo no existe.”
exit 1fi
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 19
Dr. Roberto Gómez C.Lámina 37
Ejercicio
• Escriba un script que acepte el nombre de un archivo como entrada– El script debe verificar si el archivo existe, y
crear un directorio de nombre Backup
– Si el archivo existe debe copiar el archivo con el mismo nombre más .bak (si el .bak ya existe debe preguntar si desea reemplazarlo)
– Si el archivo no existe, entonces debe salirse del script con el mensaje: “El archivo <arch> no existe !!! “
Dr. Roberto Gómez C.Lámina 38
Solución ejercicio
#!/bin/bashif [ ! –d ./Backup ] then mkdir ./Backupfiread –p “insert the name of a file” pippoif [ -f $pippo ]then cp $pippo ./Backup/$pippo.bakelse echo “The file $pippo does not exist!!!”fi
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 20
Dr. Roberto Gómez C.Lámina 39
Operadores lógicos
OR lógico entre dos expresiones lógicas-o ||
AND lógico entre dos expresiones lógicas-a &&
Negación (NOT) de una expresión lógica!
SignificadoOperador
#!/bin/bash# Nombre archivo: if3.shecho -n “Enter a number 1 < x < 10:”read numif [ “$num” -gt 1 –a “$num” -lt 10 ]; then
echo “$num*$num=$(($num*$num))”else
echo “Wrong insertion !”fi
Dr. Roberto Gómez C.Lámina 40
Parámetros shell
• Parámetros posicionales– Asignados de los argumentos del shell cuando el script
es invocado
– El parámetro posicional “N” puede ser referenciado como “${N}”, o como “$N” donde N consiste de un simple dígito
– $0: el nombre del script corriendo
– $1: el primer parámetro
– $2: el segundo parámetro
– etc.
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 21
Dr. Roberto Gómez C.Lámina 41
Parámetros shell
• Parámetros especiales
numero pid del proceso actual$$
número pid del proceso hijo$!
lista de argumentos a partir de $1$*
numero argumentos pasados al script$#
Arreglo de palabras conteniendo todos los parámetros pasados al script
$@
nombre del script$0
Valor de salida del último comando, 0 si todo salió bien$?
SignificadoVariable
Dr. Roberto Gómez C.Lámina 42
Enunciado case
• Usado para ejecutar enunciados basado en valores específicos.
• Sintaxis
case $var inval1)
statements;;val2)
statements;;*)
statements;;esac
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 22
Dr. Roberto Gómez C.Lámina 43
Ejemplo case
#!/bin/bash # Nombre archivo: case.shecho -n “Enter a number 1 < x < 10: ”read x case $x in
1) echo “Value of x is 1.”;;2) echo “Value of x is 2.”;;3) echo “Value of x is 3.”;;4) echo “Value of x is 4.”;;5) echo “Value of x is 5.”;;6) echo “Value of x is 6.”;;7) echo “Value of x is 7.”;;8) echo “Value of x is 8.”;;9) echo “Value of x is 9.”;;0 | 10) echo “wrong number.”;;*) echo “Unrecognized value.”;;
esac
Dr. Roberto Gómez C.Lámina 44
Enunciados iteración
• Estructura for es usada para ciclar a través de un rango de variables.
• Sintaxis
for var in listdo
statementsdone
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 23
Dr. Roberto Gómez C.Lámina 45
Ejemplo iteración
#!/bin/bashlet sum=0for num in 1 2 3 4 5do
let “sum = $sum + $num”doneecho $sum
• Un clásico
• Listado todos los archivos del directorio actual#!/bin/bashfor x in *do
ls -l “$x”sleep 1
done
Dr. Roberto Gómez C.Lámina 46
Enunciado while
• Estructura ciclo
• Usada para ejecutar un conjunto de comandos mientras una condición especificada es verdad
• Sintaxis
while expressiondo
statementsdone
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 24
Dr. Roberto Gómez C.Lámina 47
Ejemplo uso enunciado while
#!/bin/bashecho –n “Enter a number: ”read xlet sum=0let i=1while [ $i –le $x ]; do
let sum=$sum+$ilet i=$i+1
doneecho “the sum of the first $x numbers is: $sum”
Dr. Roberto Gómez C.Lámina 48
Enunciado continue
• Provoca un salto a la siguiente iteración del ciclo, saltando los comandos restantes.
#!/bin/bash # Nombre archivo: cont.shLIMIT=19 echo echo “Printing Numbers 1 through 20 (but not 3 and 11)”a=0 while [ $a -le “$LIMIT” ]; do
a=$(($a+1)) if [ “$a” -eq 3 ] || [ “$a” -eq 11 ] then
continue fiecho -n “$a ”
done
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 25
Dr. Roberto Gómez C.Lámina 49
Enunciado break
• Termina el cliclo (se sale de él)
#!/bin/bash # Nombre archivo: break.shLIMIT=19 echo “Printing Numbers 1 through 20, but something happens after 2 … ”a=0 while [ $a -le “$LIMIT” ]; do
a=$(($a+1)) if [ “$a” -gt 2 ] then
break fiecho -n “$a ”
done echo; echo; echo exit 0
Dr. Roberto Gómez C.Lámina 50
Enunciado until
• Similar a la estructura while
• Cicla hasta que la condición es verdad
• Sintaxis
until [expression]do
statementsdone
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 26
Dr. Roberto Gómez C.Lámina 51
Ejemplo enunciado until
# !/bin/bash# Nombre archivo: countdown.shecho “Enter a number: ”; read xecho ; echo Count Downuntil [ “$x” -le 0 ]; do
echo $x x=$(($x –1))sleep 1
done echo ; echo GO !
Dr. Roberto Gómez C.Lámina 52
Ejercicio
• Escribir un programa copiabin.sh que muevatodos los programas del directorio actual (archivos ejecutables) hacia el subdirectoriobin del directorio hogar del usuario, muestrelos nombres de los que mueve e indiquecuántos ha movido o que no ha movidoninguno. Si el directorio bin no existe, deberá ser creado.
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 27
Dr. Roberto Gómez C.Lámina 53
Solución ejercicio#!/bin/bash# copia archivos ejecutables hacia $HOME/bin, si directorio bin no existe lo creaif [ ! -d $HOME/bin ]thenmkdir $HOME/bin
fi# copia de archivosN=0 # contador de archivos copiadosfor ARCH in *do
if [ -x $ARCH -a -f $ARCH ] # ejecutable y archivo común (no directorio)thencp $ARCH $HOME/binecho " $ARCH fue copiado a $HOME/bin"N=`expr $N + 1`
fidoneif [ $N -eq 0 ]then
echo "No se copió ningún archivo"else
echo "Fueron copiados $N archivos"fi
Dr. Roberto Gómez C.Lámina 54
Manipulación sobre strings
• Bash cuenta con operaciones de manipulación de strings.
• Operaciones
Extrae $long caracteres de un substring de $string en $posicion
${string:posicion:long}
Extrae un sub-string de $string en la posición $posicion
${string:posicion}
Proporciona el tamaño del string${#string}
SignificadoOperación
Sistemas Operativos Comandos Linux
Dr. Roberto Gómez Cárdenas 28
Dr. Roberto Gómez C.Lámina 55
Ejemplo strings
$ st=0123456789$ echo ${#st}10$ echo ${st:6} 6789$ echo ${st:6:2} 67$
top related