elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  ¿Me puedes ayudar a simplificar una sentencia test en bash?...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Me puedes ayudar a simplificar una sentencia test en bash?...  (Leído 3,138 veces)
chuck3501

Desconectado Desconectado

Mensajes: 4


Ver Perfil
¿Me puedes ayudar a simplificar una sentencia test en bash?...
« en: 29 Mayo 2011, 20:55 pm »

Hola qué tal... soy nuevo por este foro... y estoy aquí peleándome  con un shell-script, el cual me funciona perfectamente. Sólo que tengo que utilizar esta sentencia "test" en un if/then y no estoy muy contento con la forma que le he dado... Básicamente dice " si califr[$k] es igual a c ó x ó l" ....
¿ Me puedes ayudar a escribirla de otra manera más simple ? lo mismo no se puede.... ¿qué opinas?

[ ${califr[$k]} = c -o ${califr[$k]} = x -o ${califr[$k]} = l ]

Muchas gracias por interesate y por tu tiempo...

Un saludo!!.


En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: ¿Me puedes ayudar a simplificar una sentencia test en bash?...
« Respuesta #1 en: 29 Mayo 2011, 21:43 pm »

Un ejemplo:
Código
  1. calif="h"
  2.  
  3. if test $calif = "1" -o $calif = "x" -o $calif = "l"
  4. then
  5. echo -e "Se cumple la condición";
  6. else
  7. echo -e "No se cumple";
  8. fi
  9.  

que es equivalente a :

Código
  1. calif="c"
  2.  
  3. test $calif = "c" -o $calif = "x" -o $calif = "l" && {
  4.  
  5. echo -e "Se cumple la condición";
  6. } || {
  7. echo -e "No se cumple";
  8. }
  9.  

que es equivalente a:

Código
  1. calif="x"
  2. echo $calif | grep "^c\|l\|x$" &> /dev/null && echo Bien || echo Mal
  3.  

¿Para qué haces esto?
¿Una tarea de un profesor?


« Última modificación: 29 Mayo 2011, 21:48 pm por Leo Gutiérrez. » En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
chuck3501

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: ¿Me puedes ayudar a simplificar una sentencia test en bash?...
« Respuesta #2 en: 29 Mayo 2011, 21:56 pm »

Gracias por contestar Leo... El caso es que la forma de la sentencia test sigue siendo la misma...es decir, se vuelve a especificar la igualdad 3 veces : si calif=l ó calif=x ó calif=c...... ta ta ta.....
Yo quisiera algo así : "si calif= "l" ó "x" ó "c" ... ta ta ta...."...... osea... no tener que concretar la igualdad 3 veces....
En fin, parece que tiene que ser así... no se.....

Muchas gracias!!
En línea

chuck3501

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: ¿Me puedes ayudar a simplificar una sentencia test en bash?...
« Respuesta #3 en: 29 Mayo 2011, 21:58 pm »

Vaya.... te he estado contestando mientras añadías cosas a tu respuesta...... estoy leyendoo...
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: ¿Me puedes ayudar a simplificar una sentencia test en bash?...
« Respuesta #4 en: 29 Mayo 2011, 22:08 pm »

La sintaxis así es, no se puede cambiar, o utiliza las demás simplificaciones que puse.
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
chuck3501

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: ¿Me puedes ayudar a simplificar una sentencia test en bash?...
« Respuesta #5 en: 29 Mayo 2011, 22:22 pm »

No terminan de adaptarse tus soluciones a mi intención... todo mi "problema" se centra en la sentencia test ... solo quiero simplificarla..... y no es vital hacerlo... es ya saber cómo hacerlo si se puede....
Te mereces ver el supercódigo que he creado...... y buen tino.... es una "calculadora" adaptada a una prueba concreta para los alumnos... ;)... ahí va... a ver si ves alguna manera de simplificar la línea que puse en el primer post... Lo suelo arrancar mandando la salida de errores a /dev/null....

Al margen del asunto principal... si ves alguna "catetada" en el código, puedes comentarme lo que te parezca... solo quiero ir mejorando poco a poco....

#!/bin/bash

b=s

while [ $b = s ]

do
        clear
        r=(20 30 40 50 70 30 50 60 70 80)
        o=(30 40 50 30 40 50 50 60 70 80)
        califr=(n n n n n n n n n n)
        califo=(n n n n n n n n n n)

        for k in 0 1 2 3 4 5 6 7 8 9
        do
                until [ ${califr[$k]} = c -o ${califr[$k]} = x  -o ${califr[$k]} = l ] #ESTO NO ME GUSTA ASI
                do
                        echo -n "CALIFICACION Ritmo $((k+1)):"
                        read califr[$k]
                        if [ ${califr[$k]} != c -a ${califr[$k]} != x -a ${califr[$k]} != l ]
                        then
                                echo 'TE HAS EQUIVOCADO!!!.... REPITE ESTE DATO!!!'
                        fi
                done
        done
        echo ${califr
  • }
        echo
        for k in 0 1 2 3 4 5 6 7 8 9
        do
                until [ ${califo[$k]} = c -o ${califo[$k]} = x -o ${califo[$k]} = l ]
                do
                        echo -n "CALIFICACION Oido $((k+1)):"
                        read califo[$k]
                        if [ ${califo[$k]} != c -a ${califo[$k]} != x -a ${califo[$k]} != l ]
                        then
                                echo 'TE HAS EQUIVOCADO!!!.... REPITE ESTE DATO!!!'
                        fi
                done
        done
        echo ${califo
  • }
        echo
        for k in 0 1 2 3 4 5 6 7 8 9
        do
                case ${califr[$k]} in
                        c) califr_n[$k]=${r[$k]};;
                        x) califr_n[$k]=0;;
                        l) califr_n[$k]=$((${r[$k]}/2));;
                esac
        done
        echo PARCIAL DE RITMO:
        echo ${califr_n
  • }
        echo
        for k in 0 1 2 3 4 5 6 7 8 9
        do
                case ${califo[$k]} in
                        c) califo_n[$k]=${o[$k]};;
                        x) califo_n[$k]=0;;
                        l) califo_n[$k]=$((${o[$k]}/2));;
                esac
        done
        echo PARCIAL DE OIDO:
        echo ${califo_n
  • }
        echo
        sum_rit=0
        for k in 0 1 2 3 4 5 6 7 8 9
        do
                sum_rit=$((sum_rit+califr_n[$k]))
        done
        echo "SUMA TOTAL DE RITMO ES: $sum_rit"
        sum_oid=0
        for k in 0 1 2 3 4 5 6 7 8 9
        do
                sum_oid=$((sum_oid+califo_n[$k]))
        done
        echo "SUMA TOTAL DE OIDO ES: $sum_oid"
        suma_tot=$((sum_rit+sum_oid))
        echo
        echo "****************************"
        echo "LA SUMA TOTAL ES: $suma_tot"
        echo "****************************"
        echo
        echo -n "¿OTRO ALUMNO? (s/n): "
        read b
done
exit
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines