Difference: TWikiBarConversa004 (1 vs. 12)

Revision 1204 Feb 2008 - CollonsTorre

Line: 1 to 1
 

Conversación de bar IV


Line: 55 to 55
 

Pinguim com placa de atenção (em espanhol)
Changed:
<
<
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 crea una cadena) y es necesario estar muy atentos para redirecionarlas hacia el agujero negro cuando sea necesario.
>
>
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

Revision 1103 Feb 2008 - JulioNeves

Line: 1 to 1
Changed:
<
<

Conversa de bar IV

>
>

Conversación de bar IV

 

Revision 1031 Jan 2008 - CollonsTorre

Line: 1 to 1
 

Conversa de bar IV


Changed:
<
<
     - Y entonces mi amigo, intentaste hacer el ejercicio que te pedí para reforzar los conocimientos?
>
>
     - Y entonces amigo mio, intentaste hacer el ejercicio que te pedí para reforzar tus conocimientos?
 
Changed:
<
<
     - Claro, que si! En programación, si no se practica, no se aprende. Me pediste para hacer un scriptisiño para informar si un determinado usuario, que será pasado como parâmetro, esta logado (ajjjj!) o no. Hice lo seguinte:
>
>
     - 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
Line: 21 to 21
 
Changed:
<
<
     - Calma amigo! Ya vi que hoy llegó 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!
>
>
     - 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!
 
Changed:
<
<
     - Ahora que ya mojamos nuestros labios, vamos a dar una miradita en la ejecución de su programa:
>
>
     - Ahora que ya mojamos nuestros labios, vamos a echar un vistazo a la ejecución de tu programa:
 
$ logado jneves
Line: 31 to 31
 jneves está logado
Changed:
<
<
Realmente funcionó. Pasé mi login como parámetro y él me informó que estaba logado, sin embargo, al mismo tiempo mandó una línea que no pedí. Esta línea es la salida del comando who, y para evitar que eso pase, lo único que hay que hacer es mandarla para el agujero negro que a esta altura ya sabes que es el /dev/null. Veamos entonces como quedaría:
>
>
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 who, y para evitar que eso pase, lo único que hay que hacer es mandarla hacia el agujero negro que a estas altura ya sabes que es el /dev/null. Veamos entonces como quedaría:
 
$ cat logado
Line: 55 to 55
 

Pinguim com placa de atenção (em espanhol)
Changed:
<
<
Ah, ahora si! Acuérdate de esto: la mayor parte de los comandos tienen una salida padrón y una salida de errores (el grep es una de las pocas excepciones, ya que no dá mensaje de error cuando no acha una cadena) y es necesario estar muy atentos para redirecionarlas para el agujero negro cuando sea necesario.
>
>
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 crea una cadena) y es necesario estar muy atentos para redirecionarlas hacia el agujero negro cuando sea necesario.
 
Changed:
<
<
Bueno, ahora vamos a mudar de asunto: en la última vez que nos encontramos aqui en el Bar, te estaba mostrando los comandos condicionales y quando ya estabamos de garganta seca hablando sobre el if, me perguntaste como si verifican condiciones. Veamos entonces
>
>
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

Changed:
<
<
Bien, todos estamos acostumbrados a usar el if para verificar condiciones, y estas condiciones siempre son: mayor, menor, mayor o igual, menor o igual, igual y diferente. En Shell para verificar condições, usamos el comando test, sólo que él es mucho más poderoso que a lo que estamos habituados. Primero te voy a mostrar las principales opciones (existen muchas otras), para verificar la existencia de archivos en el disco:
>
>
Bien, todos estamos acostumbrados a usar el if para verificar condiciones, y estas condiciones siempre son: mayor, menor, mayor o igual, menor o igual, igual y diferente. En Shell para verificar condiciones, usamos el comando test, sólo que este es mucho más poderoso de lo que estamos habituados. Primero te voy a mostrar las principales opciones (existen muchas otras), para verificar la existencia de archivos en el disco:
 
Line: 79 to 79
 
  -x arch     arch existe y con derechos de ejecución  
Changed:
<
<
Ve ahora las principales opciones para verificar cadenas de caracteres:
>
>
Observa ahora las principales opciones para verificar cadenas de caracteres:
 
Line: 91 to 91
 
  c1 = c2    Cadena c1 y c2 son idénticas 
Changed:
<
<
Y crees que acabó por ahí? Estás engañado! Ahora viene la parte a la que estás más acostumbrado, o sea las famosas comparaciones con numéros. Ve la tabla que sigue:
>
>
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:
 
Line: 117 to 117
 
  -o     O lógico  
Changed:
<
<
Ufa! Como viste hay mucha cosa y como te dije al comienzo, nuestro if es mucho más poderoso que los de otros. Vamos a ver en unos ejemplos como todo esto funciona, primero verificaremos la existencia de un directorio:
>
>
Ufa! Como viste hay mucha cosa y como te dije al comienzo, nuestro if es mucho más poderoso que los de otros. Vamos a ver en unos ejemplos como funciona todo esto, primero verificaremos la existencia de un directorio:
  Ejemplos:
Line: 131 to 131
  fi
Changed:
<
<
En este ejemplo, verifiqué la existencia de un directorio definido lmb, en caso negativo (else), éste seria creado. Ya sé, vas a criticar mi razonamiento diciendo que el script no está optimizado. Lo sé perfectamente, pero queria que entendieras este ejemplo, para entonces después poder usar el signo de admiración (!) como un negador del test. Mira esto:
>
>
En este ejemplo, verifiqué la existencia de un directorio definido lmb, en caso negativo (else), éste seria creado. Ya sé, vas a criticar mi razonamiento diciendo que el script no está optimizado. Lo sé perfectamente, pero quería que entendieras este ejemplo, para poder usar después el signo de admiración (!) como un negador del test. Mira esto:
 
    if  test ! -d lmb
Line: 141 to 141
  cd lmb
Changed:
<
<
De esta forma el directorio lmb sería creado solamente si él no existiese, y esta negativa se debe al signo de admiración (!) que precede a la opción -d. Al finalizar la ejecución de este fragmento de script, el programa estaría seguramente dentro del directorio lmb.
>
>
De esta forma el directorio lmb sería creado solamente si este no existiese, y esta negación se debe al signo de admiración (!) que precede a la opción -d. Al finalizar la ejecución de este fragmento de script, el programa estaría seguramente dentro del directorio lmb.
 
Changed:
<
<
Vamos a ver dos ejemplos para entender como es diferente la comparación entre números y entre cadenas.
>
>
Vamos a ver dos ejemplos para entender como se diferencia la comparación entre números y entre cadenas.
 
    cad1=1
Line: 181 to 181
  Ejemplos:
Changed:
<
<
Para mostrar el uso de los conectores -o (O) y -a (Y), vea un ejemplo bien grosero, hecho directamente en el prompt (pido disculpas a los zoólogos, ya que no entiendendo nada de reino, clase, orden, familia, género y especie, por lo que lo que estoy llamando de familia o de género tiene grandes posibilidade de estar incorrecto):
>
>
Para mostrar el uso de los conectores -o (O) y -a (Y), tengo un ejemplo bien grosero, hecho directamente en el prompt (pido disculpas a los zoólogos, ya que no entendiendo nada de reino, clase, orden, familia, género y especie, puede que lo que estoy llamando familia o género tenga grandes posibilidades de ser incorrecto):
 
Changed:
<
<
$ Familia=felinae
>
>
$ Familia=felina
 $ Genero=gato
Changed:
<
<
$ if test $Familia = canidea -a $Genero = lobo -o $Familia = felina -a $Genero = leonino
>
>
$ if test $Familia = canina -a $Genero = lobo -o $Familia = felina -a $Genero = leon
 > then > echo Cuidado > else
Changed:
<
<
> echo Puede acariciar
>
>
> echo Se puede acariciar
 > fi
Changed:
<
<
Puede acariciar
>
>
Se puede acariciar
 
Changed:
<
<
En este ejemplo en caso de que el animal fuera de la familia canídea Y (-a) del género lobo, O (-o) de la familia felina Y (-a) del género leonino, sería dado un aviso de alerta, en caso contrario el mensaje sería de incentivo.
>
>
En este ejemplo en caso de que el animal fuera de la familia canina Y (-a) del género lobo, O (-o) de la familia felina Y (-a) del género leon, se daria un aviso de alerta, en caso contrario el mensaje sería de incentivo.
 
Pinguim com placa de dica
Changed:
<
<
Los signos de mayor (>) al início 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.
>
>
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:

Line: 206 to 206
 
$ Familia=felino $ Genero=gato
Changed:
<
<
$ if test $Familia = felino -o $Familia = canideo -a $Genero = onza -o $Genero = lobo
>
>
$ if test $Familia = felino -o $Familia = canino -a $Genero = onza -o $Genero = lobo
 > then > echo Cuidado! > else
Line: 215 to 215
 Cuidado!
Changed:
<
<
Obviamente la operación resultó en error, ya que la opción -a tiene prioridad sobre la -o, y así lo que si evaluó primero, fué la expresión:
>
>
Obviamente la operación resultó en error, ya que la opción -a tiene prioridad sobre la -o, y así lo que se evaluó primero, fué la expresión:
 
Changed:
<
<
     $Familia = canideo -a $Genero = onza
>
>
     $Familia = canino -a $Genero = onza
  Que fué evaluada como falsa, y dió el seguiente resultado:
Line: 230 to 230
 Como ahora todos los conectores son -o, y para que una serie de expresiones conectadas entre sí por diversos O lógicos sea verdadera, basta que una de ellas lo sea, la expresión final resultó como VERDADERO y el then fue ejecutado de forma incorrecta. Para que vuelva a funcionar hagamos lo seguiente:

Changed:
<
<
$ if test \($Familia = felino -o $Familia = canideo\) -a \($Genero = onza -o $Genero = lobo\)
>
>
$ if test \($Familia = felino -o $Familia = canino\) -a \($Genero = onza -o $Genero = lobo\)
 > then > echo Cuidado! > else
Line: 251 to 251
 $ grep Artista1 musicas | grep Artista2
Changed:
<
<
De la misma forma, para escojer CDs que tengam la participación del Artista1 y del Artista2, no es necesario montar un if con el conector -o. El egrep (o grep -E, siendo éste más recomendade), tambiém nos resuelve eso. Ve como:
>
>
De la misma forma, para escojer CDs que tengan la participación del Artista1 y del Artista2, no es necesario montar un if con el conector -o. El egrep (o grep -E, siendo éste más recomendable), también nos resuelve eso. Fijate como:
 
$ egrep (Artista1|Artista2) musicas
Line: 267 to 267
       - Está bien, acepto el argumento, el if del Shell es mucho más poderoso que los otros conocidos, pero entre nosotros, esa construción del if test ... es muy extraña, y poco legible.
Changed:
<
<
     - Si, tienes toda la razón, también no 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 test.
>
>
     - 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 test.
  Ejemplos:
Line: 291 to 291
  cd lmb
Changed:
<
<
O sea, el comando test puede ser substituído por un par de paréntesis rectos ([ ]), separados por espacios en blanco de los argumentos, lo que aumentará enormemente la legibilidad, pues el comando if irá a quedar con la sintáxis parecida a de otras lenguajes y por esta causa, será éste el modo en que usaré el comando test de ahora en adelante.
>
>
O sea, el comando test puede ser substituído por un par de paréntesis rectos ([ ]), separados por espacios en blanco de los argumentos, lo que aumentará enormemente la legibilidad, pues el comando if quedara con una sintáxis parecida a de otras lenguajes y por este motivo, usaré el comando test de esta forma de ahora en adelante.
 

Querida, Encojieron el Comando Condicional!

Changed:
<
<
Si tu piensas que acabó, estás muy engañado. Repara la tabla (booleana) a seguir:
>
>
Si creees que se acabó, estás muy equivocado. Repara en la tabla (booleana) siguiente:
 
Line: 311 to 311
  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 Y, la segunda condición no será evaluada, en el caso de que la primera sea falsa, ya que el resultado será siempre FALSO. Ya con el O, la segunda será ejecutada solamente en el caso de que la primera sea falsa.
Changed:
<
<
Aprovechando eso, crearon una forma abreviada de hacer tests. Bautizaron el conector Y de && y el O de || y para ver como eso funciona, vamos a usarlos como test en nuestro viejo ejemplo de cambiar de directorio, que en su última versión estaba así:
>
>
Aprovechando eso, crearon una forma abreviada de hacer tests. Bautizaron el conector Y de && y el O de || y para ver como funciona esto, vamos a usarlos como test en nuestro viejo ejemplo de cambiar de directorio, que en su última versión estaba así:
 
    if  [ ! -d lmb ]
Line: 335 to 335
  cd lmb
Changed:
<
<
En el primer caso, si el primer comando (el test que está representado por los paréntesis rectos) tuviera buen resultado, o sea, no existe el directorio lmb, el mkdir será efectuado, porque la primera condición era verdadera y el conector era Y.
>
>
En el primer caso, si el primer comando (el test que está representado por los paréntesis rectos) estuviera bien resultado, o sea, no existe el directorio lmb, el mkdir será ejecutado, porque la primera condición era verdadera y el conector era Y.
 
Changed:
<
<
En el ejemplo siguiente, verificamos si el directorio lmb existía (en el anterior verificamos si él no existía) y en caso de que eso fuera verdadero, el mkdir no sería ejecutado porque el conector era O.
>
>
En el ejemplo siguiente, verificaremos si el directorio lmb existe (en el anterior verificabamos si no existía) y en caso de que eso fuera verdadero, el mkdir no sería ejecutado porque el conector era O.
 Otra forma:

     cd lmb || mkdir lmb

Changed:
<
<
En este caso, si el cd diera error, sería creado el directorio lmb pero no sería ejecutado el cd para dentro de él. Para ejecutar más de un comando de esta forma, es necesario que hagamos un agrupamiento de comandos, eso se consigue con el uso de llaves ({ }). Vea como sería la forma correcta:
>
>
En este caso, si el cd diera error, sería creado el directorio lmb pero no sería ejecutado el cd hacia dentro de él. Para ejecutar más de un comando de esta forma, es necesario que hagamos un agrupamiento de comandos, eso se consigue con el uso de llaves ({ }). Mira como sería la forma correcta:
 
    cd lmb ||
Line: 362 to 362
  }
