SCRIPTING
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:
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.
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.
}
<---Atrás
|