La estructura condicional (IF-ELSE) 

La estructura IF-ELSE permite establecer una bifurcación o alternativa dentro de una secuencia de ordenes. Es decir, en ocasiones es posible que deseemos que el programa ejecute una instrucción o instrucciones, pero solo si se cumple determinada circunstancia, y, en caso contrario, o bien no hacer nada, o bien ejecutar otras instrucciones diferentes. 

Por ejemplo, queremos hacer un alias que a intervalos de un minuto mida nuestro lag, y solo si este supera los 15 segundos nos envíe un mensaje a la pantalla de Status avisándonos de cuanto lag tenemos. Esto no es posible hacerlo mediante una secuencia lineal de instrucciones; es preciso que el programa discierna en algún momento si procede o no ejecutar la orden de imprimir un mensaje. Esta posibilidad es la que nos facilita la estructura IF. 

En definitiva, IF comparará valores, y ejecutará o no diferentes instrucciones, en función del resultado de la comparativa. 

El formato general completo de la estructura IF es el siguiente: 

if (Valor_1 operador Valor_2) { comandos } 
elseif (Valor_1 operador Valor_2) { comandos } 
else { comandos }
La orden if comparará Valor_1 y Valor_2 mediante un operador de comparación. En función de esta comparación ejecutará o no el comando o comandos incluidos dentro de las llaves. Por ejemplo: 
if (%Variable_1 > %Variable_2) { 
echo -s Atención, la primera variable es mayor que la segunda !!! 
splay c:\sonidos\alarma.wav 
}
Esta orden compara del contenido de dos variables, y solo en caso de que la primera variable sea mayor que la segunda enviará un mensaje a la pantalla de Status, y hará sonar un sonido Wav que supuestamente tenemos dentro de un directorio de la unidad C: llamado "sonidos". 

Obsérvese que la condición del if se debe de poner entre paréntesis, y las instrucciones internas a ejecutar estarán encerradas entre llaves (si solo hay una instrucción no son necesarias las llaves). 

Como se puede ver en la sintaxis general del if, junto este se pueden emplear otras dos instrucciones: elseif y else, aunque estas solo de forma opcional. Si podemos leer la sintaxis de IF de la siguiente forma:  

 
Si ( pasa esto ) { Haz esto } 
 
la del elseif equivaldrá a:  
 
En caso contrario, si ( pasa esto ) { Haz esto }.
 
El anexo else es una posibilidad que permite ejecutar una serie de instrucciones en caso de que lo anterior no se haya producido. Las instrucciones comprendidas dentro del else se ejecutarán siempre que no hay resultado cierta la condición del if ni, de existir, la del elseif. Si no se especifica un else, el script sencillamente continuará a desde la instrucción siguiente al último "}", o bien terminará si no hay nada más. 

Es perfectamente posible "anidar" instrucciones if, es decir, incluir más if’s dentro del bloque de instrucciones de un if. Por ejemplo, queremos hacer un alias que se llame "números". Este, al ejecutarse, nos pedirá tres números cualesquiera que cargará en tres variables, a continuación evaluará cual es el mayor de los tres y nos lo imprimirá en la ventana de Status. Podríamos hacer algo como lo siguiente: 

    /números { 
    set %A $$?="Introduce el primer número" 
    set %B $$?="Introduce el segundo número" 
    set %C $$?="Introduce el tercer número" 
    if ( %A > %B ) { 
      if ( %A > %C ) { echo -s El mayor es %A } 
      else { echo -s El mayor es %C } 
      }
    } 
    elseif ( %B > %C ) { echo -s El mayor es %B } 
    else { echo -s El mayor es %C } 
    unset %A %B %C
Los operadores de comparación que podemos utilizar dentro de la condición de un if son los siguientes: 
 
 
A == B A Igual a B
A != B A distinto de B
A < B A menor que B
A > B A mayor que B
A >= B A mayor o igual que B
A <= B A menor o igual que B
A // B A es múltiplo de B
A\\B A no es múltiplo de B
A isin B La cadena de caracteres A se encuentra incluida dentro de la cadena B
A iswm B La cadena A es idéntica a la cadena B
A isnum B A es un número incluido dentro de la cadena de números B. Si no se pone B se evalúa simplemente si A es un número
A isletter B Igual al anterior pero con letras en lugar de números
A ison B El nick A está en el canal B
A isop B El nick A es operador en el canal B
A isvo B El nick A tiene voz en el canal B
A ischan A está en este momento en el mismo canal que nosotros
A isauto B El nick A está en muestra lista de auto-op para el canal B (B opcional)
A isignore A está en nuestra lista de ignorados
A isprotect B A está en nuestra lista de protegidos en el canal B (B opcional)
A isnotify A está en nuestra lista de notify
  
  
En esta tabla se han usado, para hacerla más comprensible, los operándos genéricos A y B; en su lugar podemos usar valores numéricos, cadenas de caracteres, variables (identificándolas con su nombre precedido del símbolo %), o identificadores (con su nombre precedido del símbolo $). 