Changed:
<
<
Como viste, el comando if nos permitió hacer un cd seguro de diversas maneras. Es siempre bueno recordar que el seguro a que me referí, es en lo referente al hecho de que al final de la ejecución, tu siempre estarás dentro de lmb, desde que tengas permiso de entrar en lmb, permiso para crear un directorio en ../lmb, haya espacio em el disco, ...
>
>
Como viste, el comando if nos permitió hacer un cd seguro de diversas maneras. Es siempre bueno recordar que el seguro a que me referí, es en lo referente al hecho de que al final de la ejecución, tu siempre estarás dentro de lmb, siempre que tengas permisos para entrar en lmb, permisos para crear un directorio en ../lmb, haya espacio en el disco, ...
 

Y toma test!

Changed:
<
<
Piensas que ahora acabó? Gran engaño! Todavia tenemos una forma de test más. Esta es muy buena porque te permite usar padrones para comparación. Estos padrones atienden a las normas de Geración de Nombres de Archivos (File Name Generation, que son ligeramente parecidas con las Expresiones Regulares, pero no pueden ser confundidas con éstas).
>
>
Piensas que ya se acabó? Gran error! Todavia tenemos una forma de test más. Esta es muy buena porque te permite usar patrones para la comparación. Estos patrones atienden a las normas de Generación de Nombres de Archivos (File Name Generation, que son ligeramente parecidas con las Expresiones Regulares, pero no pueden ser confundidas con éstas).
 La diferencia de sintáxis de este para el test que acabamos de ver, es que este trabaja con dos parêntesis rectos de la siguiente forma:

[[ expresión ]]

Changed:
<
<
Donde expresión es una de las que constan en la tabla a seguir:
>
>
Donde expresión es una de las que constan en la tabla siguiente:
 
Line: 395 to 395
 $
Changed:
<
<
En este ejemplo,verificamos si el contenido de la variable $H estaba comprendido entre cero y nueve ([0-9]) o (||) si estaba entre diez e doze (1[0-2]), dando un mensaje de error en caso que no fuera.
>
>
En este ejemplo,verificamos si el contenido de la variable $H esta comprendido entre cero y nueve ([0-9]) o (||) si esta entre diez y doze (1[0-2]), dando un mensaje de error en caso que no sea asi.
  Ejemplos:
Changed:
<
<
Para saber si una variable tiene el tamaño de un y solamente un caracter, haga:
>
>
Para saber si una variable tiene el tamaño de un y solamente un caracter, haz:
 
$ var=a
Line: 410 to 410
 $
Changed:
<
<
Como puedes imaginar, este uso de padrones para comparación, aumenta mucho el poderío del comando test. En el inicio de esta conversación, antes del último choppe, afirmamos que el comando if del interpretador Shell es más poderoso que su similar en otras lenguajes. Ahora que conocimos todo su espectro de funciones, dime: tú concuerdas o no con esta afirmación?
>
>
Como puedes imaginar, este uso de patrones para comparación, aumenta mucho el poderío del comando test. En el inicio de esta conversación, antes del último "choppe", afirmabamos que el comando if del interpretador Shell es más poderoso que sus similares en otros lenguajes. Ahora que conocimos todo su espectro de funciones, dime: estas de acuerdo o no con esta afirmación?
 

Acaso Casa con case

Changed:
<
<
Veamos un ejemplo didáctico: dependiendo del valor de la variable $opc el script deberá ejecutar una de las opciones: inclusión, exclusión, alteración o fin. Vea como quedaría este fragmento de script:
>
>
Veamos un ejemplo didáctico: dependiendo del valor de la variable $opc el script deberá ejecutar una de las opciones: inclusión, exclusión, alteración o fin. Fijate como quedaría este fragmento de script:
 
    if  [ $opc -eq 1 ]
Line: 435 to 435
  fi
Changed:
<
<
En este ejemplo viste el uso del elif con un else if, esta es una sintáxis válida y aceptada, pero podríamos hacer mejor y sería usando el comando case, que tiene la sintáxis a seguir:
>
>
En este ejemplo viste el uso del elif con un else if, esta es una sintáxis válida y aceptada, pero podríamos hacerlo mejor y sería usando el comando case, que tiene la sintáxis siguiente:
 
    case $var in
Changed:
<
<
padrón1) cmd1
>
>
patrón1) cmd1
  cmd2 cmdn ;;
Changed:
<
<
padrón2) cmd1
>
>
patrón2) cmd1
  cmd2 cmdn ;;
Changed:
<
<
padrónn) cmd1
>
>
patrónn) cmd1
  cmd2 cmdn ;; esac
Changed:
<
<
Donde la variable $var es comparada a los padrones padrón1, ..., padrónn y en caso de que uno de ellos atienda, el bloque de comandos cmd1, ..., cmdn correspondiente será ejecutado hasta que encuentre un duplo punto y coma (;;), en donde el flujo del programa se desviará para la instrucción inmediatamente después, o sea el esac.
>
>
Donde la variable $var es comparada a los patrones patrón1, ..., patrónn y en el caso de que uno de ellos coincida, el bloque de comandos cmd1, ..., cmdn correspondiente será ejecutado hasta que encuentre un doble punto y coma (;;), en donde el flujo del programa se desviará hacia la instrucción inmediatamente siguiente, o sea el esac.
 
Changed:
<
<
En la formação de los padrones, son aceptados los siguientes caracteres:
>
>
En la formación de los patrones, son aceptados los siguientes caracteres:
 
Line: 477 to 477
  esac
Changed:
<
<
Como debes haber percibido, usé el asterisco como la última opción, o sea, si el asterisco atiende a cualquier cosa, entonces servirá para cualquier cosa que no este en el intervalo del 1 al 4. Otra cosa a ser notada es que el duplo punto y coma no es necesario antes del 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 esac.
  Ejemplos:
Changed:
<
<
Vamos ahora a hacer un script más radical. Él te dará los buenos días, buenas tardes o buenas noches, dependiendo de la hora en que sea ejecutado, pero primero ve estos comandos:
>
>
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
Line: 495 to 495
 
$ cat bienvenido.sh #!/bin/bash
Changed:
<
<
# Programa biem educado que
>
>
# Programa bien educado que
 # da los Buenos dias, buenas tardes o # las buenas noches dependiendo de la hora Hora=$(date +%H)
Line: 510 to 510
 exit
Changed:
<
<
Fue pesado, cierto? Que vá! Vamos a desmenuzar la resolución caso a caso (o sería case-a-case? smile )
>
>
Fue pesado, verdad?. - Que vá!. Vamos a desmenuzar la resolución caso a caso (o sería case-a-case? smile )
  0? | 1[01] - Significa cero seguido de cualquier cosa (?), o (|) uno seguido de cero o uno ([01]) o sea, esta línea pegó 01, 02, ... 09, 10 y 11;

1[2-7]     - Significa uno seguido de la lista de dos a siete, o sea, esta línea pegó 12, 13, ... 17;

Changed:
<
<
*          - Significa todo aquello que no se encuadró con ninguno de los padrones anteriores.
>
>
*          - Significa todo aquello que no se encuadró en ninguno de los patrones anteriores.
 
Changed:
<
<
     - Mira, hasta ahora hablé mucho y bebí poco. Ahora te voy a pasar un ejercicio para que hagas en tu casa y me des la respuesta en la próxima vez que nos encontremos aqui en el bar, de acuerdo?
>
>
     - 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?
 
Changed:
<
<
     - De acuerdo, pero antes informe a las personas que están acompañando este curso con nosotros como pueden hacer para encontrarte para hacer críticas, hacer chistes, invitarte para um chopp, curso, charlas o hasta si quieren, para hablar mal de los políticos.
>
>
     - 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.
 
Changed:
<
<
     - 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 para de deberes que es: quiero que hagas un programa que recibirá como parámetro el nombre de un archivo y que cuando sea ejecutado grabará este archivo con el nombre original seguido de un til (~) y además colocará este archivo dentro del vi (de paso, el mejor editor del cual se tiene noticia) para ser editado. Esto sirve para tener siempre la última copia buena del archivo en el caso de que la persona haga alteraciones indebidas. Obviamente, tendrás que hacer las críticas necesarias, como verificar si fué pasado un parámetro, si el archivo que fué pasado existe, ... Em fin, lo que se te venga a la cabeza y tu creas que deba estar en el script. Entendiste?
>
>
     - 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 (~), además colocaras este archivo dentro del vi (de paso, el mejor editor del cual se tiene noticia) para ser editado. Esto sirve para tener siempre la última copia buena del archivo en el caso de que la persona haga alteraciones indebidas. Obviamente, tendrás que hacer las investigaciones necesarias, como verificar si fué pasado un parámetro, si el archivo que fué pasado existe, ... En fin, lo que se te venga a la cabeza y tu creas que deba estar en el script. Entendiste?
       - Hum, hum...
Changed:
<
<
     - Chico! Traeme otro más sin espuma, que el amigo aqui ya está entendiendo! smile
>
>
     - Chico! Traeme otra más sin espuma, que aquí el amigo ya está pensando! smile
  Gracias y hasta la próxima

Revision 913 Feb 2007 - JulioNeves

Line: 1 to 1
 

Conversa de bar IV


Line: 522 to 522
       - De acuerdo, pero antes informe a las personas que están acompañando este curso con nosotros como pueden hacer para encontrarte para hacer críticas, hacer chistes, invitarte para um chopp, curso, charlas o hasta si quieren, para hablar mal de los políticos.
Changed:
<
<
     - 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 para de deberes que es: quiero que hagas un programa que recibirá como parámetro el nombre de un archivo y que cuando sea ejecutado grabará este archivo con el nombre original seguido de un til (~) y además colocará este archivo dentro del vi (de paso, el mejor editor del cual se tiene noticia) para ser editado. Esto sirve para tener siempre la última copia buena del archivo en el caso de que la persona haga alteraciones indebidas. Obviamente, tendrás que hacer las críticas necesarias, como verificar si fué pasado un parámetro, si el archivo que fué pasado existe, ... Em fin, lo que se te venga a la cabeza y tu creas que deba estar en el script. Entendiste?
>
>
     - 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 para de deberes que es: quiero que hagas un programa que recibirá como parámetro el nombre de un archivo y que cuando sea ejecutado grabará este archivo con el nombre original seguido de un til (~) y además colocará este archivo dentro del vi (de paso, el mejor editor del cual se tiene noticia) para ser editado. Esto sirve para tener siempre la última copia buena del archivo en el caso de que la persona haga alteraciones indebidas. Obviamente, tendrás que hacer las críticas necesarias, como verificar si fué pasado un parámetro, si el archivo que fué pasado existe, ... Em fin, lo que se te venga a la cabeza y tu creas que deba estar en el script. Entendiste?
       - Hum, hum...

     - Chico! Traeme otro más sin espuma, que el amigo aqui ya está entendiendo! smile

Added:
>
>
Gracias y hasta la próxima
 -- HumbertoPina - 05 Oct 2006

Revision 803 Feb 2007 - JulioNeves

Line: 1 to 1
 

Conversa de bar IV


Line: 54 to 54
 chico no se encuentra en la vecindad
Changed:
<
<
Pinguim com placa de atenção
>
>
Pinguim com placa de atenção (em espanhol)
 Ah, ahora si! Acuérdate de esto: la mayor parte de los comandos tienen una salida padrón y una salida de errores (el grep es una de las pocas excepciones, ya que no dá mensaje de error cuando no acha una cadena) y es necesario estar muy atentos para redirecionarlas para el agujero negro cuando sea necesario.
Changed:
<
<
>
>
  Bueno, ahora vamos a mudar de asunto: en la última vez que nos encontramos aqui en el Bar, te estaba mostrando los comandos condicionales y quando ya estabamos de garganta seca hablando sobre el if, me perguntaste como si verifican condiciones. Veamos entonces

Revision 724 Oct 2006 - JulioNeves

Line: 1 to 1
 

Conversa de bar IV


Line: 325 to 325
 
    [ ! -d lmb ] && mkdir lmb
Changed:
<
<
cd dir
>
>
cd lmb
 

O inclusive sacando la negación (!):

    [ -d lmb ] || mkdir lmb
Changed:
<
<
cd dir
>
>
cd lmb
 

En el primer caso, si el primer comando (el test que está representado por los paréntesis rectos) tuviera buen resultado, o sea, no existe el directorio lmb, el mkdir será efectuado, porque la primera condición era verdadera y el conector era Y.

Revision 620 Oct 2006 - Main.HumbertoPina

Line: 1 to 1
Changed:
<
<

En construcción....!!! Conversa de bar IV

>
>

Conversa de bar IV

 

     - Y entonces mi amigo, intentaste hacer el ejercicio que te pedí para reforzar los conocimientos?

Changed:
<
<
     - Claro, que si! En programación, si no si practica, no si aprende. Me pediste para hacer un scriptisiño para informar si un determinado usuario, que será pasado como parâmetro, esta logado (ajjjj!) o no. Hice lo seguinte:
>
>
     - Claro, que si! En programación, si no se practica, no se aprende. Me pediste para hacer un scriptisiño para informar si un determinado usuario, que será pasado como parâmetro, esta logado (ajjjj!) o no. Hice lo seguinte:
 
$ cat logado
Line: 105 to 105
 
  n1 -le n2     n1 es menor o igual a n2     less or equal  
Changed:
<
<
Además de todo eso, si suman a las opciones que te mostré, las siguientes facilidades:
>
>
Además de todo eso, se suman a las opciones que te mostré las siguientes opciones:
 
Line: 117 to 117
 
  -o     O lógico  
Changed:
<
<
Ufa! Como viste hay mucha cosa y como te dije al comienzo, nuestro if es mucho más poderoso que los de otros. Vamos a ver en unos ejemplos como todo esto funciona, primeiro verificaremos la existencia de un directorio:
>
>
Ufa! Como viste hay mucha cosa y como te dije al comienzo, nuestro if es mucho más poderoso que los de otros. Vamos a ver en unos ejemplos como todo esto funciona, primero verificaremos la existencia de un directorio:
  Ejemplos:
Line: 131 to 131
  fi
Changed:
<
<
En este ejemplo, verifiqué la existencia de un directorio lmb definido, en caso negativo (else), éste seria creado. Ya sé, vas a criticar mi razonamiento diciendo que el script no está optimizado. Lo sé perfectamente, pero queria que entendieras este ejemplo, para entonces después poder usar el signo de admiración (!) como un negador del test. Mira esto:
>
>
En este ejemplo, verifiqué la existencia de un directorio definido lmb, en caso negativo (else), éste seria creado. Ya sé, vas a criticar mi razonamiento diciendo que el script no está optimizado. Lo sé perfectamente, pero queria que entendieras este ejemplo, para entonces después poder usar el signo de admiración (!) como un negador del test. Mira esto:
 
    if  test ! -d lmb
