Sei sulla pagina 1di 60

Intrprete de Comandos Bash Script

Kepa Bengoetxea

Motivacin: Bash Script


Por qu bash y no otra shell? Es el interprete de comandos mas extendido en Linux. Tambin conviene recordar que hay mas lenguajes interpretados para los que se pueden hacer scripts (perl, python, php, ). Pero realmente, cualquier administrador de mquinas Unix, usuario medio e incluso usuario novato le sacar mucho partido a la programacin de guiones de shell. Tareas repetitivas y tediosas que se pueden automatizar con unas pocas lineas.

Shell o Intrprete de Comandos


Un shell es un programa que interpreta y ejecuta los comandos que el usuario escribe en un indicador de lnea de comandos. Cuando inicie una terminal la aplicacin activar el shell predeterminado especificado en la cuenta del sistema. Tipos: Sh: Bourne shell Csh: C shell. Ampliacin sh con particularidades del lenguaje C. Bash: GNU Bourne-Again shell. Linux (defecto). Parecido al sh. Sigue el standard IEEE POSIX. Tcsh: Es la versin csh para Linux. Cada usuario tiene un shell por defecto, que se asocia a la hora de crear el usuario. Un Interprete de Comandos bash es un aplicacin de usuario, no es parte del kernel.

Creacin de un Script
Un script es un fichero de comandos.

Cmo crear un script:


1.- Editar: 2.- Permisos: 3.- Ejecutar: gedit miscript.sh chmod u+x miscript.sh ./miscript.sh

Entorno y Variables
Las variables en el bash son sin tipo, son una lista de caracteres que permite operaciones aritmticas si todos los caracteres son dgitos.

Ejemplo:
a=1 a=`expr $a + 1` echo "$a a="b" echo `expr $a + 1`

$ ./prueba.sh 2 expr: argumento no numrico

Comandos: echo
Muestra el contenido (variable o texto)
echo $HOME /home/kepa

Caracteres escape:
\c evita el salto de lnea \n inserta un salto de lnea \f inserta un salto de pgina \t inserta un tabulador \v inserta un tabulador vertical \b cdigo de retroceso \r retorno de carro \nnnn genera el cdigo ASCII del nmero octal

Comandos: echo
Caracteres especiales (*, $, \, ?, etc) son interpretados antes de pasarlos a echo, para controlar que tengan efecto o no:
Comillas simples(): impide la interpretacin.
echo '$HOME' -> $HOME

