Getopts es la polla

A todos nos gusta hacer scripts, ¿a quién no? ¿Y qué mejor que un script interactivo? Ohh aquellas tardes cuando descubrí como concatenar un echo, un read y un if:

echo -n " :: ¿Quieres instalar paquete X? (s/N): "
# Respuesta por defecto No
read -n RESPUESTA

if [[ $RESPUESTA == "s" ]] || [[ $RESPUESTA == "S" ]]; then
    echo " :: Instalando paquete X."
    sudo yum install paqueteX
fi

Pero cuando tu script instala y desinstala 150 paquetes, por ejemplo, se hace muy cansino.

Luego me acuerdo cuando descubrí case, que podía hacer programas con menus (como aquellos antíguos del MSDOS 🙂 ).

echo " :: Bienvenido al programa X."
echo "    1. Opcion 1"
echo "    2. Opcion 2"
echo "    3. Salir"

while true; do
    case $OPT in
        1)
            echo " :: Haciendo lo que sea que fuere 1."
            ;;
        2)
            echo " :: Haciendo lo que sea que fuere 2."
            ;;
        3)
            echo " :: Saliendo del programa."
            break
            ;;
        \?)
            echo " :: Comando desconocido."
            ;;
    esac
done

Y claro, luego están los menus tipo aircrack y cualquier programa de la terminal, que permiten comando del tipo -a -b -X. ¿Qué es lo más envidiable de esos programas? Pues que si tienes un programa llamado script.sh, con un uso por ejemplo:

 echo " :: Uso: script.sh -a <OPCIONA> -b <OPCIONB>"

No importa el orden en el que especificas los parametros. ¿Y eso por qué? Es debido al getopts. LLevo varios días querriendo utilizarlo y ayer en la página de Unix & Linux de StackExchange me ayudaron a arreglar un script (que no funcionaba). Aquí os dejo el script (que sí funciona):

#!/bin/bash
# by NotFromBrooklyn

function work () {
    echo "It Works"
}

function help () {
    echo "Print some help and options"
    exit
}

unset OPTA OPTB OPTC
while getopts :ha:b:c: OPT; do
    case $OPT in
        h)
            help
            exit
            ;;
        a)
	    OPTA=$OPTARG
	    ;;
        b)
	    OPTB=$OPTARG
      	    ;;
        c)
            OPTC=$OPTARG
            ;;
        \?)
	    help
            ;;
    esac
done

if [[ -z $1 ]]; then
    help
fi

if [[ -z $OPTC ]]; then
    echo "ERROR. You need OPTC."
elif [[ -z $OPTA ]] && [[ -z $OPTB ]]; then
    echo "ERROR. You need at least OPTA or OPTB."
elif [[ -z $OPTA ]] && [[ -n $OPTB ]]; then
    echo "May be better."
    work
elif [[ -n $OPTA ]] && [[ -z $OPTB ]]; then
    echo "May be better."
    work
else
    work
fi

Pueden que se os ocurran usos para este script ejemplo. A mí si.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s