Line: 141 to 141
  cd lmb
Changed:
<
<
De esta forma el directorio lmb sería creado solamente si él no existiese, y esta negativa si debe al signo de admiración (!) que precedie a la opción -d. Al finalizar la ejecución de este fragmento de script, el programa estaría seguramente dentro del directorio lmb.
>
>
De esta forma el directorio lmb sería creado solamente si él no existiese, y esta negativa se debe al signo de admiración (!) que precede a la opción -d. Al finalizar la ejecución de este fragmento de script, el programa estaría seguramente dentro del directorio lmb.
  Vamos a ver dos ejemplos para entender como es diferente la comparación entre números y entre cadenas.
Line: 160 to 160
       Las variables son diferentes.
Changed:
<
<
Vamos a modificarlo un poco, de manera que la comparación sea numérica esta vez:
>
>
Vamos a modificarlo un poco, de manera que la comparación esta vez sea numérica:
 
    cad1=1
Line: 177 to 177
       Las variables son iguales.
Changed:
<
<
Como viste en las dos ejecuciones obtuve resultados diferentes porque la cadena 01 es realmente diferente de la cadena 1, sin embargo la cosa cambia cuando las variables son verificadas en forma numérica, ya que el número 1 es igual al número 01.
>
>
Como viste, en las dos ejecuciones obtuve resultados diferentes porque la cadena 01 es realmente diferente de la cadena 1, sin embargo, la cosa cambia cuando las variables son verificadas en forma numérica, ya que el número 1 es igual al número 01.
  Ejemplos:
Line: 198 to 198
 En este ejemplo en caso de que el animal fuera de la familia canídea Y (-a) del género lobo, O (-o) de la familia felina Y (-a) del género leonino, sería dado un aviso de alerta, en caso contrario el mensaje sería de incentivo.

Pinguim com placa de dica
Changed:
<
<
Los signos de mayor (>) al início 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 lo va colocado hasta que el comando sea finalizado.
>
>
Los signos de mayor (>) al início 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:

Line: 245 to 245
  Para que sea VERDADERO el resultado de dos expresiones ligadas por el conector -a es necesario que ambas sean verdaderas, lo que no es el caso del ejemplo arriba citado. Así el resultado final fue FALSO, siendo entonces el else correctamente ejecutado.
Changed:
<
<
Si quisieramos escojer un CD que tenga músicas de 2 artistas diferentes, nos sentimos tentados a usar un if com el conector -a, pero siempre es bueno recordar que el bash nos dá muchos recursos y eso podría ser hecho de forma mucho más simple con un único comando grep, de la siguiente manera:
>
>
Si quisieramos escojer un CD que tenga músicas de 2 artistas diferentes, nos sentimos tentados a usar un if con el conector -a, pero siempre es bueno recordar que el bash nos dá muchos recursos y eso podría ser hecho de forma mucho más simple con un único comando grep, de la siguiente manera:
 
$ grep Artista1 musicas | grep Artista2
Changed:
<
<
De la misma forma para escojer CDs que tegam la participación del Artista1 y del Artista2, no es necesario montar un if con el conector -o. El egrep (o grep -E, siendo éste más recomendade), tambiém nos resuelve eso. Vea como:
>
>
De la misma forma, para escojer CDs que tengam la participación del Artista1 y del Artista2, no es necesario montar un if con el conector -o. El egrep (o grep -E, siendo éste más recomendade), tambiém nos resuelve eso. Ve como:
 
$ egrep (Artista1|Artista2) musicas
Line: 263 to 263
 $ grep Artista[12] musicas
Changed:
<
<
En el egrep arriba, fue usada una expresión regular, donde la barra vertical (|) trabaja como un O lógico y los paréntesis son usados para limitar la amplitud de este O.Ya en el grep de la línea siguiente, la palabra Artista debe ser seguida por algún de los valores de la lista formada por los paréntesis rectos ([ ]), o sea, 1 o 2.
>
>
En el egrep arriba, fue usada una expresión regular, donde la barra vertical (|) trabaja como un O lógico y los paréntesis son usados para limitar la amplitud de éste O.Ya en el grep de la línea siguiente, la palabra Artista debe ser seguida por alguno de los valores de la lista formada por los paréntesis rectos ([ ]), o sea, 1 o 2.
       - Está bien, acepto el argumento, el if del Shell es mucho más poderoso que los otros conocidos, pero entre nosotros, esa construción del if test ... es muy extraña, y poco legible.
Line: 271 to 271
  Ejemplos:
Changed:
<
<
Para esto vamos a ver nuevamente aquel ejemplo para cambiar de directorios, que era así:
>
>
Para esto vamos a ver nuevamente aquél ejemplo para cambiar de directorios, que era así:
 
    if  test ! -d lmb
Line: 291 to 291
  cd lmb
Changed:
<
<
O sea, el comando test puede ser substituído por un par de paréntesis rectos ([ ]), separados por espacios en blanco de los argumentos, lo que aumentará enormemente la legibilidad, pues el comando if irá a quedar con la sintáxis parecida a de otras lenguajes y por esta causa, será éste el modo que usaré el comando test en adelante.
>
>
O sea, el comando test puede ser substituído por un par de paréntesis rectos ([ ]), separados por espacios en blanco de los argumentos, lo que aumentará enormemente la legibilidad, pues el comando if irá a quedar con la sintáxis parecida a de otras lenguajes y por esta causa, será éste el modo en que usaré el comando test de ahora en adelante.
 

Querida, Encojieron el Comando Condicional!

Line: 362 to 362
  }
Changed:
<
<
Como viste, el comando if nos permitió hacer un cd seguro de diversas maneras. Es siempre bueno recordars que el seguro a que me referi es en lo referente al hecho de que al final de la ejecución, tu siempre estarás dentro de lmb, desde que tengas permiso de entrar en lmb, permiso para crear un directorio en ../lmb, haya espacio em el disco, ...
>
>
Como viste, el comando if nos permitió hacer un cd seguro de diversas maneras. Es siempre bueno recordar que el seguro a que me referí, es en lo referente al hecho de que al final de la ejecución, tu siempre estarás dentro de lmb, desde que tengas permiso de entrar en lmb, permiso para crear un directorio en ../lmb, haya espacio em el disco, ...
 

Y toma test!

Changed:
<
<
Ufa! Piensas que ahora acabó? Gran engaño! Todavia tenemos una forma de test más. Esta es muy buena porque te permite usar padrones para comparación. Estes padrones atendien a las normas de Geración de Nombres de Archivos (File Name Generation, que son ligeramente parecidas con las Expresiones Regulares, pero no pueden ser confundidas con éstas).
>
>
Piensas que ahora acabó? Gran engaño! Todavia tenemos una forma de test más. Esta es muy buena porque te permite usar padrones para comparación. Estos padrones atienden a las normas de Geración de Nombres de Archivos (File Name Generation, que son ligeramente parecidas con las Expresiones Regulares, pero no pueden ser confundidas con éstas).
 La diferencia de sintáxis de este para el test que acabamos de ver, es que este trabaja con dos parêntesis rectos de la siguiente forma:

[[ expresión ]]

Line: 395 to 395
 $
Changed:
<
<
En este ejemplo,verificamos si el contenido de la variable $H estaba comprendido entre cero y nueve ([0-9]) o (||) si estaba entre diez e doze (1[0-2]), dando un mensaje de error en caso que no fuera
>
>
En este ejemplo,verificamos si el contenido de la variable $H estaba comprendido entre cero y nueve ([0-9]) o (||) si estaba entre diez e doze (1[0-2]), dando un mensaje de error en caso que no fuera.
  Ejemplos:
Line: 404 to 404
 
$ var=a $ [[ $var == ? ]] && echo var tiene un caracter
Changed:
<
<
var tem um caractere
>
>
var tiene un caracter
 $ var=aa $ [[ $var == ? ]] && echo var tiene un caracter $
Line: 451 to 451
  esac
Changed:
<
<
Donde la variable $var es comparada a los padrones padrón1, ..., padrónn y en caso de que uno de ellos atienda, el bloque de comandos cmd1, ..., cmdn correspondiente es ejecutado hasta que encuentre un duplo punto y coma (;;), cuando el flujo del programa se desviará para la instrucción inmediatamente después, o sea el esac.
>
>
Donde la variable $var es comparada a los padrones padrón1, ..., padrónn y en caso de que uno de ellos atienda, el bloque de comandos cmd1, ..., cmdn correspondiente será ejecutado hasta que encuentre un duplo punto y coma (;;), en donde el flujo del programa se desviará para la instrucción inmediatamente después, o sea el esac.
  En la formação de los padrones, son aceptados los siguientes caracteres:
Line: 493 to 493
 El comando date informa de la fecha completa del sistema, sin embargo tiene diversas opciones para su enmascaramiento. En este comando, la formatación comienza con un signo de más (+) y los caracteres de formatación vienen después de un signo de porcentaje (%), así el %H significa la hora del sistema. Dicho esto, vamos al ejemplo:

Changed:
<
<
$ cat boasvindas.sh
>
>
$ cat bienvenido.sh
 #!/bin/bash # Programa biem educado que # da los Buenos dias, buenas tardes o # las buenas noches dependiendo de la hora Hora=$(date +%H) case $Hora in
Changed:
<
<
0? | 1[01]) echo Buenos dias
>
>
0? | 1[01]) echo Buenos días
  ;; 1[2-7] ) echo Buenas tardes ;;
Line: 518 to 518
  *          - Significa todo aquello que no se encuadró con ninguno de los padrones anteriores.
Changed:
<
<
     - Mira, hasta ahora mucho y bebí poco. Ahora te voy a pasar un ejercicio para que hagas en tu casa y me des la respuesta en la próxima vez que nos encontremos aqui em el bar, de acuerdo?
>
>
     - Mira, hasta ahora hablé mucho y bebí poco. Ahora te voy a pasar un ejercicio para que hagas en tu casa y me des la respuesta en la próxima vez que nos encontremos aqui en el bar, de acuerdo?
       - De acuerdo, pero antes informe a las personas que están acompañando este curso con nosotros como pueden hacer para encontrarte para hacer críticas, hacer chistes, invitarte para um chopp, curso, charlas o hasta si quieren, para hablar mal de los políticos.
Changed:
<
<
     - 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 para de deberes que es: quiero que hagas un programa que recebirá como parámetro el nombre de un archivo y que cuando sea ejecutado grabará este archivo com el nombre original seguido de un til (~) y colocará este archivo dentro del vi (el mejor editor del cual se tiene noticia) para ser editado. Esto sirve para tener siempre la última copia buena del archivo en el caso de que la persona haga alteraciones indebidas. Obviamente, tendrás que hacer las críticas necesarias, como verificar si fué pasado un parámetro, si el archivo que fué pasado existe, ... Em fin, lo que se te venga a la cabeza y tu creas que deba estar en el script. Entendiste?
>
>
     - 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 para de deberes que es: quiero que hagas un programa que recibirá como parámetro el nombre de un archivo y que cuando sea ejecutado grabará este archivo con el nombre original seguido de un til (~) y además colocará este archivo dentro del vi (de paso, el mejor editor del cual se tiene noticia) para ser editado. Esto sirve para tener siempre la última copia buena del archivo en el caso de que la persona haga alteraciones indebidas. Obviamente, tendrás que hacer las críticas necesarias, como verificar si fué pasado un parámetro, si el archivo que fué pasado existe, ... Em fin, lo que se te venga a la cabeza y tu creas que deba estar en el script. Entendiste?
       - Hum, hum...

Revision 520 Oct 2006 - Main.HumbertoPina

Line: 1 to 1
 

En construcción....!!! Conversa de bar IV


Line: 16 to 16
 then echo $1 está logado else
Changed:
<
<
echo $1 no si encuentra en la vecindad
>
>
echo $1 no se encuentra en la vecindad
 fi
Line: 41 to 41
 then echo $1 está logado else
Changed:
<
<
echo $1 no si encuentra en la vecindad
>
>
echo $1 no se encuentra en la vecindad
 fi
Line: 51 to 51
 $ logado jneves jneves está logado $ logado chico
Changed:
<
<
chico no si encuentra en la vecindad
>
>
chico no se encuentra en la vecindad
 

Pinguim com placa de atenção

Revision 410 Oct 2006 - Main.HumbertoPina

Line: 1 to 1
 

En construcción....!!! Conversa de bar IV


Changed:
<
<
     - Y entonces mi amigo, intentó hacer el ejercicio que te pedí para reforzar los conocimientos?
>
>
     - Y entonces mi amigo, intentaste hacer el ejercicio que te pedí para reforzar los conocimientos?
 
Changed:
<
<
     - Claro, que si! En programación, si no se practica, no se aprende. Me pediste para hacer un scriptsiño para informar se un determinado usuario, que será pasado como parámetro esta logado (ajjjj!) o no. Hice lo seguinte:
>
>
     - Claro, que si! En programación, si no si practica, no si aprende. Me pediste para hacer un scriptisiño para informar si un determinado usuario, que será pasado como parâmetro, esta logado (ajjjj!) o no. Hice lo seguinte:
 
$ cat logado
Line: 16 to 16
 then echo $1 está logado else
Changed:
<
<
echo $1 no se encuentra en la vecindad
>
>
echo $1 no si encuentra en la vecindad
 fi
Changed:
<
<
     - Calma amigo! Ya vi que hoy llegó 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!
>
>
     - Calma amigo! Ya vi que hoy llegó 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!
 
Changed:
<
<
     - Ahora que ya mojamos nuestros labios, vamos a dar una miradita en la ejecución de su programita:
>
>
     - Ahora que ya mojamos nuestros labios, vamos a dar una miradita en la ejecución de su programa:
 
$ logado jneves
Line: 31 to 31
 jneves está logado
Changed:
<
<
Realmente funcionó. Pasé mi login como parámetro y él me informó que estaba logado, sin embargo, al mismo tiempo mandó una línea que no pedí. Esta línea es la salida del comando who, y para evitar que eso pase lo único que hay que hacer es mandarla para el agujero negro que a esta altura ya sabes que es el /dev/null. Veamos entonces como quedaría:
>
>
Realmente funcionó. Pasé mi login como parámetro y él me informó que estaba logado, sin embargo, al mismo tiempo mandó una línea que no pedí. Esta línea es la salida del comando who, y para evitar que eso pase, lo único que hay que hacer es mandarla para el agujero negro que a esta altura ya sabes que es el /dev/null. Veamos entonces como quedaría:
 
$ cat logado
Line: 41 to 41
 then echo $1 está logado else