Comillas graves(`): lo interpreta como comando.


echo e Los usuarios conectados son:\n`who`

Comillas dobles("): Permite la intepretacin de $, \, comillas simples, comillas dobles.


echo "$HOME ->/home/kepa

Contrabarra(\): Elimina el significado del siguiente carcter.


echo "\$HOME"-> $HOME

Comandos: read
read: permite la introduccin de valores a travs de un guin.
echo "introduce un directorio" read dir echo "El contenido del directorio es $dir" echo "`ls $dir`"

Esto equivale a:
read -p "introduce un directorio" $dir echo "El contenido del directorio es $dir" echo "`ls $dir`"

Comandos: printf
printf fstring vars: muestra los valores de vars segn el formato especificado en fstring.
$ printf '%s\t :tu carpeta de inicio es %s\n' $USER $HOME kepa :tu carpeta de inicio es /home/kepa $ printf "%s\t :tu carpeta de inicio es %s\n" $USER $HOME kepa :tu carpeta de inicio es /home/kepa

Comandos: $?
$?: valor de la salida del ltimo comando o cdigo de error generado por la ltima orden (0 true y <> 0 false).
$mkdir trabajo(Correcto) $echo $? 0 $mdirk trabajo(Error) $echo $? 1 (valor distinto de 0)

Estructuras de Control: test


test: permite realizar comparaciones entre valores y variables, as como una serie de chequeos sobre ficheros
Comparar dos cadenas: $test hola = hola echo $? 0 $test hola = hola1 echo $? 1

Estructuras de Control: test


Comparar dos variables: cadenas nomvar1=hola nomvar=hola test $nomvar = $nomvar1 echo $? 0 Comparar dos variables: nmeros num1=1 num2=1 test $num1 -eq $num2 echo $? 0

Estructuras de Control: test


Tratamiento de cadenas:
test $cad1 = $cad2 test $cad1 != $cad2 test -z $cad #verdadero si cad esta vaca test -n $cad #verdadero si cad no es vaca. test $cad #verdadero si cad no es vaca.

Tratamiento de expresiones numricas:


test $num1 -eq $num2 test $num1 -ne $num2 test $num1 -lt $num2 test $num1 -le $num2 test $num1 -gt $num2 test $num1 -ge $num2

Estructuras de Control: test


Tratamiento de Ficheros: Ejemplo: nomfich="prueba.txt" test -f $nomfich echo $? -> 0 Retorna true(0) si... test -e $nomfich #si existe el fich test -f $nomfich #si es fich normal (no un dir o un dispositivo) test -s $nomfich #si su tamao es distinto de 0 test -d $nomfich #si es directorio test -b $nomfich #si es un disp. de bloque (fd0, hda, ...)

Estructuras de Control:test
Tratamiento de Ficheros: test -c $nomfich #si es un disp. de carcter (keyboard, modem, sound card, etc.) test -p $nomfich #si es una tubera test -h/-L $nomfich #si es un enlace simblico test -S $nomfich #si es un socket test -r $nomfich #si tienes permiso de lectura test -w $nomfich # si tienes permiso de escritura test -x $nomfich # si tienes permiso de ejecucin test -O $nomfich # si eres el propietario

Estructura de Control: test,[],[[]],(())


Cadena :Ejm: var="LINUX" if test $var = "LINUX" then echo "$var=LINUX" fi Nmero:Ejm: num1=2 if test $num1 -eq 2 then echo "$num1=2" fi #no utilizar -eq con caracteres!

Estructura de Control: test,[],[[]],(())


Los [] ejecutan el comando test var="LINUX" if [ $var = "LINUX" ] then echo "$var=LINUX" Dejar un espacio fi num1=2 if [ $num1 -eq 2 ] then echo "$num1=2" fi

Estructura de Control: no usar test,[],[[]],(())


[[ ]] :Ejm: if [[ $1 == "LINUX" ]] then echo "$1=LINUX" fi if [[ $1 == $2 ]] then echo "$1=$2" fi #no utilizar -eq con caracteres! if [[ $1 -eq $2 ]] then echo "$1=$2" fi

Estructura de Control: no usar test,[],[[]],(())


if (( $1 == $2 )) then echo "$1=$2" fi

Estructuras de Control:test
Opciones Fichero: Retorna true si... test -G $nomfich #si pertenece al grupo del fichero test -N $nomfich #si ha sido modificado desde la ltima vez que lo leste test $nomfich1 -nt $nomfich2 #Si $nomfich1 es ms reciente que $nomfich2 test $nomfich1 -ot $nomfich2 #Si $nomfich1 es posterior a $nomfich2 test $nomfich1 -ef $nomfich2 #Si $nomfich1 y $nomfich2 son enlaces duros del mismo fichero

Debugging
El shell tambin tiene un modo de depuracin real. Si hay un error en tu script "scriptconerror" entonces puedes depurarlo con: bash -x scriptconerror Esto ejecutar el script y mostrar todas la sentencias que se ejecutan con las variables y comodines ya expandidos.

Estructuras de Control: if(expr)


if expr/comando; then else fi Si la expr o comando devuelve true o correcto, ejecuta then; si devuelve false o incorrecto ejecuta else.
#!/bin/bash if test "petete" = "petete" ; then echo expresin evaluada como verdadera else echo expresin evaluada como falsa

Estructuras de Control: if(comando)


if expr/comando; then else fi Ejm: gedit copia.sh if mkdir $1 then
echo "Creando directorio $1 y Copiando ficheros" cp ~/.* $1

else
echo "Error al crear el directorio $1"

fi $./copia.sh lana

Estructuras de Control: if(and,or,not)


! expr devuelve valor booleano contrario a la expr expr1 -a expr2 es un AND expr1 -o expr2 es un OR Ejm: y=1 x=1 if test $x -eq 1 -a $y -eq 1 then echo "iguales" fi

Estructuras de Control: if(ficheros)


Ejemplo: read -p "introduce un fichero" $file if test -e $file ; then echo "El fichero $file existe" else echo "El fichero $file no existe" fi

Estructuras de Control: if-elif


if test condition1 then command elif test condition2 # Same as elseif then command else default-command fi

Estructuras de Control: if-elif


read -p "introduce un fichero" $file if [ -z $file ] ;then echo cadena vacia no permitido exit 1 elif [ ! -w $file ];then echo no tienes permiso de escritura exit 1 else echo kaixo $USER >> $file fi .... exit 0

Comandos: expr
Trabajar con nmeros: expr echo `expr 2 + 200` -> 202

n=`expr 4 + 2`
n=`expr 4 - 2 n=`expr 4 \* 2` #n=8 n=`expr 5 % 2` #n=1 (resto) n=`expr 5 / 2` #n=2 (parte entera) Nota: \ para evitar mezclar con los caracteres especiales: *(cualquier car)

Comandos: expr
Ejm1:
$vi pru
echo "Introduce dos nmeros:" read n1 n2 echo "La suma es `expr $n1 + $n2` "

$ chmod u+x pru $ ./pru Introduce dos nmeros: 25 La suma es 7

Comandos: expr
Ejm2:
$vi pru
echo "Introduce dos nmeros:" read n1 n2 echo "La multiplicacin es `expr $n1 \* $n2` "

$ chmod u+x pru $ ./pru Introduce dos nmeros: 25 La multiplicacin es 10

Operaciones Aritmticas:$(())
$(()):Evala la expresin como operacin entre enteros

n=$(( 4 + 2 ))
n=$(( 4 - 2 )) n=$(( 4 * 2 )) n=$(( 5 % 2 )) n=$(( 5 / 2 )) y=200 #n=8 #n=1 (resto) #n=2 (parte entera)

x=$(( $y/2 )) echo $x

Entorno y Variables: parmetros


Parmetros: $0,$1,$2,$3...$9
$0 contiene el nombre del script $1 el primer parmetro que se le pasa al script. $# indica el n de parmetros con el que se ha llamado al script. $* lista de todos los parmetros.

Entorno y Variables: parmetros


shift: Si necesitamos ms de 9 parmetros, se desplaza hacia la izquierda en una posicin, as $1 toma el valor de $2 Otra manera de obtener los argumentos despus del $9, es utilizando llaves, por ejm: ${10}, ${11}, ${12}
Ejm: $vi pru echo "${11}"

./pru 1 2 3 4 5 6 7 8 9 10 11 11

Entorno y Variables: parmetros


echo "El nombre del programa es $0" echo "El valor del primer parmetro es $1" echo "El valor del segundo parmetro es $2" echo "El nmero de parmetros introducido es $#" echo "La lista de todos los parmetros es $*" shift echo "El valor del segundo parmetro despus de un shift queda en $1" echo "El valor que retorno es $?"

./pru 1 2 3 4 5 6 7 8 9 10 11

Entorno y Variables: {}
{}Las llaves son la sntaxis general usada para la sustitucin de variables y $ hace uso de las llaves alrededor del elemento referenciado $1 puede escribirse como $1 ${1} $PATH puede escribirse como ${PATH} Cuando usamos las llaves? Diferencias entre usar: echo "${11} o $11 o ${1}1" echo "$PATH2 o ${PATH}2"

Variables: ${variable:x:y}
${HOME:0:1} El sufijo :0:1 que sigue al nombre de la variable se utiliza para extraer de HOME la subcadena que comienza en la primera posicin (los caracteres se enumerran comenzando desde 0), y contina 1 caracter ms. Es decir, este sufijo se utiliza para conseguir el primer carcter de la variable.

Estructuras de Control: Secuencia


Secuencial comandos:
$ ls dir1 ; ls dir2 ; ls dir3 > fich.txt

Grupo de comandos:
$ (ls lana;ls dos) > fitx.txt

Trucos
Expansin de llaves:
$ echo {one,two,red,blue}fish onefish twofish redfish bluefish Sustitucin de Comandos: $(command) donde command tiene salida estndar. Se usa para asignar el valor a una variable o para pasar como parmetro a otro comando. Es equivalente a `command`.
$ date +%d-%b-%Y 28-sep-2009 $ today=$(date +%d-%b-%Y) $ echo $today 28-sep-2009 $dpkg-query -L $(dpkg-query -l | grep vim)

Variables: eval
eval cadena :evala la cadena tras la sustitucin de las variables. Convert a string into a command. The eval command can be used for code generation from the command-line or within a script. bash$ command_string="ps ax" bash$ process="ps ax" bash$ eval "$command_string" | grep "$process"

Estructuras de Control: for


For: ejecuta tantas veces como elementos en lista
for contador in 1 2 3 do echo "El bucle durante $contador veces" done Nota: Va cogiendo los diferentes valores de la lista hasta que finaliza cuando contador es null.

Estructuras de Control: for


For: ejecuta tantas veces como elementos en lista cadena=`seq 1 3` for a in $cadena do echo hola done seq 9 -1 1 seq 1 9

Ejemplo
Qu hace el siguiente programa?
for i in `seq 1 $#` do n=$(echo "\$${i} ${n}") done for j in $(echo "$n") do eval "echo $j" done

Estructuras de Control: select


select: Similar al for. Una vez ejecutado el grupo de comandos volver a mostrarnos la lista de opciones sucesivamente hasta que pulsemos (Ctrl+C Ctrl+D)
select user in alum301 alum302 alumn303 do echo "Enviando mensaje a $user" mail $user < /path/msg done *Nota:sudo apt-get install mailutils

Estructuras de Control: select


select:
$ ./mail.sh 1) alum301 2) alum302 3) alumn303 #? 2 (Introducido por teclado) Enviando mensaje a alum302

