el shell bash. ficheros de configuración y variables de entorno programación básica del shell ...

41
El Shell Bash

Upload: ana-belen-ortega-quintero

Post on 24-Jan-2016

227 views

Category:

Documents


0 download

TRANSCRIPT

  • El Shell Bash

  • El Shell BashFicheros de configuracin y variables de entornoProgramacin bsica del ShellControl de flujoOpciones de la lnea de comandos, expresiones aritmticas y arrays.

  • Ficheros de configuracin ()/etc/profile se ejecuta siempre para todos los usuarios al logarnos en el sistema.Posteriormente se comprueba si en el home del usuario existe el archivo .bash_profile (puede llamarse tambin .profile o .bash_login), en el se puede establecer configuracin de entorno personalizada.Si queremos aplicar cambios en .bash_profile sin tener que volvernos a logar, usariamos el comando source.Si lo que queremos es ejecutar opciones de entorno para cada Shell que ejecutemos (abrir un Xterm), podemos usar el archivo .bashrc. Este archivo permite definir configuraciones adicionales.Por ltimo .bash_logout define ordenes que se ejecutarn al abandonar la cuenta de usuario, borrar ficheros temporales o almacenar datos de usuarios.

    Ejemplo comando source:$ source .bash_profile

  • Ficheros de configuracin ()Variables de entorno:Permiten configurar el entorno en el que se ejecutan los programas.IMP. No deben contener espacios entre nombre y valorPara obtener el valor de la variable debemos usar el operador $.Para eliminar una variable usaremos el comand unset.Ejemplos:$ NOMBRE=Guillermo Hernndez$ echo $NOMBREGuillermo Hernndez$ unset NOMBRE

  • Ficheros de configuracin ()Podemos configurar nuestro prompt configurando las variables de entorno PS1 y PS2. Los valores que podemos asignarles aparecen en la tabla 3.2, pgina 43.

    Ejemplo que mostrara # como prompt para root y $ para el resto, opcin \$: ~-> PS1=\w\$~$

  • Ficheros de configuracin ()Hay una serie de variables de entorno predefinidas en el sistema, ver tabla 3.3 de la pgina 44.Las variables de entorno tal y como las hemos definido solo podran ser usadas por nuestro Bash y los comando interactivos que ejecutemos, nunca por los subprocesos que Bash arranque. Para ello debemos exportarlas:

    $ EDITOR=/sw/bin/joe$ export EDITOR

    Para visualizar las variables de entorno exportadas usaremos el comando export o env. Para obtener las variables no exportadas usaremos set.

  • El Shell BashFicheros de configuracin y variables de entornoProgramacin bsica del ShellControl de flujoOpciones de la lnea de comandos, expresiones aritmticas y arrays.

  • Programacin bsica del ShellUn script es un fichero que contiene comados Bash ejecutables. Por ejemplo .bash_profile o .bashrc.Para ejecutar un script lo haremos usando el comando source, (local al Shell y por tanto ver todas las variables de entorno del Shell). asignandole permiso de ejecucin lo cual implicar que se ejecutar en un subShell que ya no ver las variables de entorno del Shell padre, slo las que se hayan exportado.

  • Programacin bsica del ShellFunciones:Son extensiones a los scripts, son heredadas del Bourne Shell.Se ejecutan dentro de la memoria del propio Shell, por lo que son ms eficientes que ejecutar otro script.Bourne ShellC Shellfunction nombrefnnombrefn(){{. .}}Para eliminar una funcin se ejecutar unset f nombrefn.Para ejecutar una funcin se escribir su nombre seguida por los argumentos que requiera, al igual que un comando.Ver orden de preferencia de smbolos pgina 47.

  • Programacin bsica del ShellVariables del Shell:Por defecto todas las variables son de tipo cadena.Por convenio las variables que queramos exportar se escribirn en maysculas, las que no en minsculas.Los parmetros posicionales son los encargados de recibir los argumentos de un script y parmetros de una funcin: $1,$2,$3 el parmetro $0 recibe el nombre del script que se ejecuta:Ejemplo: ejemplo.sh#!/bin/bash# Ejemplo de script que recibe parmetrosecho El script se llama $0echo Recibe los parmetros $1, $2, $3 y $4$ chmod g+x,o+x ejemplo.sh$ ejemplo hola adiosEl script ./ejemplo.shRecibe los parmetros hola adios

  • Programacin bsica del ShellVariables locales y globales:Los parmetros posicionales son siempre locales al script o funcin, mientras que el resto de variables del script sern siempre globales.#!/bin/bash# Script que llama a una funcin para saludar de nombre saluda.shfunction diHola{echo Hola $1}

    $ saluda.sh GuilleHola

  • Programacin bsica del ShellSi quisieramos que la funcin recibiera el parmetro de entrada al script haramos:#!/bin/bash# Script que llama a una funcin para saludar de nombre saluda.shfunction diHola{echo Hola $1}diHola $1Al ejecutarlo tendramos lo que buscamos:$ saluda.sh GuilleHola Guille

  • Programacin bsica del ShellEl resto de variables de un script sern siempre globales a ste:#!/bin/bash# Ejemplo de variables globales dondeestoyfunction EstasAqui{donde=Dentro de la funcin}donde=En el scriptecho $dondeEstasAquiecho $dondeAl ejecutar el script tendramos la siguiente respuesta:$ dondeestoyEn el scriptDentro de la funcin

  • Programacin bsica del ShellSi queremos que una variable no posicional sea local, utilizaremos el modificador local:#!/bin/bash# Ejemplo de variables globales dondeestoyfunction EstasAqui{local donde=Dentro de la funcin}donde=En el scriptecho $dondeEstasAquiecho $dondeAl ejecutar el script con este cambio tendramos la siguiente respuesta:$ dondeestoyEn el scriptEn el script

  • Programacin bsica del ShellComentar tambin por ltimo que las variables globales tambin se pueden definir dentro de una funcin.Existen variables con un significado especial. Estas son: $#, $@ y $*$# nos devuelve el nmero de parmetros que recibe una funcin en formato cadena.$* y $@ nos devuelven todos los argumentos recibidos por un script o funcin.

  • Programacin bsica del ShellEjemplo: recibe.sh#Ejemplo de script que recibe parmetros y los muestraecho El script $0 recibe $# argumentos que son: $*echo El script $0 recibe $# argumentos que son: $@

    Al ejecutarlo obtendramos:$ recibe hola adiosEl script ./recibe.sh recibe 2 argumentos que son: hola adiosEl script ./recibe.sh recibe 2 argumentos que son: hola adios

    Al entrecomillar (comillas simples), los parmetros $@ y $* es cuando aparecen sus diferencias. La primera, es que $* nos permite separar los argumentos con el carcter especificado en la variable IFS (Internal Field Separator), mientras que $@ siempre usa un espacio en blanco.

  • Programacin bsica del ShellEjemplo: recibe.sh#Ejemplo de script que recibe parmetros y los muestraIFS=,echo El script $0 recibe $# argumentos que son: $*echo El script $0 recibe $# argumentos que son: $@

    Al ejecutarlo obtendramos:$ recibe hola adiosEl script ./recibe.sh recibe 2 argumentos que son: hola,adiosEl script ./recibe.sh recibe 2 argumentos que son: hola adios

  • Programacin bsica del ShellHay otra diferencia entre $* y $@, y se produce cuando usamos parmetros entrecomillados. (ver pgina 54)Las reglas generales que debemos seguir al usar estas variables son las siguientes:

    Siempre conviene entrecomillar las variables $* y $@ para evitar que los argumentos que contengan espacios sean malinterpretados.Si queremos cambiar el delimitador que separa los argumentos deberemos usar $* y la variable IFS.Si lo que queremos es pasar los argumentos a una funcin debemos usar $2 entrecomillado.

  • Programacin bsica del ShellExpansin de variables:$VAR es una simplificacin de la sintaxis general ${VAR}, que es la manera en la que debemos expandir una variable.Ejemplo:$ nombre=Fernando$ apellido=Lopez$ echo $nombre_$apellidoLopezEl sistema buscara la variable nombre_, que no existe. En cambio, si ejecutamos:$ echo ${nombre}_$apellidoFernando_Lopez

  • Programacin bsica del ShellOperadores cadena:Los operadores cadena permiten manipular cadenas sin necesidad de escribir complicadas rutinas de procesamiento. Los operadores cadena ms importantes pueden verse en la tabla 4.1, pgina 57.Ejemplos:Imaginemos que tenemos un fichero con los nombres y los sueldos de un conjunto de clientes:$ cat clientes45340 Jose Carlos Martinez24520 Mari Carmen Gutierrez450 Luis Garcia Santos.Escribir un script que imprima los N clientes que ms saldo tienen. El script recibir como primer argumento el nombre del fichero, y como segundo opcionalmente el nmero de clientes a imprimir (por defecto 5).

  • Programacin bsica del ShellSolucin:

    # Script que saca los mejores clientes# Tiene la forma:#mejoresclientes []fichero=$1cuantos=$2defecto=5sort nr $fichero | head -${cuantos:-$defecto}

  • Programacin bsica del ShellOperadores de bsqueda de patrones:Se utilizan para eliminar partes de la ruta de un fichero, como pueda ser el directorio o el nombre del fichero.En la tabla 4.2 de la pgina 60.

    Ejemplos:$ruta=/usr/local/share/qemu/bios.core.binOperadorsResultado${ruta##/*/}bios.core.bin${ruta#/*/}local/share/qemu/bios.core.binruta/usr/local/share/qemu/bios.core.bin${ruta%.*}/usr/local/share/qemu/bios.core${ruta%%.*}/usr/local/share/qemu/bios

  • Programacin bsica del ShellSustitucin de comandos:Nos permite usar la salida de un comando como si fuera el valor de una variable. La sintaxis es:$(comando)Ejemplo:$midir=$(ls $HOME)$echo $midirDesktop Documents Library Movies Music Pictures Public Sites autor jdevhome tmp xcodeTambin podemos cargar el contenido de un fichero en una variable de entorno con la sintaxis $(
  • El Shell BashFicheros de configuracin y variables de entornoProgramacin bsica del ShellControl de flujoOpciones de la lnea de comandos, expresiones aritmticas y arrays.

  • Control de flujoSentencias if,elif y else:if condicionif condicion ; thenthen sentencias sentenciaselif condicion ; thenelif condicion sentenciasthenelse sentencias sentenciaselsefi sentenciasfi

    Este lenguaje nos obliga a que las sentencias estn organizadas con retornos de carro. Si queremos hacerlo en la misma lnea debemos utilizar el separador de comandos en Bash (;).

  • Control de flujoEn UNIX los comando terminan devolviendo un cdigo numrico al que se llama cdigo de terminacin, que indica si el comando tuvo xito o no.Un cdigo de terminacin 0 indica que el comando tuvo xito y un cdigo entre 1 y 255 significa que se produjo un error con un significado determinado.El significado de los cdigos depender del comando. Por ejemplo el comando diff devuelve 0 si no hay diferencas entre dos ficheros, 1 cuando hay diferencias y 2 cuando se produce algn error (por ejemplo que no se pueda leer alguno de ellos).La sentencia if comprueba el cdigo de terminacin de un comando en la condicion, si ste es 0 la condicin se evalua como cierta. if comando ; thenprocesamiento normalelseprocesamiento con erroresfi

  • Control de flujoOperadores lgicosSon && (and lgico), || (or lgico) y ! (not lgico).Estos operadores pueden combinarse en una sentencia if para realizar condiciones ms complejas.if cd /tmp && cp 001.tmp $HOME ; then.fi

    Si el primer comando no tiene xito no se ejecutara el siguiente.El comando test nos permite evaluar si un comando es correcto sin ejecutarlo. Un sinnimo de test son los corchetes [ ].[ cadena1 = cadena2 ]Los espacios son obligatorios.

  • Control de flujoOperadores de comparacin de cadenas. Tabla 5.1 en la pgina 74.Pueden usarse con el comando testOperadores para la nmerica de enteros. Tabla 5.2 en la pgina 76.

    Ejemplos:if [ $reintegro -le $saldo -a \ $reintegro -le $max_cajero ]then ..fiOperadores para la comprobacin de atributos de ficheros. Tabla 5.3 en la pgina 77.

  • Control de flujoEl bucle for:La sintaxis es la siguiente:

    for var [in lista]do.....sentencias que usan $var.....done

    La semntica es distinta a los bucles for de otros lenguajes. Este se parece ms a un for each in lista. Se repite tantas veces como elementos haya en la lista entre corchetes.Si se omite la lista, por defecto se recorre el contenido de la variable de entorno $@.

  • Control de flujoEjemplos:

    for planeta in Mercury Venus Terra Marte Jupiter Saturnodoecho $planeta # imprimimos cada planetadone

    La lista puede contener comodines. El siguiente ejemplo recorrera todos los ficheros del directorio actual:

    for fichero in *dols l $ficherodone

  • Control de flujoPara recorrer todos los parmetros que recibe un script, usaremos $@. Es importante entrecomillar la variable $@ ya que si no, no se interpretan bien los parmetros con espacios.#!/bin/bash# bucle que recorre todos los argumentos recibidosfor arg in $@do echo Elemento:$argdone

    La ejecucin sera:$ recibe el perro la casaElemento:El perroElemento:La casa

  • Control de flujoBucles while y until.Su sintaxis es la siguiente:

    while comandountil comandododo .... ......donedone

    El comando tambin puede ser una opcin encerrada entre []. La diferencia entre while y until, es que while se ejecuta mientras el resultado del comando sea exitoso, es decir 0. Mientras que until se ejecuta hasta que el cdigo de terminacin sea exitoso. Por tanto until se puede interpretar como un bucle que ejecuta un comando hasta que tenga xito.

  • Control de flujoEjemplo:

    #!/bin/bash# Script que muestra los directorios del PATHpath=$PATHwhile [ $path ] ; doecho ${path%%:*}if [ ${path#*:} = $path ] ; thenpath=elsepath=${path#*:}fidone

  • Control de flujoLa sentencia case:Mientras que en otros lenguajes de programacin esta sentencia permite comprobar el valor de una variable simple, como un entero o un carcter, en Bash permite realizar una comparacin de patrones con la cadena a examinar:case cadena inpatron1) sentencias ;;patron2) sentencias ;;.....esacLos patrones pueden ser varios separados por |. Si cadena cumple alguno de los patrones, se ejecutan sus correspondientes sentencias (que se separan por ;) hasta ;;.

  • Control de flujoEjemplo:

    #!/bin/bash# Script que convierte ficheros de imagen a formato .jpgfor fichero in $@dofichero_ppm=${fichero%.*}.ppmcase $fichero in*.jpg) exit 0;;*.tga) tgatoppm $fichero > $fichero_ppm;;*.xpm) xpmtoppm $fichero > $fichero_ppm;;esacfichero_salida=${fichero_ppm%.ppm}.jpgpnmtojpeg $fichero_ppm > $fichero_salida

  • Control de flujoSentencia select:La sentencia select nos permite generar fcilmente un men simple. Su sintaxis es la siguiente:

    select variable [in lista]dosentencias que usan $variabledone

    Al igual que el bucle for, si omitimos [in lista], se recorre [email protected] sentencia genera un men con los elementos de lista, donde asigna un nmero a cada elemento, y pide al usuario que introduzca un nmero. El valor elegido lo almacena en variable, y el nmero elegido en la variable REPLY. Una vez elegida una opcin por parte del usuario, se ejecuta el cuerpo de la sentencia y el proceso se repite en un bucle infinito.Aunque es un bucle infinito, podemos forzar su salida con la sentencia break. Por otro lado, el prompt que utiliza para el men, puede definirse en la variable PS3. Por defecto vale #?.

  • El Shell BashFicheros de configuracin y variables de entornoProgramacin bsica del ShellControl de flujoOpciones de la lnea de comandos, expresiones aritmticas y arrays.

  • Opciones de la lnea de comandosLa sentencia shift:Los comandos UNIX suelen tener el formato siguiente:comando [opciones] argumentos

    Es decir las opciones suelen preceder a los argumentos y suelen tener un guin delante.Las opciones al igual que los argumentos residen en las variables posicionales. Por ejemplo si ejecutamos hacer o esto.txt aquello.txt, en $1 tendramos o, en $2 tendramos esto.txt y en $3 tendramos aquello.txt. Por tanto para tratar las opciones no tendramos problemas, excepto por el motivo de que son opcionales.

  • Opciones de la lnea de comandos

    if [ $1 = -o ] ; thenEjecuta la operacin con $2 y $3elseEjecuta la operacin con $1 y $2fi

    En consecuencia el nmero de opciones crece y la programacin se vuelve bastante engorrosa.La sentencia shift nos permite solucionar esto de una forma elegante. La sintaxis de esta sentencia es:

    shift [n]

  • Opciones de la lnea de comandos

    [n] opcional, es el nmero de desplazamientos a la izquierda que queremos hacer con los argumentos, si se omite n=1. Podemos reescribir el ejemplo anterior utilizando shift.

    if [ $1 = -o ] ; thenProcesa oshiftfiEjecuta las operaciones con $1 y $2

  • Opciones de la lnea de comandosEl siguiente ejemplo hacer recibe tres posibles opciones a, -b y c. La forma de implementar el reconocimiento de estas opciones sera:

    while [ -n $(echo $1 | grep ^-) ]do case $1 in-a) Procesa opcin a;;-b) Procesa opcin b;;-c) Procesa opcin c;;* ) echo Use hacer [-a] [-b] [-c] args ... esacs shiftdone