Changed:
<
<
echo $1 no se encuentra en la vecindad
>
>
echo $1 no si encuentra en la vecindad
 fi
Line: 51 to 51
 $ logado jneves jneves está logado $ logado chico
Changed:
<
<
chico no se encuentra en la vecindad
>
>
chico no si encuentra en la vecindad
 

Pinguim com placa de atenção Ah, ahora si! Acuérdate de esto: la mayor parte de los comandos tienen una salida padrón y una salida de errores (el grep es una de las pocas excepciones, ya que no dá mensaje de error cuando no acha una cadena) y es necesario estar muy atentos para redirecionarlas para el agujero negro cuando sea necesario.
Changed:
<
<
Bueno, ahora vamos a mudar de asunto: en la última vez que nos encontramos aqui en el Bar, te estaba mostrando los comandos condicionales y quando ya estabamos de garganta seca hablando sobre el if, me perguntaste como se verifican condiciones. Veamos entonces el
>
>
Bueno, ahora vamos a mudar de asunto: en la última vez que nos encontramos aqui en el Bar, te estaba mostrando los comandos condicionales y quando ya estabamos de garganta seca hablando sobre el if, me perguntaste como si verifican condiciones. Veamos entonces
 

El Comando test

Changed:
<
<
Bien, todos estamos acostumbrados a usar el if para verificar condiciones, y estas condiciones siempre son: mayor, menor, mayor o igual, menor o igual, igual y diferente. Em Shell para verificar condições, usamos el comando test, sólo que él es mucho más poderoso que a lo que estamos habituados. Primero te voy a mostrar las principales opciones (existen muchas otras) para verificar la existencia de archivos en el disco:
>
>
Bien, todos estamos acostumbrados a usar el if para verificar condiciones, y estas condiciones siempre son: mayor, menor, mayor o igual, menor o igual, igual y diferente. En Shell para verificar condições, usamos el comando test, sólo que él es mucho más poderoso que a lo que estamos habituados. Primero te voy a mostrar las principales opciones (existen muchas otras), para verificar la existencia de archivos en el disco:
 
Line: 91 to 91
 
  c1 = c2    Cadena c1 y c2 son idénticas 
Changed:
<
<
Y crees que acabó por ahí? Estás engañado! Ahora viene la parte a que estás más acostumbrado, o sea las famosas comparaciones con numéros. Ve la tabla que sigue:
>
>
Y crees que acabó por ahí? Estás engañado! Ahora viene la parte a la que estás más acostumbrado, o sea las famosas comparaciones con numéros. Ve la tabla que sigue:
 
Line: 105 to 105
 
  n1 -le n2     n1 es menor o igual a n2     less or equal  
Changed:
<
<
Además de todo eso, se suman a las opciones que te mostré, las siguientes facilidades:
>
>
Además de todo eso, si suman a las opciones que te mostré, las siguientes facilidades:
 
Line: 141 to 141
  cd lmb
Changed:
<
<
De esta forma el directorio lmb sería creado solamente se él no existiese, y esta negativa se debe al signo de admiração (!) precediendo a la opción -d. Al finalizar la ejecución de este fragmento de script, el programa estaría seguramente dentro del directorio lmb.
>
>
De esta forma el directorio lmb sería creado solamente si él no existiese, y esta negativa si debe al signo de admiración (!) que precedie a la opción -d. Al finalizar la ejecución de este fragmento de script, el programa estaría seguramente dentro del directorio lmb.
  Vamos a ver dos ejemplos para entender como es diferente la comparación entre números y entre cadenas.
Line: 160 to 160
       Las variables son diferentes.
Changed:
<
<
Vamos ahora a modificarlo un poco, de manera que la comparación sea numérica esta vez:
>
>
Vamos a modificarlo un poco, de manera que la comparación sea numérica esta vez:
 
    cad1=1
Line: 181 to 181
  Ejemplos:
Changed:
<
<
Para mostrar el uso de los conectores -o (O) y -a (Y), vea un ejemplo bien grosero hecho directamente en el prompt (pido disculpas a los zoólogos, ya que no entiendendo nada de reino, clase, orden, familia, género y especie, por lo que lo que estoy llamando de familia o de género tiene grandes posibilidade de estar incorrecto):
>
>
Para mostrar el uso de los conectores -o (O) y -a (Y), vea un ejemplo bien grosero, hecho directamente en el prompt (pido disculpas a los zoólogos, ya que no entiendendo nada de reino, clase, orden, familia, género y especie, por lo que lo que estoy llamando de familia o de género tiene grandes posibilidade de estar incorrecto):
 
$ Familia=felinae
Line: 215 to 215
 Cuidado!
Changed:
<
<
Obviamente la operación resultó en error, ya que la opción -a tiene prioridad sobre la -o, y así lo que fie evaluado primero, fué la expresión:
>
>
Obviamente la operación resultó en error, ya que la opción -a tiene prioridad sobre la -o, y así lo que si evaluó primero, fué la expresión:
       $Familia = canideo -a $Genero = onza
Line: 227 to 227
       VERDADERO -o FALSO -o FALSO
Changed:
<
<
Como ahora todos los conectores son -o, y para que una serie de expresiones conectadas entre sí por diversos O lógicos sea verdadera, basta que una de ellas lo sea, la expresión final resultó como VERDADERO e el then fue ejecutado de forma incorrecta. Para que vuelva a funcionar hagamos lo seguiente:
>
>
Como ahora todos los conectores son -o, y para que una serie de expresiones conectadas entre sí por diversos O lógicos sea verdadera, basta que una de ellas lo sea, la expresión final resultó como VERDADERO y el then fue ejecutado de forma incorrecta. Para que vuelva a funcionar hagamos lo seguiente:
 
$ if test \($Familia = felino -o $Familia = canideo\) -a \($Genero = onza -o $Genero = lobo\)
Line: 243 to 243
       VERDADERO -a FALSO
Changed:
<
<
Para que sea VERDADERO el resultado de dos expresiones ligadas por el conector -a es necesario que ambas sean verdaderas, lo que no es el caso del ejemplo arriba citado. Así el resultado final fue FALSO siendo entonces el else correctamente ejecutado.
>
>
Para que sea VERDADERO el resultado de dos expresiones ligadas por el conector -a es necesario que ambas sean verdaderas, lo que no es el caso del ejemplo arriba citado. Así el resultado final fue FALSO, siendo entonces el else correctamente ejecutado.
  Si quisieramos escojer un CD que tenga músicas de 2 artistas diferentes, nos sentimos tentados a usar un if com el conector -a, pero siempre es bueno recordar que el bash nos dá muchos recursos y eso podría ser hecho de forma mucho más simple con un único comando grep, de la siguiente manera:
Line: 251 to 251
 $ grep Artista1 musicas | grep Artista2
Changed:
<
<
De la misma forma para escojer CDs que tegam la participación del Artista1 y del Artista2, no es necesario montar un if con el conector -o. El egrep (o grep -E, siendo éste más recomendade) tambiém nos resuelve eso. Vea como:
>
>
De la misma forma para escojer CDs que tegam la participación del Artista1 y del Artista2, no es necesario montar un if con el conector -o. El egrep (o grep -E, siendo éste más recomendade), tambiém nos resuelve eso. Vea como:
 
$ egrep (Artista1|Artista2) musicas
Line: 263 to 263
 $ grep Artista[12] musicas
Changed:
<
<
El el egrep arriba, fue usada una expresión regular, donde la barra vertical (|) trabaja como un O lógico y los paréntesis son usados para limitar la amplitud de este O.Ya en el grep de la línea siguiente, la palabra Artista debe ser seguida por algún de los valores de la lista formada por los paréntesis rectos ([ ]), o sea, 1 o 2.
>
>
En el egrep arriba, fue usada una expresión regular, donde la barra vertical (|) trabaja como un O lógico y los paréntesis son usados para limitar la amplitud de este O.Ya en el grep de la línea siguiente, la palabra Artista debe ser seguida por algún de los valores de la lista formada por los paréntesis rectos ([ ]), o sea, 1 o 2.
       - Está bien, acepto el argumento, el if del Shell es mucho más poderoso que los otros conocidos, pero entre nosotros, esa construción del if test ... es muy extraña, y poco legible.
Changed:
<
<
     - Si, tienes toda la razón, también no me gusta y me parece que a nadie le gusta. Creo que fue por eso, que el Shell incorporó otra sintáxis que substituye el comando test.
>
>
     - Si, tienes toda la razón, también no 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 test.
  Ejemplos:
Changed:
<
<
Para esto vamos a ver nuevamente aquel ejemplo para hacer una cambio de directorios, que era así:
>
>
Para esto vamos a ver nuevamente aquel ejemplo para cambiar de directorios, que era así:
 
    if  test ! -d lmb
Line: 291 to 291
  cd lmb
Changed:
<
<
O sea, el comando test puede ser substituído por un par de paréntesis rectos ([ ]), separados por espacios en blanco de los argumentos, lo que aumentará enormemente la legibilidad, pues el comando if irá a quedar con la sintáxis parecida a de otras lenguajes y por esto, será el modo que usaré el comando test en adelante.
>
>
O sea, el comando test puede ser substituído por un par de paréntesis rectos ([ ]), separados por espacios en blanco de los argumentos, lo que aumentará enormemente la legibilidad, pues el comando if irá a quedar con la sintáxis parecida a de otras lenguajes y por esta causa, será éste el modo que usaré el comando test en adelante.
 
Changed:
<
<

Querida, Encolheram o Comando Condicional

>
>

Querida, Encojieron el Comando Condicional!

 
Changed:
<
<
Se você pensa que acabou, está muito enganado. Repare a tabela (tabela verdade) a seguir:
>
>
Si tu piensas que acabó, estás muy engañado. Repara la tabla (booleana) a seguir:
 
Changed:
<
<
Valores Booleanos E OU
 FALSO-VERDADEIRO   FALSO   VERDADEIRO 
 VERDADEIRO-VERDADEIRO   VERDADEIRO   VERDADEIRO 
 VERDADEIRO-FALSO   FALSO   VERDADEIRO 
>
>
Valores Booleanos Y O
 FALSO-VERDADERO   FALSO   VERDADERO 
 VERDADERO-VERDADERO   VERDADERO   VERDADERO 
 VERDADERO-FALSO   FALSO   VERDADERO 
 
 FALSO-FALSO   FALSO   FALSO 
Changed:
<
<
Ou seja, quando o conector é E e a primeira condição é verdadeira, o resultado final pode ser VERDADEIRO ou FALSO, dependendo da segunda condição, já no conector OU, caso a primeira condição seja verdadeira, o resultado sempre será VERDADEIRO e se a primeira for falsa, o resultado dependerá da segunda condição.
>
>
O sea, cuando el conector es Y y la primera condición es verdadera, el resultado final puede ser VERDADERO o FALSO, dependiendo de la segunda condición, ya en el conector O, en caso que la primera condición sea verdadera, el resultado siempre será VERDADERO y si la primera fuera falsa, el resultado dependerá de la segunda condición.
 
Changed:
<
<
Ora, os caras que desenvolveram o interpretador não são bobos e estão sempre tentando otimizar ao máximo os algoritmos. Portanto, no caso do conector E, a segunda condição não será avaliada, caso a primeira seja falsa, já que o resultado será sempre FALSO. Já com o OU, a segunda será executada somente caso a primeira seja falsa.
>
>
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 Y, la segunda condición no será evaluada, en el caso de que la primera sea falsa, ya que el resultado será siempre FALSO. Ya con el O, la segunda será ejecutada solamente en el caso de que la primera sea falsa.
 
Changed:
<
<
Aproveitando disso, criaram uma forma abreviada de fazer testes. Batizaram o conector E de && e o OU de || e para ver como isso funciona, vamos usá-los como teste no nosso velho exemplo de trocarmos de diretório, que em sua última versão estava assim:
>
>
Aprovechando eso, crearon una forma abreviada de hacer tests. Bautizaron el conector Y de && y el O de || y para ver como eso funciona, vamos a usarlos como test en nuestro viejo ejemplo de cambiar de directorio, que en su última versión estaba así:
 
    if  [ ! -d lmb ]
Line: 321 to 321
  cd lmb
Changed:
<
<
Isso também poderia ser escrito da seguinte maneira:
>
>
Eso también podría ser escrito de la siguiente manera:
 
    [ ! -d lmb ] && mkdir lmb
    cd dir
Changed:
<
<
Ou ainda retirando a negação (!):
>
>
O inclusive sacando la negación (!):
 
    [ -d lmb ] || mkdir lmb
    cd dir
Changed:
<
<
No primeiro caso, se o primeiro comando (o test que está representado pelos colchetes) for bem sucedido, isto é, não existir o diretório lmb, o mkdir será efetuado porque a primeira condição era verdadeira e o conector era E.
>
>
En el primer caso, si el primer comando (el test que está representado por los paréntesis rectos) tuviera buen resultado, o sea, no existe el directorio lmb, el mkdir será efectuado, porque la primera condición era verdadera y el conector era Y.
 
Changed:
<
<
No exemplo seguinte, testamos se o diretório lmb existia (no anterior testamos se ele não existia) e caso isso fosse verdade, o mkdir não seria executado porque o conector era OU. Outra forma:
>
>
En el ejemplo siguiente, verificamos si el directorio lmb existía (en el anterior verificamos si él no existía) y en caso de que eso fuera verdadero, el mkdir no sería ejecutado porque el conector era O. Otra forma:
       cd lmb || mkdir lmb
Changed:
<
<
Neste caso, se o cd fosse mal sucedido, seria criado o diretório lmb mas não seria feito o cd para dentro dele. Para executarmos mais de um comando desta forma, é necessário fazermos um grupamento de comandos, e isso se consegue com o uso de chaves ({ }). Veja como seria o correto:
>
>
En este caso, si el cd diera error, sería creado el directorio lmb pero no sería ejecutado el cd para dentro de él. Para ejecutar más de un comando de esta forma, es necesario que hagamos un agrupamiento de comandos, eso se consigue con el uso de llaves ({ }). Vea como sería la forma correcta:
 
    cd lmb ||
Line: 352 to 352
  }
Changed:
<
<
Ainda não está legal, porque caso o diretório não exista, o cd dará a mensagem de erro correspondente. Então devemos fazer:
>
>
Todavia no está bien, porque en el caso de que el directorio no exista, el cd dará el mensaje de error correspondiente. Entonces debemos hacer:
 
    cd lmb 2> /dev/null ||
Line: 362 to 362
  }
