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 ![]() ![]() |
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
![]() 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
![]() > ) 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. |