Programación del Shell LinuxAquí tenemos un libro libre y completo sobre ShellLa sed del "conocimiento libre" es muy bienvenida. | 
				Comandos Shell Script | 
				![]()  | 
				|
Home |
Artículos     | Agradecimientos
|
Links Amigos
				 | 
				Comprar el libroChangelogs | 
			||
					
						
					 | 
		
Conversación de Bar - Parte IV
 - Y entonces amigo mio, intentaste hacer el ejercicio que te pedí para reforzar tus conocimientos? 
 - Claro, que si! En programación, si no se practica, no se aprende. Me pediste que hiciera un scriptisiño para informar si un determinado usuario, que será pasado como parámetro, esta logado (ajjjj!) o no. Hice lo siguiente: $ cat logado
#!/bin/bash
# Busca si una persona está logada o no
if who | grep $1
then
    echo $1 está logado
else
    echo $1 no se encuentra en la vecindad
fi
 
 - Calma amigo! Ya vi que hoy llegaste lleno de deseos de trabajar, primero vamos a pedir nuestros "choppes" de costumbre y después vamos al Shell. Chico!, tráeme dos "choppes", uno sin espuma! 
 - Ahora que ya mojamos nuestros labios, vamos a echar un vistazo a la ejecución de tu programa: $ logado jneves
jneves   pts/0        Oct 18 12:02 (10.2.4.144)
jneves está logado
 
Realmente funcionó. Pasé mi login como parámetro y él me informó que estaba logado, sin embargo, al mismo tiempo salió una línea que no pedí. Esta línea es la salida del comando  $ cat logado
#!/bin/bash
# Busca si una persona está logada o no (versión 2)
if who | grep $1 > /dev/null
then
    echo $1 está logado
else
    echo $1 no se encuentra en la vecindad
fi
 
Ahora vamos a los tests: $ logado jneves
jneves está logado
$ logado chico
chico no se encuentra en la vecindad
 
 
Ah, ahora si! Acuérdate de esto: la mayor parte de los comandos tienen una salida patrón y una salida de errores (el grep es una de las pocas excepciones, ya que no da mensajes de error cuando no encuentra una cadena) y es necesario estar muy atentos para redirecionarlas hacia el agujero negro cuando sea necesario.
Bueno, ahora vamos a cambiar de asunto: la última vez que nos encontramos aquí en el Bar, te estaba mostrando los comandos condicionales y cuando ya estábamos con la garganta seca hablando sobre el if, me preguntaste como se verifican condiciones. Veamos entonces El Comando test
Bien, todos estamos acostumbrados a usar el  
 Observa ahora las principales opciones para verificar cadenas de caracteres: 
 Y crees que se acabó ahí? Pues estás engañado! Ahora viene la parte a la que estás más acostumbrado, o sea las famosas comparaciones con números. Fijate en la tabla que sigue: 
 Además de todo eso, se suman a las opciones que te mostré las siguientes opciones: 
 
Ufa! Como viste hay mucha cosa y como te dije al comienzo, nuestro  Ejemplos:     if  test -d lmb
    then
        cd lmb
    else
        mkdir lmb
        cd lmb
    fi
En este ejemplo, verifiqué la existencia de un directorio definido      if  test ! -d lmb
    then
        mkdir lmb
    fi
    cd lmb
De esta forma el directorio  Vamos a ver dos ejemplos para entender como se diferencia la comparación entre números y entre cadenas.     cad1=1
    cad2=01
    if  test $cad1 = $cad2
    then
        echo Las variables son iguales.
    else
        echo Las variables son diferentes.
    fi
Ejecutando el fragmento del programa arriba, resulta: 
      Vamos a modificarlo un poco, de manera que la comparación esta vez sea numérica:     cad1=1
    cad2=01
    if  test $cad1 -eq $cad2
    then
        echo Las variables son iguales.
    else
        echo Las variables son diferentes.
    fi
Y lo ejecutamos nuevamente: 
      
Como viste, en las dos ejecuciones obtuve resultados diferentes porque la cadena  Ejemplos: 
Para mostrar el uso de los conectores  $ Familia=felina
$ Genero=gato
$ if  test $Familia = canina -a $Genero = lobo -o $Familia = felina -a $Genero = leon
> then
>     echo Cuidado
> else
>     echo Se puede acariciar
> fi
Se puede acariciar
 
En este ejemplo en caso de que el animal fuera de la familia canina  
  
Los signos de mayor (>) al inicio de las líneas internas al if son los prompts de continuación (que están definidos en la variable $PS2) y cuando el Shell identifica que un comando continuará en la línea siguiente, automáticamente los va colocado, hasta que el comando sea finalizado.
Vamos a cambiar el ejemplo para ver si continúa funcionando: $ Familia=felino
$ Genero=gato
$ if  test $Familia = felino -o $Familia = canino -a $Genero = onza -o $Genero = lobo
> then
>     echo Cuidado!
> else
>     echo Puede acariciar
> fi
Cuidado!
 
Obviamente la operación resultó en error, ya que la opción  
      Que fué evaluada como falsa, y dió el seguiente resultado: 
      Que una vez resuelta dió: 
      
Como ahora todos los conectores son  $ if  test \($Familia = felino -o $Familia = canino\) -a \($Genero = onza -o $Genero = lobo\)
> then
>     echo Cuidado!
> else
>     echo Puede acariciar
> fi
Puede acariciar
 
De esta forma, con el uso de los paréntesis agrupamos las expresiones con el conector  
      
Para que sea  
Si quisieramos escojer un CD que tenga músicas de 2 artistas diferentes, nos sentimos tentados a usar un  $ grep Artista1 musicas | grep Artista2
 
De la misma forma, para escojer CDs que tengan la participación del  $ egrep (Artista1|Artista2) musicas
 
O (en ese caso específico) el propio  $ grep Artista[12] musicas
 
En el  
 - Está bien, acepto el argumento, el  
 - Si, tienes toda la razón, tampoco me es simpática y me parece que a nadie le gusta. Creo que fue por eso, que el Shell incorporó otra sintáxis que substituye el comando  Ejemplos: Para esto vamos a ver nuevamente aquél ejemplo para cambiar de directorios, que era así:     if  test ! -d lmb
    then
        mkdir lmb
    fi
    cd lmb
y utilizando la nueva sintáxis, vamos a hacerla así:     if  [ ! -d lmb ]
    then
        mkdir lmb
    fi
    cd lmb
O sea, el comando  Querida, Encojieron el Comando Condicional!Si creees que se acabó, estás muy equivocado. Repara en la tabla (booleana) siguiente: 
 
O sea, cuando el conector es  
Bueno, las personas que crearon el interpretador no son bobas y están siempre intentando optimizar al máximo los algoritmos. Por tanto, en el caso del conector  
Aprovechando eso, crearon una forma abreviada de hacer tests. Bautizaron el conector      if  [ ! -d lmb ]
    then
        mkdir lmb
    fi
    cd lmb
Eso también podría ser escrito de la siguiente manera:     [ ! -d lmb ] && mkdir lmb
    cd lmb