Changed:
<
<
Como você viu o comando if nos permitiu fazer um cd seguro de diversas maneiras. É sempre bom lembrarmos que o seguro a que me referi é no tocante ao fato de que ao final da execução você sempre estará dentro de lmb, desde que você tenha permissão entrar em lmb, permissão para criar um diretório em ../lmb, haja espaço em disco, ...
>
>
Como viste, el comando if nos permitió hacer un cd seguro de diversas maneras. Es siempre bueno recordars que el seguro a que me referi es en lo referente al hecho de que al final de la ejecución, tu siempre estarás dentro de lmb, desde que tengas permiso de entrar en lmb, permiso para crear un directorio en ../lmb, haya espacio em el disco, ...
 
Changed:
<
<

E tome de test

>
>

Y toma test!

 
Changed:
<
<
Ufa! Você pensa que acabou? Ledo engano! Ainda tem uma forma de test a mais. Essa é legal porque ela te permite usar padrões para comparação. Estes padrões atendem às normas de Geração de Nome de Arquivos (File Name Generation, que são ligeiramente parecidas com as Expressões Regulares, mas não podem ser confundidas com estas). A diferença de sintaxe deste para o test que acabamos de ver é que esse trabalha com dois pares de colchete da seguinte forma:
>
>
Ufa! Piensas que ahora acabó? Gran engaño! Todavia tenemos una forma de test más. Esta es muy buena porque te permite usar padrones para comparación. Estes padrones atendien a las normas de Geración de Nombres de Archivos (File Name Generation, que son ligeramente parecidas con las Expresiones Regulares, pero no pueden ser confundidas con éstas). La diferencia de sintáxis de este para el test que acabamos de ver, es que este trabaja con dos parêntesis rectos de la siguiente forma:
 
Changed:
<
<
[[ expressão ]]
>
>
[[ expresión ]]
 
Changed:
<
<
Onde expressão é uma das que constam na tabela a seguir:
>
>
Donde expresión es una de las que constan en la tabla a seguir:
 
Changed:
<
<
Expressões Condicionais Para Padrões
  expr1 ¦¦ expr2     "OU" lógico, verdadeiro se expr1 ou expr2 for verdadeiro  
  Expressão     Retorna  
  cadeia == padrão
  cadeia1 = padrao  
  Verdadeiro se cadeia1 casa com padrão  
  cadeia1 != padrao     Verdadeiro se cadeia1 não casa com padrao.  
  cadeia1 < cadeia1     Verdadeiro se cadeia1 vem antes de cadeia1 alfabeticamente.  
  cadeia1 > cadeia1     Verdadeiro se cadeia1 vem depois de cadeia1 alfabeticamente  
  expr1 && expr2     "E" lógico, verdadeiro se ambos expr1 e expr2 são verdadeiros  
>
>
Expresiones Condicionales Para Padrones
  expr1 ¦¦ expr2     "O" lógico, Verdadero si expr1 o expr2 fueran Verdaderos  
  Expresión     Retorna  
  cadena == padrón
  cadena1 = padrón  
  Verdadero si cadena1 es igual a padrón  
  cadena1 != padrón     Verdadero si cadena1 no es igual a padrón.  
  cadena1 < cadena1     Verdadero si cadena1 está antes de cadena1 alfabéticamente.  
  cadena1 > cadena1     Verdadero si cadena1 está después de cadena1 alfabéticamente  
  expr1 && expr2     "Y" lógico, Verdadero si ambos expr1 y expr2 son Verdaderos  
 

$ echo $H 13
Changed:
<
<
$ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora inválida Hora inválida
>
>
$ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora no válida Hora no válida
 $H=12
Changed:
<
<
$ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora inválida
>
>
$ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora no válida
 $
Changed:
<
<
Neste exemplo, testamos se o conteúdo da variável $H estava compreendido entre zero e nove ([0-9]) ou (||) se estava entre dez e doze (1[0-2]), dando uma mensagem de erro caso não fosse.
>
>
En este ejemplo,verificamos si el contenido de la variable $H estaba comprendido entre cero y nueve ([0-9]) o (||) si estaba entre diez e doze (1[0-2]), dando un mensaje de error en caso que no fuera
 
Changed:
<
<
Exemplos:
>
>
Ejemplos:
 
Changed:
<
<
Para saber se uma variável tem o tamanho de um e somente um caractere, faça:
>
>
Para saber si una variable tiene el tamaño de un y solamente un caracter, haga:
 
$ var=a
Changed:
<
<
$ [[ $var == ? ]] && echo var tem um caractere
>
>
$ [[ $var == ? ]] && echo var tiene un caracter
 var tem um caractere $ var=aa
Changed:
<
<
$ [[ $var == ? ]] && echo var tem um caractere
>
>
$ [[ $var == ? ]] && echo var tiene un caracter
 $
Changed:
<
<
Como você pode imaginar, este uso de padrões para comparação, aumenta muito o poderio do comando test. No início deste papo, antes do último chope, afirmamos que o comando if do interpretador Shell é mais poderoso que o seu similar em outras linguagens. Agora que conhecemos todo o seu espectro de funções, diga-me: você concorda ou não com esta assertiva?
>
>
Como puedes imaginar, este uso de padrones para comparación, aumenta mucho el poderío del comando test. En el inicio de esta conversación, antes del último choppe, afirmamos que el comando if del interpretador Shell es más poderoso que su similar en otras lenguajes. Ahora que conocimos todo su espectro de funciones, dime: tú concuerdas o no con esta afirmación?
 
Changed:
<
<

Acaso Casa com case

>
>

Acaso Casa con case

 
Changed:
<
<
Vejamos um exemplo didático: dependendo do valor da variável $opc o script deverá executar uma uma das opções: inclusão, exclusão, alteração ou fim. Veja como ficaria este fragmento de script:
>
>
Veamos un ejemplo didáctico: dependiendo del valor de la variable $opc el script deberá ejecutar una de las opciones: inclusión, exclusión, alteración o fin. Vea como quedaría este fragmento de script:
 
    if  [ $opc -eq 1 ]
    then
Changed:
<
<
inclusao
>
>
inclusión
  elif [ $opc -eq 2 ] then
Changed:
<
<
exclusao
>
>
exclusión
  elif [ $opc -eq 3 ] then
Changed:
<
<
alteracao
>
>
alteración
  elif [ $opc -eq 4 ] then exit else
Changed:
<
<
echo Digite uma opção entre 1 e 4
>
>
echo Digite una opción entre 1 y 4
  fi
Changed:
<
<
Neste exemplo você viu o uso do elif com um else if, esta á a sintaxe válida e aceita, mas poderíamos fazer melhor, e isto seria com o comando case, que tem a sintaxe a seguir:
>
>
En este ejemplo viste el uso del elif con un else if, esta es una sintáxis válida y aceptada, pero podríamos hacer mejor y sería usando el comando case, que tiene la sintáxis a seguir:
 
    case $var in
Changed:
<
<
padrao1) cmd1
>
>
padrón1) cmd1
  cmd2 cmdn ;;
Changed:
<
<
padrao2) cmd1
>
>
padrón2) cmd1
  cmd2 cmdn ;;
Changed:
<
<
padraon) cmd1
>
>
padrónn) cmd1
  cmd2 cmdn ;; esac
Changed:
<
<
Onde a variável $var é comparada aos padrões padrao1, ..., padraon e caso um deles atenda, o bloco de comandos cmd1, ..., cmdn correspondente é executado até encontrar um duplo ponto-e-vírgula (;;), quando o fluxo do programa se desviará para instrução imediatamente após o esac.
>
>
Donde la variable $var es comparada a los padrones padrón1, ..., padrónn y en caso de que uno de ellos atienda, el bloque de comandos cmd1, ..., cmdn correspondiente es ejecutado hasta que encuentre un duplo punto y coma (;;), cuando el flujo del programa se desviará para la instrucción inmediatamente después, o sea el esac.
 
Changed:
<
<
Na formação dos padrões, são aceitos os seguintes caracteres:
>
>
En la formação de los padrones, son aceptados los siguientes caracteres:
 
Changed:
<
<
Caracteres Para Formação de Padrões
?   Qualquer caractere ocorrendo uma vez  
  Caractere     Significado  
*   Qualquer caractere ocorrendo zero ou mais vezes  
>
>
Caracteres Para Formacion de Padrones
?   Cualquier caracter ocurriendo una vez  
  Caracter     Significado  
*   Cualquier caracter ocurriendo cero o más veces  
 
[...]   Lista de caracteres  
Changed:
<
<
¦   OU lógico  
>
>
¦   O lógico  
 
Changed:
<
<
Para mostrar como fica melhor, vamos repetir o exemplo anterior, só que desta vez usaremos o case e não o if ... elif ... else ... fi.
>
>
Para mostrar como realmente queda mejor, vamos a repetir el ejemplo anterior, sólo que esta vez usaremos el case y no el if ... elif ... else ... fi.
 
    case $opc in
Changed:
<
<
1) inclusao ;; 2) exclusao ;; 3) alteracao ;;
>
>
1) inclusión ;; 2) exclusión ;; 3) alteración ;;
  4) exit ;;
Changed:
<
<
*) echo Digite uma opção entre 1 e 4
>
>
*) echo Digite una opción entre 1 y 4
  esac
Changed:
<
<
Como você deve ter percebido, eu usei o asterisco como a última opção, isto é, se o asterisco atende a qualquer coisa, então ele servirá para qualquer coisa que não esteja no intervalo de 1 a 4. Outra coisa a ser notada é que o duplo ponto-e-vírgula não é necessário antes do esac.
>
>
Como debes haber percibido, usé el asterisco como la última opción, o sea, si el asterisco atiende a cualquier cosa, entonces servirá para cualquier cosa que no este en el intervalo del 1 al 4. Otra cosa a ser notada es que el duplo punto y coma no es necesario antes del esac.
 
Changed:
<
<
Exemplos:
>
>
Ejemplos:
 
Changed:
<
<
Vamos agora fazer um script mais radical. Ele te dará bom dia, boa tarde ou boa noite dependendo da hora que for executado, mas primeiramente veja estes comandos:
>
>
Vamos ahora a hacer un script más radical. Él te dará los buenos días, buenas tardes o buenas noches, dependiendo de la hora en que sea ejecutado, pero primero ve estos comandos:
 
$ date
Line: 490 to 490
 19
Changed:
<
<
O comando date informa a data completa do sistema, mas ele tem diversas opções para seu mascaramento. Neste comando, a formatação começa com um sinal de mais (+) e os caracteres de formatação vêm após um sinal de percentagem (%), assim o %H significa a hora do sistema. Dito isso vamos ao exemplo:
>
>
El comando date informa de la fecha completa del sistema, sin embargo tiene diversas opciones para su enmascaramiento. En este comando, la formatación comienza con un signo de más (+) y los caracteres de formatación vienen después de un signo de porcentaje (%), así el %H significa la hora del sistema. Dicho esto, vamos al ejemplo:
 
$ cat boasvindas.sh #!/bin/bash
Changed:
<
<
# Programa bem educado que # dá bom-dia, boa-tarde ou # boa-noite conforme a hora
>
>
# Programa biem educado que # da los Buenos dias, buenas tardes o # las buenas noches dependiendo de la hora
 Hora=$(date +%H) case $Hora in
Changed:
<
<
0? | 1[01]) echo Bom Dia
>
>
0? | 1[01]) echo Buenos dias
  ;;
Changed:
<
<
1[2-7] ) echo Boa Tarde
>
>
1[2-7] ) echo Buenas tardes
  ;;
Changed:
<
<
* ) echo Boa Noite
>
>
* ) echo Buenas noches
  ;; esac exit
Changed:
<
<
Peguei pesado, né? Que nada vamos esmiuçar a resolução caso-a-caso (ou seria case-a-case? smile )
>
>
Fue pesado, cierto? Que vá! Vamos a desmenuzar la resolución caso a caso (o sería case-a-case? smile )
 
Changed:
<
<
0? | 1[01] - Significa zero seguido de qualquer coisa (?), ou (|) um seguido de zero ou um ([01]) ou seja, esta linha pegou 01, 02, ... 09, 10 e 11;
>
>
0? | 1[01] - Significa cero seguido de cualquier cosa (?), o (|) uno seguido de cero o uno ([01]) o sea, esta línea pegó 01, 02, ... 09, 10 y 11;
 
Changed:
<
<
1[2-7]     - Significa um seguido da lista de dois a sete, ou seja, esta linha pegou 12, 13, ... 17;
>
>
1[2-7]     - Significa uno seguido de la lista de dos a siete, o sea, esta línea pegó 12, 13, ... 17;
 
Changed:
<
<
*          - Significa tudo que não casou com nenhum dos padrões anteriores.
>
>
*          - Significa todo aquello que no se encuadró con ninguno de los padrones anteriores.
 
Changed:
<
<
     - Cara, até agora eu falei muito e bebi pouco. Agora eu vou te passar um exercício para você fazer em casa e me dar a resposta da próxima vez que nos encontrarmos aqui no botequim, tá legal?
>
>
     - Mira, hasta ahora mucho y bebí poco. Ahora te voy a pasar un ejercicio para que hagas en tu casa y me des la respuesta en la próxima vez que nos encontremos aqui em el bar, de acuerdo?
 
Changed:
<
<
     - Tá, mas antes informe ao pessoal que está acompanhando este curso conosco como eles podem te encontrar para fazer críticas, contar piada, convidar para o chope, curso ou palestra ou até mesmo para falar mal dos políticos.
>
>
     - De acuerdo, pero antes informe a las personas que están acompañando este curso con nosotros como pueden hacer para encontrarte para hacer críticas, hacer chistes, invitarte para um chopp, curso, charlas o hasta si quieren, para hablar mal de los políticos.
 
Changed:
<
<
     - É fácil, meu e-mail é julio.neves@gmail.com, mas pare de me embromar que eu não vou esquecer de te passar o script para fazer. É o seguinte: quero que você faça um programa que receberá como parâmetro o nome de um arquivo e que quando executado salvará este arquivo com o nome original seguido de um til (~) e colocará este arquivo dentro do vi (o melhor editor que se tem notícia) para ser editado. Isso é para ter sempre a última cópia boa deste arquivo caso o cara faça alterações indevidas. Obviamente, você fará as críticas necessárias, como verificar se foi passado um parâmetro, se o arquivo passado existe, ... Enfim, o que te der na telha e você achar que deve constar do script. Deu prá entender?