Si anteponemos el símbolo ! delante de cualquiera de los operadores de la tabla anterior este será negado, es decir, la condición se evaluará como cierta no cuando suceda eso, sino cuando no suceda. 

Hasta ahora hemos visto como la estructura if puede evaluar una condición simple; no obstante es también posible crear condiciones complejas combinando varias con o operadores lógicos. El mIRC admite dos tipos de operadores lógicos para enlazar entre sí dos o mas condiciones simples formando así una sola condición múltiple: 

  • Operador AND (&&). En castellano "y":
Si (( pasa esto ) y ( esto ) y ( además esto )) { Haz esto }

Por ejemplo: 

if (( $me !iswm SomaTic ) && ( $me isop #ayuda_irc )) { mode $me -o #ayuda_irc }

Esta instrucción comprobará si mi nick es distinto de SomaTic, y además si tengo el estatus de operador dentro del canal #ayuda_irc, de suceder ambas cosas me retirará dicho estatus. 

  • Operador OR ( || ). En castellano "o":
Si (( pasa esto ) o ( esto ) o ( esto otro )) { Haz esto }

Por ejemplo: 

if (( %A > 20 ) || ( %B < 10 )) { echo -s Variable fuera de rango }

Esta orden comprobará que la variable %A contiene un número en el rango [10-20] , en caso contrario manda al status un aviso. 
 
 
EL COMANDO "goto" 

El uso del comando goto es un recurso muy útil en especial cuando se utiliza desde dentro de una estructura if. La sintaxis de este comando es: 

 
goto <etiqueta>
 
La orden goto provoca un salto automático dentro de la secuencia que el programa utiliza para leer las líneas de un script, pasando directamente a leer a partir de una determinada etiqueta, las líneas que continúan a partir de esta. Una etiqueta no es más que una palabra que ocupa una línea del script, y que se identifica como tal por tener el símbolo ":" delante. La llamada a una etiqueta desde la orden goto no debe de llevar los dos puntos delante. 
 
Ejemplo: 
    /CargaVar { 
      
    :PideDato 
      set %valor $$?="Introduzca un número entre 0 y 9" 
      if (( %valor < 0 ) || ( %valor > 9 )) { 
        echo -a Dato erróneo, introduzca solo un dígito entre 0 y 9 
        goto PideDato
      }
    }
Este alias es una sencilla rutina que nos permite aceptar valores para una variable, depurando que solo se introduzca un dígito entre 0 y 9, de no ser así el alias volverá una y otra vez a la etiqueta PideDato solicitando un nuevo valor para la variable. 

EJEMPLOS:  

1- El siguiente alias nos presentará la lista de operadores del canal en que nos encontramos en este momento. Se puede observar el empleo de la instrucción de salto incondicional (goto), el uso del parámetro $nick(canal,numero), el comando inc(%variable), y la estructura if. 

    /listaOPs { 
      echo -a * Listando Operadores en # 
      set %i 1 
      :sigue 
      set %nick $nick(#,%i) 
      if ( %nick == $null ) { goto final } 
      if ( %nick isop # ) { echo 3 %nick is un Op! } 
      inc %i ;(Se incrementa en uno la variable %i) 
      goto sigue 
      :final 
      echo -a * Fin de la lista de operadores de #.
    }
2- Este ejemplo presenta un alias que imprimirá en la pantalla de Status una tabla de los caracteres ASCII entre el 33 y el 241 ambos inclusive. 
    /TablASCII { 
      set %num 33 
      echo -s Tabla ASCII 
      :presenta 
      if ( %num > 241 ) { goto fin } 
      echo -s $chr( %num ) es el carácter ASCII carácter ASCII número: %num 
      inc %num 
      goto presenta 
      :fin 
      echo -s Fin de la tabla.
    }
 
 

Pulsar Aqui para volver al Bazar

Pulsar Aqui para volver a Eventos