Línea de Comandos. Parámetros en Lua
#!/usr/bin/lua
print (#arg, " Parameters...")
for i= 1, #arg, 1 do
print ("Parameter ", i, ": ", arg[i])
end
if #arg ~= 1 then
print ("Just one Parameter Please")
os.exit (-1)
end
print ("Hello ", arg[1])
Lua almacena todos los valores, incluido el nombre del programa en un
array especial llamada arg. El operador #, que
nos devuelve el tamaño de una tabla, nos permite fácilmente obtener el
numero de parámetros recibidos.
Como en otros muchos lenguajes, esta tabla es una copia de los
valores que representa y por lo tanto no es posible cambiar el nombre
del proceso modificando arg[0] como sucede en otros
lenguajes.
Para poder modificar el nombre del programa en este caso debemos usar la llamada al sistema
prctly la operaciónPR_SET_NAME, si bien esto solo cambia el nombre de la hebra que lo llama.Para poder hacer eso es necesario escribir una extensión C para hacer la llamada al sistema, o utilizar LuaJIT que ofrece por defecto la librería FFI (Foreigner Function Interface) que nos permite hacer la llamada utilizando ese interface.
Lua nos ofrece varias posibilidades para procesar la línea de
comandos de forma fácil y sencilla. Como en la mayoría de lenguajes
existen soluciones similares al getopts de C, y lua no es
una excepción. Por simplicidad utilizaremos la versión
alt-getopts que ofrece las mismas funcionalidades que la
librería getopts.
La forma más sencilla de instalar esta librería es utilizando
luarocks
# apt install luarocks git # luarocks --tree=local install alt-getopt
Una vez instalado, podremos utilizar este paquete en código como el siguiente:
#!/usr/bin/lua
package.path = package.path .. ';local/share/lua/5.1/?.lua'
local alt_getopt = require("alt_getopt")
opts,args = alt_getopt.get_opts (arg, "hi:o:",{})
if opts.h then
print ([[
Uso: ejemplo.lua [opciones]
Opciones:
-h Muestra esta ayuda
-i <fichero> Fichero de entrada
-o <fichero> Fichero de salida
]])
os.exit(0)
end
local input_file = "input.txt"
local output_file = "output.txt"
if opts.i then input_file = opts.i end
if opts.o then out_file = opts.o end
print ("Entrada: ".. input_file .. " Salida: " .. output_file)El código es bastante descriptivo. Observad que hemos tenido que
añadir al path de paquetes la localización de alt-getopt,
el cual instalamos de forma local utilizando luarocks. Una
vez importado el paquete, solo tenemos que llamar a
get_opts para procesar la línea de comandos. Como en la
mayoría de implementaciones de getopt añadir dos puntos
: después de un parámetro significa que se espera un
parámetro.
La función get_opts devuelve dos parámetros (si, lua
pude hacer eso). El primero contiene las opciones que se hayan
procesado, y el segundo contiene cualquier parámetro adicional que se
pueda pasar tras las opciones indicadas.
El último parámetro nos permite utilizar opciones largas, si cambiamos la llamada aget_optspor algo como esto:opts,args = alt_getopt.get_opts (arg, "hi:o:", {help = 'h', input = 'i', output = 'o'})Podremos utilizar tanto las opciones cortas como las largas
--help,--inputy--output.
Existen otros paquetes para procesar las opciones de la línea de
comandos con funcionalidades más completas que alt-getopt,
si bien, este es un paquete bastante estándar y utilizado.
RESUMEN
- Lua recibe los parámetros en una tabla llamada
arg - El nombre del script se recibe en
arg[0]si bien su modificación no tiene ningún efecto - El módulo
alt-getoptpermite procesar los argumentos de la línea de comandos de forma fácil y sencilla.
■