>
>
     - 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 para de deberes que es: quiero que hagas un programa que recebirá como parámetro el nombre de un archivo y que cuando sea ejecutado grabará este archivo com el nombre original seguido de un til (~) y colocará este archivo dentro del vi (el mejor editor del cual se tiene noticia) para ser editado. Esto sirve para tener siempre la última copia buena del archivo en el caso de que la persona haga alteraciones indebidas. Obviamente, tendrás que hacer las críticas necesarias, como verificar si fué pasado un parámetro, si el archivo que fué pasado existe, ... Em fin, lo que se te venga a la cabeza y tu creas que deba estar en el script. Entendiste?
       - Hum, hum...
Changed:
<
<
     - Chico! Traz mais um sem colarinho que o cara aqui já está dando para entender! smile
>
>
     - Chico! Traeme otro más sin espuma, que el amigo aqui ya está entendiendo! smile
  -- HumbertoPina - 05 Oct 2006

Revision 306 Oct 2006 - Main.HumbertoPina

Line: 1 to 1
 

En construcción....!!! Conversa de bar IV


Line: 16 to 16
 then echo $1 está logado else
Changed:
<
<
echo $1 no se encuentra en los alrededores
>
>
echo $1 no se encuentra en la vecindad
 fi
Line: 41 to 41
 then echo $1 está logado else
Changed:
<
<
echo $1 no se encuentra en los alrededores
>
>
echo $1 no se encuentra en la vecindad
 fi
Line: 51 to 51
 $ logado jneves jneves está logado $ logado chico
Changed:
<
<
chico no se encuentra en los alrededores
>
>
chico no se encuentra en la vecindad
 

Pinguim com placa de atenção
Line: 64 to 64
 

El Comando test

Changed:
<
<
Bem, todos estamos acostumados a usar o if testando condições, e estas são sempre, maior, menor, maior ou igual, menor ou igual, igual e diferente. Bem, em Shell para testar condições, usamos o comando test, só que ele é muito mais poderoso que o que estamos habituados. Primeiramente vou te mostrar as principais opções (existem muitas outras) para testarmos arquivos em disco:
>
>
Bien, todos estamos acostumbrados a usar el if para verificar condiciones, y estas condiciones siempre son: mayor, menor, mayor o igual, menor o igual, igual y diferente. Em Shell para verificar condições, usamos el comando test, sólo que él es mucho más poderoso que a lo que estamos habituados. Primero te voy a mostrar las principales opciones (existen muchas otras) para verificar la existencia de archivos en el disco:
 
Changed:
<
<
Opções do Comando test para arquivos
  -x arq     arq existe e com direito de execução  
  Opção     Verdadeiro se:  
  -e arq     arq existe  
  -s arq     arq existe e tem tamanho maior que zero  
  -f arq     arq existe e é um arquivo regular  
  -d arq     arq existe e é um diretório;  
  -r arq     arq existe e com direito de leitura  
  -w arq     arq existe e com direito de escrita  
>
>
Opciones del Comando test para archivos
  -x arch     arch existe y con derechos de ejecución  
  Opción     Verdadero si:  
  -e arch     arch existe  
  -s arch     arch existe y tiene tamaño mayor que cero  
  -f arch     arch existe y es un archivo regular  
  -d arch     arch existe y es un directorio;  
  -r arch     arch existe y con derechos de lectura  
  -w arch     arch existe y con derechos de escritura  
 
Changed:
<
<
Veja agora as principais opções para teste de cadeias de caracteres:
>
>
Ve ahora las principales opciones para verificar cadenas de caracteres:
 
Changed:
<
<
Opções do comando test para cadeias de caracteres
  c1 = c2    Cadeia c1 e c2 são idênticas 
  Opção     Verdadeiro se:  
  -z cadeia    Tamanho de cadeia é zero 
  -n cadeia    Tamanho de cadeia é maior que zero 
  cadeia    A cadeia cadeia tem tamanho maior que zero 
>
>
Opciones del comando test para cadenas de caracteres
  c1 = c2    Cadena c1 y c2 son idénticas 
  Opción     Verdadero si:  
  -z cadena    Tamaño de cadena es cero 
  -n cadena    Tamaño de cadena es mayor que cero 
  cadena    La cadena cadena tiene tamaño mayor que cero 
 
Changed:
<
<
E pensa que acabou? Engano seu! Agora é que vem o que você está mais acostumado, ou seja as famosas comparações com numéricos. Veja a tabela:
>
>
Y crees que acabó por ahí? Estás engañado! Ahora viene la parte a que estás más acostumbrado, o sea las famosas comparaciones con numéros. Ve la tabla que sigue:
 
Changed:
<
<
Opções do comando test para números
  n1 -le n2     n1 é menor ou igual a n2     less or equal  
  Opção     Verdadeiro se:     Significado  
  n1 -eq n2     n1 e n2 são iguais     equal  
  n1 -ne n2     n1 e n2 não são iguais     not equal  
  n1 -gt n2     n1 é maior que n2     greater than  
  n1 -ge n2     n1 é maior ou igual a n2     greater or equal  
  n1 -lt n2     n1 é menor que n2     less than  
>
>
Opciones del comando test para números
  n1 -le n2     n1 es menor o igual a n2     less or equal  
  Opción     Verdadero si:     Significado  
  n1 -eq n2     n1 y n2 son iguales     equal  
  n1 -ne n2     n1 y n2 no son iguales     not equal  
  n1 -gt n2     n1 es mayor que n2     greater than  
  n1 -ge n2     n1 es mayor o igual a n2     greater or equal  
  n1 -lt n2     n1 es menor que n2     less than  
 
Changed:
<
<
Além de tudo, some-se a estas opções as seguintes facilidades:
>
>
Además de todo eso, se suman a las opciones que te mostré, las siguientes facilidades:
 
Operadores
Changed:
<
<
  -o     OU lógico  
  Operador     Finalidade  
  Parênteses ( )     Agrupar  
  Exclamação !     Negar  
  -a     E lógico  
>
>
  -o     O lógico  
  Operador     Finalidad  
  Paréntesis ( )     Agrupar  
  Admiración !     Negar  
  -a     Y lógico  
 
Changed:
<
<
Ufa! Como você viu tem coisa prá chuchu, e como eu te disse no início, o nosso if é muito mais poderoso que o dos outros. Vamos ver em uns exemplos como isso tudo funciona, primeiramente testaremos a existência de um diretório:
>
>
Ufa! Como viste hay mucha cosa y como te dije al comienzo, nuestro if es mucho más poderoso que los de otros. Vamos a ver en unos ejemplos como todo esto funciona, primeiro verificaremos la existencia de un directorio:
 
Changed:
<
<
Exemplos:
>
>
Ejemplos:
 
    if  test -d lmb
Line: 131 to 131
  fi
Changed:
<
<
No exemplo, testei se existia um diretório lmb definido, caso negativo (else), ele seria criado. Já sei, você vai criticar a minha lógica dizendo que o script não está otimizado. Eu sei, mas queria que você o entendesse assim, para então poder usar o ponto-de-espantação (!) como um negador do test. Veja só:
>
>
En este ejemplo, verifiqué la existencia de un directorio lmb definido, en caso negativo (else), éste seria creado. Ya sé, vas a criticar mi razonamiento diciendo que el script no está optimizado. Lo sé perfectamente, pero queria que entendieras este ejemplo, para entonces después poder usar el signo de admiración (!) como un negador del test. Mira esto:
 
    if  test ! -d lmb
Line: 141 to 141
  cd lmb
Changed:
<
<
Desta forma o diretório lmb seria criado somente se ele ainda não existisse, e esta negativa deve-se ao ponto-de-exclamação (!) precedendo a opção -d. Ao fim da execução deste fragmento de script, o programa estaria com certeza dentro do diretório lmb.
>
>
De esta forma el directorio lmb sería creado solamente se él no existiese, y esta negativa se debe al signo de admiração (!) precediendo a la opción -d. Al finalizar la ejecución de este fragmento de script, el programa estaría seguramente dentro del directorio lmb.
 
Changed:
<
<
Vamos ver dois exemplos para entender a diferença comparação entre números e entre cadeias.
>
>
Vamos a ver dos ejemplos para entender como es diferente la comparación entre números y entre cadenas.
 
    cad1=1
    cad2=01
    if  test $cad1 = $cad2
    then
Changed:
<
<
echo As variáveis são iguais.
>
>
echo Las variables son iguales.
  else
Changed:
<
<
echo As variáveis são diferentes.
>
>
echo Las variables son diferentes.
  fi
Changed:
<
<
Executando o fragmento de programa acima vem:
>
>
Ejecutando el fragmento del programa arriba, resulta:
 
Changed:
<
<
     As variáveis são diferentes.
>
>
     Las variables son diferentes.
 
Changed:
<
<
Vamos agora alterá-lo um pouco para que a comparação seja numérica:
>
>
Vamos ahora a modificarlo un poco, de manera que la comparación sea numérica esta vez:
 
    cad1=1
    cad2=01
    if  test $cad1 -eq $cad2
    then
Changed:
<
<
echo As variáveis são iguais.
>
>
echo Las variables son iguales.
  else
Changed:
<
<
echo As variáveis são diferentes.
>
>
echo Las variables son diferentes.
  fi
Changed:
<
<
E vamos executá-lo novamente:
>
>
Y lo ejecutamos nuevamente:
 
Changed:
<
<
     As variáveis são iguais.
>
>
     Las variables son iguales.
 
Changed:
<
<
Como você viu nas duas execuções obtive resultados diferentes porque a cadeia 01 é realmente diferente da cadeia 1, porém, a coisa muda quando as variáveis são testadas numericamente, já que o número 1 é igual ao número 01.
>
>
Como viste en las dos ejecuciones obtuve resultados diferentes porque la cadena 01 es realmente diferente de la cadena 1, sin embargo la cosa cambia cuando las variables son verificadas en forma numérica, ya que el número 1 es igual al número 01.
 
Changed:
<
<
Exemplos:
>
>
Ejemplos:
 
Changed:
<
<
Para mostrar o uso dos conectores -o (OU) e -a (E), veja um exemplo animal feito direto no prompt (me desculpem os zoólogos, mas eu não entendendo nada de reino, filo, classe, ordem, família, gênero e espécie, desta forma o que estou chamando de família ou de gênero tem grande chance de estar incorreto):
>
>
Para mostrar el uso de los conectores -o (O) y -a (Y), vea un ejemplo bien grosero hecho directamente en el prompt (pido disculpas a los zoólogos, ya que no entiendendo nada de reino, clase, orden, familia, género y especie, por lo que lo que estoy llamando de familia o de género tiene grandes posibilidade de estar incorrecto):
 
$ Familia=felinae $ Genero=gato
Changed:
<
<
$ if test $Familia = canidea -a $Genero = lobo -o $Familia = felina -a $Genero = leão
>
>
$ if test $Familia = canidea -a $Genero = lobo -o $Familia = felina -a $Genero = leonino
 > then > echo Cuidado > else
Changed:
<
<
> echo Pode passar a mão
>
>
> echo Puede acariciar
 > fi
Changed:
<
<
Pode passar a mão
>
>
Puede acariciar
 
Changed:
<
<
Neste exemplo caso o animal fosse da família canídea E (-a) do gênero lobo, OU (-o) da familia felina E (-a) do gênero leão, seria dado um alerta, caso contrário a mensagem seria de incentivo.
>
>
En este ejemplo en caso de que el animal fuera de la familia canídea Y (-a) del género lobo, O (-o) de la familia felina Y (-a) del género leonino, sería dado un aviso de alerta, en caso contrario el mensaje sería de incentivo.
 
Pinguim com placa de dica
Changed:
<
<
Os sinais de maior (>) no início das linhas internas ao if são os prompts de continuação (que estão definidos na variável $PS2) e quando o Shell identifica que um comando continuará na linha seguinte, automaticamente ele o coloca até que o comando seja encerrado.
>
>
Los signos de mayor (>) al início 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 lo va colocado hasta que el comando sea finalizado.
 
Changed:
<
<
Vamos mudar o exemplo para ver se continua funcionando:
>
>
Vamos a cambiar el ejemplo para ver si continúa funcionando:
 
$ Familia=felino $ Genero=gato
Changed:
<
<
$ if test $Familia = felino -o $Familia = canideo -a $Genero = onça -o $Genero = lobo
>
>
$ if test $Familia = felino -o $Familia = canideo -a $Genero = onza -o $Genero = lobo
 > then
Changed:
<
<
> echo Cuidado
>
>
> echo Cuidado!
 > else
Changed:
<
<
> echo Pode passar a mão
>
>
> echo Puede acariciar
 > fi
Changed:
<
<
Cuidado
>
>
Cuidado!
 
Changed:
<
<
Obviamente a operação redundou em erro, isto foi porque a opção -a tem precedência sobre a -o, e desta forma o que primeiro foi avaliado foi a expressão:
>
>
Obviamente la operación resultó en error, ya que la opción -a tiene prioridad sobre la -o, y así lo que fie evaluado primero, fué la expresión:
 
Changed:
<
<
     $Familia = canideo -a $Genero = onça
>
>
     $Familia = canideo -a $Genero = onza
 
Changed:
<
<
Que foi avaliada como falsa, retornando o seguinte:
>
>
Que fué evaluada como falsa, y dió el seguiente resultado:
       $Familia = felino -o FALSO -o $Genero = lobo
Changed:
<
<
Que resolvida vem:
>
>
Que una vez resuelta dió:
 
Changed:
<
<
     VERDADEIRO -o FALSO -o FALSO
>
>
     VERDADERO -o FALSO -o FALSO
 
Changed:
<
<
Como agora todos conectores são -o, e para que uma série de expressões conectadas entre si por diversos OU lógicos seja verdadeira, basta que uma delas seja, a expressão final resultou como VERDADEIRO e o then foi executado de forma errada. Para que isso volte a funcionar façamos o seguinte:
>
>
Como ahora todos los conectores son -o, y para que una serie de expresiones conectadas entre sí por diversos O lógicos sea verdadera, basta que una de ellas lo sea, la expresión final resultó como VERDADERO e el then fue ejecutado de forma incorrecta. Para que vuelva a funcionar hagamos lo seguiente:
 
Changed:
<
<
$ if test \($Familia = felino -o $Familia = canideo\) -a \($Genero = onça -o $Genero = lobo\)
>
>
$ if test \($Familia = felino -o $Familia = canideo\) -a \($Genero = onza -o $Genero = lobo\)
 > then
Changed:
<
<
> echo Cuidado
>
>
> echo Cuidado!
 > else
Changed:
<
<
> echo Pode passar a mão
>
>
> echo Puede acariciar
 > fi
Changed:
<
<
Pode passar a mão
>
>
Puede acariciar
 