Estructuras de Control: select


select:
#? 3 (Introducido por teclado) Enviando mensaje a alumn303 #? /home/kepa/dead.letter... Saved message in /home/kepa/dead.letter #? Ctrl+D (Introducido por teclado)

Estructuras de Control: case


case: vi menu
echo "1: Mostrar fecha y hora" echo "2: listar directorio" echo "Introduzca su opcin" read opcion case $opcion in 1)date;; 2)ls $HOME;ls /home/euiti/lana;; *)echo "Entrada no vlida. adis";; esac

Estructuras de Control: case


case: Elige una opcin entre $ ./pru 1: Mostrar fecha y hora 2: listar directorio Introduzca su opcion 2 Admin Contrapatentes.txt gcc.sxi

Estructuras de Control: while|until


While|until:
while condicin(true)|comando;(comando devuelva una salida) do ---- done until condicin(false)|comando;(comando no devuelva una salida) do ----- done n=1
acum=0 while test $n -le 9 do echo "Introduzca un valor" read valor acum=`expr $acum + $valor` n=`expr $n + 1` done echo "Acumulado=$acum"

Function (parmetros)
$vi prueba.sh function buenosdias() { echo "egunon $1" echo "egunon $2" } read -p Introduce 2 nombres n p buenosdias $n $p

