ahora presentaremos los diferentes comandos tratados por el script. Estos comandos se dividen por tareas.
Todos los comandos enviados a shellmod se hacen a parir del comando de shell echo (mostrar). Siempre tienen este aspecto:
echo command arg1 arg2 arg3
Los argumentos son tanto simples como múltiples palabras (separadas por
blancos). Para agrupar múltiples palabras como un único argumento, se puede
utilizar las comillas. Aunque ésta sea la práctica estándar de dicha línea de
comando, tiene un inconveniente: usar comillas sólo afectará al argumento tal
y como se ve mediante el comando echo
. Una vez procesado, la línea
entera se recibirá como una cadena de palabras separadas por blancos y las
comillas desaparecerán. Las comillas deben ser parte de la línea recibida por
shellmod. Aquí hay un ejemplo:
echo newf_str name \"Introduzca su nombre\" \"Tux el pingüino\"
shellmod-lib.sh define la función de ayuda qecho
que puede usar para
obtener un comportamiento más estándar de las comillas de shell. Aquí aparece el
mismo ejemplo reescrito pero conqecho
.
qecho newf_str name "Introduzca su nombre" 'Tux el pingüino'
Como puede observar, con qecho
puede mezclar las distintas
sintaxis de comillas de shell. La función qecho
se asegura de que
tenga las comillas dobles correspondientes en todos los argumentos.
Los scripts de shell no son tan buenos soportando y pasando texto en formato multi-línea. El comando defval se creó para corregir este defecto. Aquí tenemos un uso típico:
echo var1 "Esta es la primera línea"
echo var1 "Esta es la segunda línea"
echo error =var1
Ésto crea un mensaje emergente de error con dos líneas. "defval"se usa repetidamente para definir el texto multi-línea y se relaciona como un argumento, usando el signo =. El argumento no deber estar entre comillas, así que no puede usar la función de ayuda qecho cuando utilice un parámetro defvar, ya que, qecho se asegura de todos los parámetros estén entre comillas.
Un diálogo siempre empieza con este comando. No requiere muchos argumentos. Después lo arregla con definiciones de campo, añade botones opcionales y entonces llama a la función edit. Aquí hay un ejemplo:
echo DIALOG
echo newf_str var \"Campo de título\" value
edho edit \"Título de diálogo\" \"Introducción de diálogo\"
dispatch
echo end
Esto funciona como "edit", muestra diálogos con los mismos argumentos. Pero termina inmediatamente. Esto se usa generalmente con el comando newf_gauge.
Ésto cede el control a Linuxconf/shellmod y espera los resultados. Las variables de campo son traducidas y actualizadas y la variable CODE se configura con el valor del botón seleccionado por el usuario, ya sea "Aceptar"o "Cancelar".
Ésto elmina el cuadro. Se borra de la pantalla y se olvida. A veces usamos el comando end justo después del comando dispatch, pero en cuadros más complicados puede usar el comando end después de un bucle de verificación.
#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
main(){
echo DIALOG
echo newf_str name \"Nombre de usuario\"
while true
do
echo edit \"Pregunta de usuario\" \"Introduzca su nombre de usuario\"
dispatch
if [ "$CODE" = "cancelar" ] ; then
break
elif [ "$name" = "" ] ; then
echo error \"Por favor, introduzca un nombre\"
else
echo notice \"Haciendo lo que sea con la cuenta de usuario\"
break
fi
done
echo end
}
dispatch
Esto está contemplado por DIALOG_MENU y por los comandos new_menuitem.
No requiere ningún argumento.
Esto almacena una entrada de menú. Cada entrada del menú se asocia a una función script (que debe estar definida). La señal es generalmente una clave. El título es el resto de la entrada del menú.
Esto muestra el menú seguida de una llamada a dispatch.
Aquí es donde se acaba todo lo relacionado con el menú. La función duspatch se ejecutará hasta que el usuario aprete el botón "salir" (quit). La correspondiente función será llamada en el momento que se selecciones una entrada de menú, cosa que se realiza de forma transparente por dicha función.
Nótese que la función dispatch también termina si el usuario selecciona botones opcionales (añadidos con el comando button). Así que es posible gestionar esto en un bucle como el anterior.
Esto borra el menú.
#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
menufunc1(){
echo notice \"menufunc1 seleccionado\"
}
menufunc2(){
echo notice \"menufunc2 seleccionado\"
}
main(){
echo DIALOG_MENU
echo new_menuitem menufunc1 Select \"Primera opción\"
echo new_menuitem menufunc2 \"\" \"Segunda opción\"
echo editmenu \"Main menu\" \"Elegir una opción\"
dispatch
echo end
}
dispatch
Un DIALOG_LIST es sólo una variación de un menú. La diferencia principal estriba en que el número de la entrada puede ser muy largo. En tal caso un diálogo de filtro aparecerá y restringirá la cantidad de copias mostrada. Puede llegar a tener listas enormes de items.
DIALOG_LIST no requiere ningún argumento.
Puede definir el encabezado de la lista. Esto es opcional pero es resultón.
Funciona como DIALOG_MENU salvo que se suelen proporcionar más columnas. Existe otra variación ya que la función está definida con argumentos. Nótese que esto puede ser usado con DIALOG_MENU también. Generalmente definimos una función por entrada de menú y una única función para procesar cada copia de la lista, usando el argumento para diferenciar el proceso.
Nótese también que se puede usar una solución mixta dentro del mismo DIALOG_MENU o DIALOG_LIST: puede usar una única función para proveer un proceso común para algunas copias y diferentes funciones para gestionar cada excepción.
Lo mismo que con DIALOG_MENU.
Se comporta como DIALOG_MENU.
Borra la lista.
Aquí hay un verdadero ejemplo donde se muestra un directorio y
se permite al usuario elegir un archivo y hacer algo con él.
Vemos en el ejemplo cúan sencillo es analizar la salida del
comando "ls -l
" y presentar el nombre de archivo, el
tamaño y la data de revisión en tres columnas con formato.
#!/usr/bin/shellmod
. /usr/lib/linuxconf/lib/shellmod-lib.sh
fileshow(){
echo notice \"Procesando archivo $1\"
}
main(){
echo DIALOG_LIST
echo newf_head \"Nombre de archivo\" Tamaño \"Fecha de revisión\"
ls -l $1 | \
(
read total
while read perm count user group size month day hour name
do
echo new_menuitem \"fileshow $name\" $name $size \"$month $day $hour\"
done
)
echo editmenu \"Directorio Actual\" \"Esto muestra todos los archivos en el directorio actual\"
dispatch
echo end
}
dispatch
Todos los comandos que definen un campo de diálogo empiezan con el prefijo
newf_
. Hemos usado el mismo nombre y el mismo orden de parámetros
(cuando ha sido posible) como en el módulo de C++ API.
El primer argumento es siempre el nombre de la variable shell que recibirá el valor introducido por el usuario. A menudo se usará el siguiente contructor para editar (corregir el valor actual) de una variable dada.
qecho newf_str var "título" "$var"
.
qecho edit ...
dispatch
if [ "$CODE" = "aceptar" ] ; then
if [ "$var" = "..." ] ;then
.
.
fi
fi
Aquí hay una lista de todos los comandos de campos de definición:
Configure un campo de una casilla de verificación (on/off o sí/no). La variable var se configurará a 0 o 1. Este campo tiene dos títulos. Uno a la izquierda de la casilla de comprobación y otro a la derecha. Esto a menudo se usa como sigue:
La siguiente característica [] está seleccionada
Cuand use newf_chk, debe pasar 0 o 1 como valor. La variable edit recibirá el resultado como 0 o 1. Esto no es útil ya que a menudo los shell script trabajan con diferentes tipos de valores booleanos. Por ejemplo, un script que trata con un servidor SQL puede encontrar que debe lidiar con valores Y y N. Para evitar tener que traducir de un sistema a otro se amplió la sintaxis referente al valor inicial.
value:on_value:off_value
Así que, si su aplicación trabaja con valores ON/OFF, puede especificar
el valor inicial como sigue:
$var:ON:OFF
No solo se aceptará ON y OFF sinó que el resultado se enviará en
este mismo formato, usando una de las dos palabras.
Configurar múltiples campos de selección usando casillas de verificación. Las casillas se presentan horizontalmente. Aquí hay un ejemplo seguido del campo que produce en modo texto:
echo newf_chkm sel \"Qué posición\" 1 left center right
Produciendo:
Qué posición ( ) left (o) center ( ) right
La variable var tomará el índice numérico del item sleccionado, empezando desde 0.
Configurar una única línea + slector de campo. El usuario será capaz de elegir un valor de entre una lista o introducir uno a mano. La variable var contendrá el valor literal introducido o seleccionado.
newf_combo se usa con el comando comboitem. Primero debe configrar el campo de edición del combo y después pasar uno a uno los posibles valores usando comboitem. Nótese que los valores van seguidos de un texto explicativo (opcional). Aquí hay un ejemplo de código:
echo newf_combo port \"Qúe puerto\" ttyS1
echo comboitem ttyS0 \"COM1 en DOS\"
echo comboitem ttyS1 \"COM2 en DOS\"
echo comboitem ttyS2 \"COM3 en DOS\"
La variable $port tomará los valores ttyS0, ttyS1, ttyS2 o cualquier otro valor que el usuario quiera darle. Véase newf_enum y newf_list para una variación de este campo de entrada.
Configurando un campo de entrada numérico con notación decimal. Se escribe
así
newf_num
salvo por la coma decimal
que está permitida. El número de parámetro decimal controla el número de
dígitos decimales permitidos después de la coma así como el formato del
campo.
Configurando un selector de campo. El usuario puede elegir un valor de entre una lista. La variable var contendrá el índice del ítem seleccionado. El usario se limita a escoger un item de la lista.
newf_enum se usa con el comando menuitem. Primero configure el campo enum y entonces pase uno a uno los posibles valores usando enumitem. Aquí hay un ejemplo de código:
echo newf_enum no \"Qué puerto\" 1
echo enumitem ttyS0 \"COM1 en DOS\"
echo enumitem ttyS1 \"COM2 en DOS\"
echo enumitem ttyS2 \"COM3 en DOS\"
La variable $no tomará el valor 0, 1 o 2. Vea newf_combo y newf_list para variar un campo de entrada.
Configurar un indicador gráfico, generalmente para mostrar el estado de progresión de un proceso (cargando, instalando). El estado del indicador se cambia utilizando de nuevo este comando. La primera llamada define el campo y la siguiente actualiza el indicador. Este widget se usa generalmente con el comando "show" para que el script nunca pare en el estado "edit". Aquí mostramos un pequeño ejemplo:
echo DIALOG
qecho newf_gauge ID "Estado" 0 10
qecho show "Estado" ""
i=0
while [ "$i" != "10" ] ; do
i=`expr $i + 1`
sleep 1
qecho newf_gauge ID "Estado" $i 10
qecho show "Estado" ""
done
Configurando un campo de entrada numérico (entero). Funciona así:
newf_num
pero acepta dígitos y dígitos hexadecimales.
Configurando un selector de campo. El usuario podrá escoger un valor de entre una lista. La variable var contendrá el valor literal seleccionado.
newf_list se usa con el comando listitem. Primero configure el campo de la lista y después pase uno a uno los posibles valores usando listitem. Nótese que los valores van seguidos de un texto explicativo (opcional). Aquí hay un ejemplo de código:
echo newf_list port \"Qué puerto\" ttyS1
echo listitem ttyS0 \"COM1 en DOS\"
echo listitem ttyS1 \"COM2 en DOS\"
echo listitem ttyS2 \"COM3 en DOS\"
La variable $port tomará los valores ttyS0, ttyS1 or ttyS2. Vea newf_enum y newf_combo para variar el campo de entrada.
Configurar un campo de entrada numérico (entero). Funciona como
newf_str
pero sólo acepta dígitos.
Configurando un campo de contraseña. Funciona como un campo newf_str
pero la entrada no se muestra (escritura invisible).
Configurando un campo de botón radio. Algunos campos de botones radio deben ser definidos para cada posible selección. Todos estos botones comparten las mismas variables de entrada (var de arriba) y operan conjuntamente. La variable var tomará el valor numérico del campo del botón radio seleccionado.
Los botones radio que estén relacionados pueden colocarse en cualquier lugar del diálogo. No necesitan estar de forma secuencial o incluso en la misma página del cuadro de diálogo de libreta.
Funciona como newf_num para editar un valor decimal, pero se muestra como un proyector de diapositivas gráfico. El valor máximo y mínimo representan el extremo izquierdo y el derecho del proyector.
qecho newf_slider var "Hora de la cita" 15 9 16
Configurar una entrada de línea de texto.
Esto no es un campo de entrada sinó una manera de organizar un diálogo grande en la sección. Es lresultado final es bien distinto en modo gráfico qu en texto y HTML. En el primero, creará un diálogo de bloc de notas y cada newf_title define una página de la libreta.
El primer argumento, título del bloc, sólo se usa en modo gráfico.
El segundo argumento es un número y representa el nivel del bloc de notas. Ésto permite diálogos muy complejos con bloc de notas dentro de los mismos. En modo texto y HTML, este argumento no tiene efecto.
El último argumento, título en modo texto, aparece centrado entre dos campos de entrada.
Puede añadir botones opcionales simplemente usando el comndo button. Requiere dos argumentos. El primero es la Id del botón que se pasará al script la variable CODE. El segundo es la etiqueta (título) del botón. Aquí hay un ejemplo:
echo DIALOG
echo newf_str name \"Nombre de usuario\" $name
echo button Agregar \"Agregar un nuevo usuario\"
echo edit "título" \"Gestión de usuarios\"
dispatch
echo end
if [ "$CODE" = "Agregar" ] ; then
# Añadir un nuevo usuario
elif [ "$CODE" = "aceotar" ] ; then
# Inspeccionar apariciones anteriores de usuario
fi
El opcode "setcurfield" ajusta la zona activa del teclado hacia un determinado campo. Debe pasar la ID del campo como un único argumento. Aquí tiene un ejemplo:
qecho DIALOG
qecho newf_str uid "id de usuario"
qecho newf_str name "Nombre"
qecho newf_str phone "Nombre"
qecho setcurfield name
qecho edit "ejemplo" "La zona activa está sobre el nombre"
dispatch
echo end