Changed:
<
<
Desta forma, com o uso dos parênteses agrupamos as expressões com o conector -o, priorizando as suas execuções e resultando:
>
>
De esta forma, con el uso de los paréntesis agrupamos las expresiones con el conector -o, dando prioridad a sus ejecuciones y resultando:
 
Changed:
<
<
     VERDADEIRO -a FALSO
>
>
     VERDADERO -a FALSO
 
Changed:
<
<
Para que seja VERDADEIRO o resultado duas expressões ligadas pelo conector -a é necessário que ambas sejam verdadeiras, o que não é o caso do exemplo acima. Assim o resultado final foi FALSO sendo então o else corretamente executado.
>
>
Para que sea VERDADERO el resultado de dos expresiones ligadas por el conector -a es necesario que ambas sean verdaderas, lo que no es el caso del ejemplo arriba citado. Así el resultado final fue FALSO siendo entonces el else correctamente ejecutado.
 
Changed:
<
<
Se quisermos escolher um CD que tenha faixas de 2 artistas diferentes, nos sentimos tentados a usar um if com o conector -a, mas é sempre bom lembrarmos que o bash nos dá muito recursos, e isso poderia ser feito de forma muito mais simples com um único comando grep, da seguinte maneira:
>
>
Si quisieramos escojer un CD que tenga músicas de 2 artistas diferentes, nos sentimos tentados a usar un if com el conector -a, pero siempre es bueno recordar que el bash nos dá muchos recursos y eso podría ser hecho de forma mucho más simple con un único comando grep, de la siguiente manera:
 
$ grep Artista1 musicas | grep Artista2
Changed:
<
<
Da mesma forma para escolhermos CDs que tenham a participação do Artista1 e do Artista2, não é necessário montarmos um if com o conector -o. O egrep (ou grep -E, sendo este mais aconselhável) também resolve isso para nós. Veja como:
>
>
De la misma forma para escojer CDs que tegam la participación del Artista1 y del Artista2, no es necesario montar un if con el conector -o. El egrep (o grep -E, siendo éste más recomendade) tambiém nos resuelve eso. Vea como:
 
$ egrep (Artista1|Artista2) musicas
Changed:
<
<
Ou (nesse caso específico) o próprio grep puro e simples poderia nos quebrar o galho:
>
>
O (en ese caso específico) el propio grep puro y simple podría ayudarnos:
 
$ grep Artista[12] musicas
Changed:
<
<
No egrep acima, foi usada uma expressão regular, onde a barra vertical (|) trabalha como um OU lógico e os parênteses são usados para limitar a amplitude deste OU. Já no grep da linha seguinte, a palavra Artista deve ser seguida por um dos valores da lista formada pelos colchetes ([ ]), isto é, 1 ou 2.
>
>
El el egrep arriba, fue usada una expresión regular, donde la barra vertical (|) trabaja como un O lógico y los paréntesis son usados para limitar la amplitud de este O.Ya en el grep de la línea siguiente, la palabra Artista debe ser seguida por algún de los valores de la lista formada por los paréntesis rectos ([ ]), o sea, 1 o 2.
 
Changed:
<
<
     - Tá legal, eu aceito o argumento, o if do Shell é muito mais poderoso que os outros caretas, mas cá pra nós, essa construção de if test ... é muito esquisita, é pouco legível.
>
>
     - Está bien, acepto el argumento, el if del Shell es mucho más poderoso que los otros conocidos, pero entre nosotros, esa construción del if test ... es muy extraña, y poco legible.
 
Changed:
<
<
     - É você tem razão, eu também não gosto disso e acho que ninguém gosta. Acho que foi por isso, que o Shell incorporou outra sintaxe que substitui o comando test.
>
>
     - Si, tienes toda la razón, también no me gusta y me parece que a nadie le gusta. Creo que fue por eso, que el Shell incorporó otra sintáxis que substituye el comando test.
 
Changed:
<
<
Exemplos:
>
>
Ejemplos:
 
Changed:
<
<
Para isso vamos pegar aquele exemplo para fazer uma troca de diretórios, que era assim:
>
>
Para esto vamos a ver nuevamente aquel ejemplo para hacer una cambio de directorios, que era así:
 
    if  test ! -d lmb
Line: 281 to 281
  cd lmb
Changed:
<
<
e utilizando a nova sintaxe, vamos fazê-lo assim:
>
>
y utilizando la nueva sintáxis, vamos a hacerla así:
 
    if  [ ! -d lmb ]
Line: 291 to 291
  cd lmb
Changed:
<
<
Ou seja, o comando test pode ser substituído por um par de colchetes ([ ]), separados por espaços em branco dos argumentos, o que aumentará enormemente a legibilidade, pois o comando if irá ficar com a sintaxe semelhante à das outras linguagens e por isso este será o modo que o comando test será usado daqui para a frente.
>
>
O sea, el comando test puede ser substituído por un par de paréntesis rectos ([ ]), separados por espacios en blanco de los argumentos, lo que aumentará enormemente la legibilidad, pues el comando if irá a quedar con la sintáxis parecida a de otras lenguajes y por esto, será el modo que usaré el comando test en adelante.
 

Querida, Encolheram o Comando Condicional

Revision 205 Oct 2006 - Main.HumbertoPina

Line: 1 to 1
Changed:
<
<

En construção....!!! Conversa de bar IV

>
>

En construcción....!!! Conversa de bar IV

 
Line: 23 to 23
       - Calma amigo! Ya vi que hoy llegó 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!
Changed:
<
<
     - Agora que já molhamos os nossos bicos, vamos dar uma olhadinha na execução do seu bacalho:
>
>
     - Ahora que ya mojamos nuestros labios, vamos a dar una miradita en la ejecución de su programita:
 
$ logado jneves
Line: 31 to 31
 jneves está logado
Changed:
<
<
Realmente funcionou. Passei o meu login como parâmetro e ele disse que eu estava logado, porém ele mandou uma linha que eu não pedi. Esta linha é a saída do comando who, e para evitar que isso aconteça é só mandá-la para o buraco negro que a esta altura você já sabe que é o /dev/null. Vejamos então como ficaria:
>
>
Realmente funcionó. Pasé mi login como parámetro y él me informó que estaba logado, sin embargo, al mismo tiempo mandó una línea que no pedí. Esta línea es la salida del comando who, y para evitar que eso pase lo único que hay que hacer es mandarla para el agujero negro que a esta altura ya sabes que es el /dev/null. Veamos entonces como quedaría:
 
$ cat logado #!/bin/bash
Changed:
<
<
# Pesquisa se uma pessoa está logada ou não (versão 2)
>
>
# Busca si una persona está logada o no (versión 2)
 if who | grep $1 > /dev/null then echo $1 está logado else
Changed:
<
<
echo $1 não se encontra no pedaço
>
>
echo $1 no se encuentra en los alrededores
 fi
Changed:
<
<
Agora vamos aos testes:
>
>
Ahora vamos a los tests:
 
$ logado jneves jneves está logado $ logado chico
Changed:
<
<
chico não se encontra no pedaço
>
>
chico no se encuentra en los alrededores
 

Pinguim com placa de atenção
Changed:
<
<
Ah, agora sim! Lembre-se desta pegadinha, a maior parte dos comandos tem uma saída padrão e uma saída de erros (o grep é uma das poucos exceções, já que não dá mensagem de erro quando não acha uma cadeia) e é necessário estarmos atentos para redirecioná-las para o buraco negro quando necessário.
>
>
Ah, ahora si! Acuérdate de esto: la mayor parte de los comandos tienen una salida padrón y una salida de errores (el grep es una de las pocas excepciones, ya que no dá mensaje de error cuando no acha una cadena) y es necesario estar muy atentos para redirecionarlas para el agujero negro cuando sea necesario.
 
Changed:
<
<
Bem, agora vamos mudar de assunto: na última vez que nos encontramos aqui no Botequim, eu estava te mostrando os comandos condicionais e, quando já estávamos de goela seca falando sobre o if, você me perguntou como se testa condições. Vejamos então o
>
>
Bueno, ahora vamos a mudar de asunto: en la última vez que nos encontramos aqui en el Bar, te estaba mostrando los comandos condicionales y quando ya estabamos de garganta seca hablando sobre el if, me perguntaste como se verifican condiciones. Veamos entonces el
 
Changed:
<
<

O Comando test

>
>

El Comando test

 

Bem, todos estamos acostumados a usar o if testando condições, e estas são sempre, maior, menor, maior ou igual, menor ou igual, igual e diferente. Bem, em Shell para testar condições, usamos o comando test, só que ele é muito mais poderoso que o que estamos habituados. Primeiramente vou te mostrar as principais opções (existem muitas outras) para testarmos arquivos em disco:

Revision 105 Oct 2006 - Main.HumbertoPina

Line: 1 to 1
Added:
>
>

En construção....!!! Conversa de bar IV


     - Y entonces mi amigo, intentó hacer el ejercicio que te pedí para reforzar los conocimientos?

     - Claro, que si! En programación, si no se practica, no se aprende. Me pediste para hacer un scriptsiño para informar se un determinado usuario, que será pasado como parámetro esta logado (ajjjj!) o no. Hice lo seguinte:

$ 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 los alrededores fi

     - Calma amigo! Ya vi que hoy llegó 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!

     - Agora que já molhamos os nossos bicos, vamos dar uma olhadinha na execução do seu bacalho:

$ logado jneves jneves pts/0 Oct 18 12:02 (10.2.4.144) jneves está logado

Realmente funcionou. Passei o meu login como parâmetro e ele disse que eu estava logado, porém ele mandou uma linha que eu não pedi. Esta linha é a saída do comando who, e para evitar que isso aconteça é só mandá-la para o buraco negro que a esta altura você já sabe que é o /dev/null. Vejamos então como ficaria:

$ cat logado #!/bin/bash # Pesquisa se uma pessoa está logada ou não (versão 2) if who | grep $1 > /dev/null then echo $1 está logado else echo $1 não se encontra no pedaço fi

Agora vamos aos testes:

$ logado jneves jneves está logado $ logado chico chico não se encontra no pedaço

Pinguim com placa de atenção Ah, agora sim! Lembre-se desta pegadinha, a maior parte dos comandos tem uma saída padrão e uma saída de erros (o grep é uma das poucos exceções, já que não dá mensagem de erro quando não acha uma cadeia) e é necessário estarmos atentos para redirecioná-las para o buraco negro quando necessário.

Bem, agora vamos mudar de assunto: na última vez que nos encontramos aqui no Botequim, eu estava te mostrando os comandos condicionais e, quando já estávamos de goela seca falando sobre o if, você me perguntou como se testa condições. Vejamos então o

O Comando test

Bem, todos estamos acostumados a usar o if testando condições, e estas são sempre, maior, menor, maior ou igual, menor ou igual, igual e diferente. Bem, em Shell para testar condições, usamos o comando test, só que ele é muito mais poderoso que o que estamos habituados. Primeiramente vou te mostrar as principais opções (existem muitas outras) para testarmos arquivos em disco:

Opções do Comando test para arquivos
  -x arq     arq existe e com direito de execução  
  Opção     Verdadeiro se:  
  -e arq     arq existe  
  -s arq     arq existe e tem tamanho maior que zero  
  -f arq     arq existe e é um arquivo regular  
  -d arq     arq existe e é um diretório;  
  -r arq     arq existe e com direito de leitura  
  -w arq     arq existe e com direito de escrita  

Veja agora as principais opções para teste de cadeias de caracteres:

Opções do comando test para cadeias de caracteres
  c1 = c2    Cadeia c1 e c2 são idênticas 
  Opção     Verdadeiro se:  
  -z cadeia    Tamanho de cadeia é zero 
  -n cadeia    Tamanho de cadeia é maior que zero 
  cadeia    A cadeia cadeia tem tamanho maior que zero 

E pensa que acabou? Engano seu! Agora é que vem o que você está mais acostumado, ou seja as famosas comparações com numéricos. Veja a tabela:

Opções do comando test para números
  n1 -le n2     n1 é menor ou igual a n2     less or equal  
  Opção     Verdadeiro se:     Significado  
  n1 -eq n2     n1 e n2 são iguais     equal  
  n1 -ne n2     n1 e n2 não são iguais     not equal  
  n1 -gt n2     n1 é maior que n2     greater than  
  n1 -ge n2     n1 é maior ou igual a n2     greater or equal  
  n1 -lt n2     n1 é menor que n2     less than  

Além de tudo, some-se a estas opções as seguintes facilidades:

Operadores
  -o     OU lógico  
  Operador     Finalidade  
  Parênteses ( )     Agrupar  
  Exclamação !     Negar  
  -a     E lógico  

Ufa! Como você viu tem coisa prá chuchu, e como eu te disse no início, o nosso if é muito mais poderoso que o dos outros. Vamos ver em uns exemplos como isso tudo funciona, primeiramente testaremos a existência de um diretório:

Exemplos:

    if  test -d lmb
    then
        cd lmb
    else
        mkdir lmb
        cd lmb
    fi

No exemplo, testei se existia um diretório lmb definido, caso negativo (else), ele seria criado. Já sei, você vai criticar a minha lógica dizendo que o script não está otimizado. Eu sei, mas queria que você o entendesse assim, para então poder usar o ponto-de-espantação (!) como um negador do test. Veja só:

    if  test ! -d lmb
    then
        mkdir lmb
    fi
    cd lmb

Desta forma o diretório lmb seria criado somente se ele ainda não existisse, e esta negativa deve-se ao ponto-de-exclamação (!) precedendo a opção -d. Ao fim da execução deste fragmento de script, o programa estaria com certeza dentro do diretório lmb.

Vamos ver dois exemplos para entender a diferença comparação entre números e entre cadeias.

    cad1=1
    cad2=01
    if  test $cad1 = $cad2
    then
        echo As variáveis são iguais.
    else
        echo As variáveis são diferentes.
    fi

Executando o fragmento de programa acima vem:

     As variáveis são diferentes.

Vamos agora alterá-lo um pouco para que a comparação seja numérica:

    cad1=1
    cad2=01
    if  test $cad1 -eq $cad2
    then
        echo As variáveis são iguais.
    else
        echo As variáveis são diferentes.
    fi

E vamos executá-lo novamente:

     As variáveis são iguais.

Como você viu nas duas execuções obtive resultados diferentes porque a cadeia 01 é realmente diferente da cadeia 1, porém, a coisa muda quando as variáveis são testadas numericamente, já que o número 1 é igual ao número 01.

Exemplos:

Para mostrar o uso dos conectores -o (OU) e -a (E), veja um exemplo animal feito direto no prompt (me desculpem os zoólogos, mas eu não entendendo nada de reino, filo, classe, ordem, família, gênero e espécie, desta forma o que estou chamando de família ou de gênero tem grande chance de estar incorreto):

$ Familia=felinae $ Genero=gato $ if test $Familia = canidea -a $Genero = lobo -o $Familia = felina -a $Genero = leão > then > echo Cuidado > else > echo Pode passar a mão > fi Pode passar a mão

Neste exemplo caso o animal fosse da família canídea E (-a) do gênero lobo, OU (-o) da familia felina E (-a) do gênero leão, seria dado um alerta, caso contrário a mensagem seria de incentivo.

Pinguim com placa de dica Os sinais de maior (>) no início das linhas internas ao if são os prompts de continuação (que estão definidos na variável $PS2) e quando o Shell identifica que um comando continuará na linha seguinte, automaticamente ele o coloca até que o comando seja encerrado.

Vamos mudar o exemplo para ver se continua funcionando:

$ Familia=felino $ Genero=gato $ if test $Familia = felino -o $Familia = canideo -a $Genero = onça -o $Genero = lobo > then > echo Cuidado > else > echo Pode passar a mão > fi Cuidado

Obviamente a operação redundou em erro, isto foi porque a opção -a tem precedência sobre a -o, e desta forma o que primeiro foi avaliado foi a expressão:

     $Familia = canideo -a $Genero = onça

Que foi avaliada como falsa, retornando o seguinte:

     $Familia = felino -o FALSO -o $Genero = lobo

Que resolvida vem:

     VERDADEIRO -o FALSO -o FALSO

Como agora todos conectores são -o, e para que uma série de expressões conectadas entre si por diversos OU lógicos seja verdadeira, basta que uma delas seja, a expressão final resultou como VERDADEIRO e o then foi executado de forma errada. Para que isso volte a funcionar façamos o seguinte:

$ if test \($Familia = felino -o $Familia = canideo\) -a \($Genero = onça -o $Genero = lobo\) > then > echo Cuidado > else > echo Pode passar a mão > fi Pode passar a mão

Desta forma, com o uso dos parênteses agrupamos as expressões com o conector -o, priorizando as suas execuções e resultando:

     VERDADEIRO -a FALSO

Para que seja VERDADEIRO o resultado duas expressões ligadas pelo conector -a é necessário que ambas sejam verdadeiras, o que não é o caso do exemplo acima. Assim o resultado final foi FALSO sendo então o else corretamente executado.

Se quisermos escolher um CD que tenha faixas de 2 artistas diferentes, nos sentimos tentados a usar um if com o conector -a, mas é sempre bom lembrarmos que o bash nos dá muito recursos, e isso poderia ser feito de forma muito mais simples com um único comando grep, da seguinte maneira:

$ grep Artista1 musicas | grep Artista2

Da mesma forma para escolhermos CDs que tenham a participação do Artista1 e do Artista2, não é necessário montarmos um if com o conector -o. O egrep (ou grep -E, sendo este mais aconselhável) também resolve isso para nós. Veja como:

$ egrep (Artista1|Artista2) musicas

Ou (nesse caso específico) o próprio grep puro e simples poderia nos quebrar o galho:

$ grep Artista[12] musicas

No egrep acima, foi usada uma expressão regular, onde a barra vertical (|) trabalha como um OU lógico e os parênteses são usados para limitar a amplitude deste OU. Já no grep da linha seguinte, a palavra Artista deve ser seguida por um dos valores da lista formada pelos colchetes ([ ]), isto é, 1 ou 2.

     - Tá legal, eu aceito o argumento, o if do Shell é muito mais poderoso que os outros caretas, mas cá pra nós, essa construção de if test ... é muito esquisita, é pouco legível.

     - É você tem razão, eu também não gosto disso e acho que ninguém gosta. Acho que foi por isso, que o Shell incorporou outra sintaxe que substitui o comando test.

Exemplos:

Para isso vamos pegar aquele exemplo para fazer uma troca de diretórios, que era assim:

    if  test ! -d lmb
    then
        mkdir lmb
    fi
    cd lmb

e utilizando a nova sintaxe, vamos fazê-lo assim:

    if  [ ! -d lmb ]
    then
        mkdir lmb
    fi
    cd lmb

Ou seja, o comando test pode ser substituído por um par de colchetes ([ ]), separados por espaços em branco dos argumentos, o que aumentará enormemente a legibilidade, pois o comando if irá ficar com a sintaxe semelhante à das outras linguagens e por isso este será o modo que o comando test será usado daqui para a frente.

Querida, Encolheram o Comando Condicional

Se você pensa que acabou, está muito enganado. Repare a tabela (tabela verdade) a seguir:

Valores Booleanos E OU
 FALSO-FALSO   FALSO   FALSO 
 VERDADEIRO-VERDADEIRO   VERDADEIRO   VERDADEIRO 
 VERDADEIRO-FALSO   FALSO   VERDADEIRO 
 FALSO-VERDADEIRO   FALSO   VERDADEIRO 

Ou seja, quando o conector é E e a primeira condição é verdadeira, o resultado final pode ser VERDADEIRO ou FALSO, dependendo da segunda condição, já no conector OU, caso a primeira condição seja verdadeira, o resultado sempre será VERDADEIRO e se a primeira for falsa, o resultado dependerá da segunda condição.

Ora, os caras que desenvolveram o interpretador não são bobos e estão sempre tentando otimizar ao máximo os algoritmos. Portanto, no caso do conector E, a segunda condição não será avaliada, caso a primeira seja falsa, já que o resultado será sempre FALSO. Já com o OU, a segunda será executada somente caso a primeira seja falsa.

Aproveitando disso, criaram uma forma abreviada de fazer testes. Batizaram o conector E de && e o OU de || e para ver como isso funciona, vamos usá-los como teste no nosso velho exemplo de trocarmos de diretório, que em sua última versão estava assim:

    if  [ ! -d lmb ]
    then
        mkdir lmb
    fi
    cd lmb

Isso também poderia ser escrito da seguinte maneira:

    [ ! -d lmb ] && mkdir lmb
    cd dir

Ou ainda retirando a negação (!):

    [ -d lmb ] || mkdir lmb
    cd dir

No primeiro caso, se o primeiro comando (o test que está representado pelos colchetes) for bem sucedido, isto é, não existir o diretório lmb, o mkdir será efetuado porque a primeira condição era verdadeira e o conector era E.

No exemplo seguinte, testamos se o diretório lmb existia (no anterior testamos se ele não existia) e caso isso fosse verdade, o mkdir não seria executado porque o conector era OU. Outra forma:

     cd lmb || mkdir lmb

Neste caso, se o cd fosse mal sucedido, seria criado o diretório lmb mas não seria feito o cd para dentro dele. Para executarmos mais de um comando desta forma, é necessário fazermos um grupamento de comandos, e isso se consegue com o uso de chaves ({ }). Veja como seria o correto:

    cd lmb ||
        {
        mkdir lmb
        cd lmb
        }

Ainda não está legal, porque caso o diretório não exista, o cd dará a mensagem de erro correspondente. Então devemos fazer:

    cd lmb 2> /dev/null ||
        {
        mkdir lmb
        cd lmb
        }

Como você viu o comando if nos permitiu fazer um cd seguro de diversas maneiras. É sempre bom lembrarmos que o seguro a que me referi é no tocante ao fato de que ao final da execução você sempre estará dentro de lmb, desde que você tenha permissão entrar em lmb, permissão para criar um diretório em ../lmb, haja espaço em disco, ...

E tome de test

Ufa! Você pensa que acabou? Ledo engano! Ainda tem uma forma de test a mais. Essa é legal porque ela te permite usar padrões para comparação. Estes padrões atendem às normas de Geração de Nome de Arquivos (File Name Generation, que são ligeiramente parecidas com as Expressões Regulares, mas não podem ser confundidas com estas). A diferença de sintaxe deste para o test que acabamos de ver é que esse trabalha com dois pares de colchete da seguinte forma:

[[ expressão ]]

Onde expressão é uma das que constam na tabela a seguir:

Expressões Condicionais Para Padrões
  expr1 ¦¦ expr2     "OU" lógico, verdadeiro se expr1 ou expr2 for verdadeiro  
  Expressão     Retorna  
  cadeia == padrão
  cadeia1 = padrao  
  Verdadeiro se cadeia1 casa com padrão  
  cadeia1 != padrao     Verdadeiro se cadeia1 não casa com padrao.  
  cadeia1 < cadeia1     Verdadeiro se cadeia1 vem antes de cadeia1 alfabeticamente.  
  cadeia1 > cadeia1     Verdadeiro se cadeia1 vem depois de cadeia1 alfabeticamente  
  expr1 && expr2     "E" lógico, verdadeiro se ambos expr1 e expr2 são verdadeiros  

$ echo $H 13 $ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora inválida Hora inválida $H=12 $ [[ $H == [0-9] || $H == 1[0-2] ]] || echo Hora inválida $

Neste exemplo, testamos se o conteúdo da variável $H estava compreendido entre zero e nove ([0-9]) ou (||) se estava entre dez e doze (1[0-2]), dando uma mensagem de erro caso não fosse.

Exemplos:

Para saber se uma variável tem o tamanho de um e somente um caractere, faça:

$ var=a $ [[ $var == ? ]] && echo var tem um caractere var tem um caractere $ var=aa $ [[ $var == ? ]] && echo var tem um caractere $

Como você pode imaginar, este uso de padrões para comparação, aumenta muito o poderio do comando test. No início deste papo, antes do último chope, afirmamos que o comando if do interpretador Shell é mais poderoso que o seu similar em outras linguagens. Agora que conhecemos todo o seu espectro de funções, diga-me: você concorda ou não com esta assertiva?

Acaso Casa com case

Vejamos um exemplo didático: dependendo do valor da variável $opc o script deverá executar uma uma das opções: inclusão, exclusão, alteração ou fim. Veja como ficaria este fragmento de script:

    if  [ $opc -eq 1 ]
    then
        inclusao
    elif [ $opc -eq 2 ]
    then
        exclusao
    elif [ $opc -eq 3 ]
    then
        alteracao
    elif [ $opc -eq 4 ]
    then
        exit
    else
        echo Digite uma opção entre 1 e 4
    fi

Neste exemplo você viu o uso do elif com um else if, esta á a sintaxe válida e aceita, mas poderíamos fazer melhor, e isto seria com o comando case, que tem a sintaxe a seguir:

    case $var in
        padrao1) cmd1
                 cmd2
                 cmdn ;;
        padrao2) cmd1
                 cmd2
                 cmdn ;;
        padraon) cmd1
                 cmd2
                 cmdn ;;
    esac

Onde a variável $var é comparada aos padrões padrao1, ..., padraon e caso um deles atenda, o bloco de comandos cmd1, ..., cmdn correspondente é executado até encontrar um duplo ponto-e-vírgula (;;), quando o fluxo do programa se desviará para instrução imediatamente após o esac.

Na formação dos padrões, são aceitos os seguintes caracteres:

Caracteres Para Formação de Padrões
¦   OU lógico  
  Caractere     Significado  
*   Qualquer caractere ocorrendo zero ou mais vezes  
?   Qualquer caractere ocorrendo uma vez  
[...]   Lista de caracteres  

Para mostrar como fica melhor, vamos repetir o exemplo anterior, só que desta vez usaremos o case e não o if ... elif ... else ... fi.

    case $opc in
        1) inclusao ;;
        2) exclusao ;;
        3) alteracao ;;
        4) exit ;;
        *) echo Digite uma opção entre 1 e 4
    esac

Como você deve ter percebido, eu usei o asterisco como a última opção, isto é, se o asterisco atende a qualquer coisa, então ele servirá para qualquer coisa que não esteja no intervalo de 1 a 4. Outra coisa a ser notada é que o duplo ponto-e-vírgula não é necessário antes do esac.

Exemplos:

Vamos agora fazer um script mais radical. Ele te dará bom dia, boa tarde ou boa noite dependendo da hora que for executado, mas primeiramente veja estes comandos:

$ date Tue Nov 9 19:37:30 BRST 2004 $ date +%H 19

O comando date informa a data completa do sistema, mas ele tem diversas opções para seu mascaramento. Neste comando, a formatação começa com um sinal de mais (+) e os caracteres de formatação vêm após um sinal de percentagem (%), assim o %H significa a hora do sistema. Dito isso vamos ao exemplo:

$ cat boasvindas.sh #!/bin/bash # Programa bem educado que # dá bom-dia, boa-tarde ou # boa-noite conforme a hora Hora=$(date +%H) case $Hora in 0? | 1[01]) echo Bom Dia ;; 1[2-7] ) echo Boa Tarde ;; * ) echo Boa Noite ;; esac exit

Peguei pesado, né? Que nada vamos esmiuçar a resolução caso-a-caso (ou seria case-a-case? smile )

0? | 1[01] - Significa zero seguido de qualquer coisa (?), ou (|) um seguido de zero ou um ([01]) ou seja, esta linha pegou 01, 02, ... 09, 10 e 11;

1[2-7]     - Significa um seguido da lista de dois a sete, ou seja, esta linha pegou 12, 13, ... 17;

*          - Significa tudo que não casou com nenhum dos padrões anteriores.

     - Cara, até agora eu falei muito e bebi pouco. Agora eu vou te passar um exercício para você fazer em casa e me dar a resposta da próxima vez que nos encontrarmos aqui no botequim, tá legal?

     - Tá, mas antes informe ao pessoal que está acompanhando este curso conosco como eles podem te encontrar para fazer críticas, contar piada, convidar para o chope, curso ou palestra ou até mesmo para falar mal dos políticos.

     - É fácil, meu e-mail é julio.neves@gmail.com, mas pare de me embromar que eu não vou esquecer de te passar o script para fazer. É o seguinte: quero que você faça um programa que receberá como parâmetro o nome de um arquivo e que quando executado salvará este arquivo com o nome original seguido de um til (~) e colocará este arquivo dentro do vi (o melhor editor que se tem notícia) para ser editado. Isso é para ter sempre a última cópia boa deste arquivo caso o cara faça alterações indevidas. Obviamente, você fará as críticas necessárias, como verificar se foi passado um parâmetro, se o arquivo passado existe, ... Enfim, o que te der na telha e você achar que deve constar do script. Deu prá entender?

     - Hum, hum...

     - Chico! Traz mais um sem colarinho que o cara aqui já está dando para entender! smile

-- HumbertoPina - 05 Oct 2006

 
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Wiki-SL? Send feedback