$./prueba.sh
egunon Kepa egunon Joseba

Function (Incluir funciones)


$vi funciones.sh function buenosdias() { echo "egunon $1" }

$chmod +x funciones.sh principal.sh


$./principal.sh

introduce tu nombre
kepa egunon kepa

$vi principal.sh . ./funciones.sh echo "introduce tu nombre" read n1 buenosdias $n1

Function (return)
$vi prueba2.sh function igualabc () {if test $1 = "abc" then return 0 else return 1 fi} echo Introduce un valor read valor igualabc $valor echo $? ./prueba2.sh Introduce un valor

abc
0 $ ./prueba2.sh

Introduce un valor
pepe 1

Function (exit)
$vi prueba2.sh function igualabc () {if test $1 = "abc" then exit 0 else exit 1 fi} echo Introduce un valor read valor igualabc $valor echo $? ./prueba2.sh Introduce un valor

abc
$ ./prueba2.sh Introduce un valor

pepe

Estructuras de Control: return


return [n]

Salida de una funcin con el valor de retorno n.


Si se omite n , retorna el estado del ltimo comando ejecutado en el cuerpo de la funcin.

Estructuras de Control: exit


exit: se usa para terminar un script. El valor que se devuelve lo recoger el proceso padre. Todos los comandos retornan un exit donde 0 significa xito y <> 0 un cdigo de error. En caso de que nuestro script no tenga exit devolver el estado del ltimo comando ejecutado.

Estructuras de Control: exit


#!/bin/bash echo hello echo $? # Echo devuelve un 0 ya que el comando se ha ejecutado con xito lskdf # No reconoce el comando echo $? # Devuelve <> 0 ya que el comando ha fallado exit 113 # Retornar 113 al shell # Para verificar escribe "echo $?" despus de ejecutar el script.

Modos de ejecucin de Script


Script->Es un fichero de comandos. Ejm: vi ejemplo.sh
mkdir lana sleep 10 cd lana ls a

1.-$bash ./ejemplo.sh sh ./ejemplo.sh 2.-$./ejemplo.sh 3.-$source ./ejemplo.sh 4.-$. ./ejemplo.sh 5.-$exec ./ejemplo.sh

Modos de ejecucin de Script


Ejm1: more ejemplo1
#! /bin/bash //obligo que se abra un hijo bash #crea un directorio lana y muestra sus ficheros ocultos mkdir lana cd lana ls a (*) Comprobar si se modifica el directorio actual en los 5 diferentes modos.

Source o .
Source se utiliza normalemente en 2 casos: a) Las instrucciones(cambios de path...) y variables afecten al bash padre. .profile PATH="$PATH:$HOME/bin" export PATH b) Si quiero incluir funciones reusables en mi script: $vi funciones: function buenosdias(){echo "egunon $1"} $vi principal.sh: source ./funciones buenosdias $1

Modos de ejecucin de Script


$ exec ejemplo1
Se ejecuta en el mismo proceso que le llama. Normalmente cuando se llama a un script se crea un subproceso hijo con fork para que lo ejecute. Aqu el comando reemplaza al shell y cuando el script termina se cierra el shell, utilizndose en el ltimo comando de un script. Ejm:pstree -p o echo $$ detecta el PID del bash exec sh exec sleep 10 pstree -p (desde otra terminal) Qu ocurre?

Modos de ejecucin de Script


Ejm:vi prueba ls $ exec ./prueba

Potrebbero piacerti anche