O inclusive sacando la negación ( 
     [ -d lmb ] || mkdir lmb
    cd lmb
En el primer caso, si el primer comando (el  
En el ejemplo siguiente, verificaremos si el directorio  
      
En este caso, si el      cd lmb ||
        {
        mkdir lmb
        cd lmb
        }
Todavia no está bien, porque en el caso de que el directorio no exista, el      cd lmb 2> /dev/null ||
        {
        mkdir lmb
        cd lmb
        }
Como viste, el comando  Y toma test!
Piensas que ya se acabó? Gran error! Todavia tenemos una forma de  
 
Donde  
 $ echo $H
13
$ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora no válida
Hora no válida
$H=12
$ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora no válida
$
 
En este ejemplo,verificamos si el contenido de la variable  Ejemplos: Para saber si una variable tiene el tamaño de un y solamente un caracter, haz: 
 $ var=a
$ [[ $var == ? ]] && echo var tiene un caracter
var tiene un caracter
$ var=aa
$ [[ $var == ? ]] && echo var tiene un caracter
$
 
Como puedes imaginar, este uso de patrones para comparación, aumenta mucho el poderío del comando  Acaso Casa con case
Veamos un ejemplo didáctico: dependiendo del valor de la variable      if  [ $opc -eq 1 ]
    then
        inclusión
    elif [ $opc -eq 2 ]
    then
        exclusión
    elif [ $opc -eq 3 ]
    then
        alteración
    elif [ $opc -eq 4 ]
    then
        exit
    else
        echo Digite una opción entre 1 y 4
    fi
En este ejemplo viste el uso del      case $var in
        patrón1) cmd1
                 cmd2
                 cmdn ;;
        patrón2) cmd1
                 cmd2
                 cmdn ;;
        patrónn) cmd1
                 cmd2
                 cmdn ;;
    esac
Donde la variable  En la formación de los patrones, son aceptados los siguientes caracteres: 
 
Para mostrar como realmente queda mejor, vamos a repetir el ejemplo anterior, sólo que esta vez usaremos el      case $opc in
        1) inclusión ;;
        2) exclusión ;;
        3) alteración ;;
        4) exit ;;
        *) echo Digite una opción entre 1 y 4
    esac
Como debes haberte dado cuenta, usé el asterisco como la última opción, o sea, si el asterisco quiere decir cualquier cosa, entonces servirá para cualquier cosa que no este en el intervalo del 1 al 4. Otra cosa a tener en cuenta es que el doble punto y coma no es necesario antes del  Ejemplos: Vamos ahora a hacer un script más radical. Te dará los buenos días, buenas tardes o buenas noches, dependiendo de la hora en que sea ejecutado, pero primero mira estos comandos: $ date
Tue Nov  9 19:37:30 BRST 2004
$ date +%H
19
 
El comando  $ cat bienvenido.sh
#!/bin/bash
#  Programa bien educado que
#  da los Buenos dias, buenas tardes o
#  las buenas noches dependiendo de la hora
Hora=$(date +%H)
case $Hora in
    0? | 1[01]) echo Buenos días
                ;;
    1[2-7]    ) echo Buenas tardes
                ;;
    *         ) echo Buenas noches  
              ;;
esac
exit
 
Fue pesado, verdad?. - Que vá!. Vamos a desmenuzar la resolución caso a caso (o sería case-a-case?  
 
 
 
 - Mira, hasta ahora hablé mucho y bebí poco. Ahora te voy a pasar un ejercicio para que lo hagas en tu casa y me des la respuesta la próxima vez que nos encontremos aqui en el bar, de acuerdo? 
 - De acuerdo, pero antes informe a las personas que nos están acompañando en este curso, como pueden hacerlo para encontrarle, para hacerle críticas, hacer chistes, invitarle a una cerveza, un curso, unas charlas o hasta si quieren, para hablar mal de los políticos. 
 - es fácil, mi e-mail es julio.neves@gmail.com, pero para de distraerme, que no me voy a olvidar de pasarte el script de los deberes, y este es: quiero que hagas un programa que recibirá como parámetro el nombre de un archivo y que cuando sea ejecutado grabe este archivo con el nombre original seguido de una tilde ( 
 - Hum, hum... 
 - Chico! Traeme otra más sin espuma, que aquí el amigo ya está pensando!  Gracias y hasta la próxima -- HumbertoPina - 05 Oct 2006  | 
	|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
Licencia Creative Commons - Reconocimiento y no comercial (CC) 2009 Por  Visitantes del Bar de Júlio Neves. Todo el contenido de esta página puede ser usada de acuerdo a la Creative Commons License: Atribuição-UsoNãoComercial-PermanênciaDaLicença.  | 
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||