Friday 17 November 2006

Command line parsing in Bash

Ecco un semplice sistema che risolve un problema che incontro spesso in BASH: sviluppare uno script che gestisca un command line input. Il tutto si può fare molto semplicemente con un loop infinito, un case e una semplice funzione di parsing delle opzioni in formato long. Premessa: l'esempio illustra un caso semplice con 2 comandi possibili, di cui solo uno può essere scelto (se ne indichi più d'uno, solo l'ultimo verrà utilizzato) e una sola opzione, disponibile sia in formato short che long... ma è veramente semplice aggiungere nuove opzioni senza cambiare la logica.
Ciclo principale_action='none'
while true; do
  case $1 in
      start)
          _action='start'
          ;;
      stop)
          _action='stop'
          ;;
      --package=*)
          opt_value '--remote-host=' $1
          PKG=${OPT_VALUE}
          ;;
      -k)
          PKG=${2}
          shift
          ;;
      *)
          break;
  esac
  shift
done
Opt_value
function opt_value {
   _p=$1
   _arg=$2

   size=`echo $_p | wc -c`
   OPT_VALUE=`echo $_arg | cut -c ${size}-`
}
Ecco fatto, abbiamo ottenuto il nostro bel parser. Subito dopo il parsing, ho trovato molto utile invocare una funzione per riconfigurare lo script (in genere i miei script hanno sempre le variabili altamente interconnesse tra di loro, quindi dopo il parsing della command line altre opzioni potrebbero dover cambiare). Come ultima cosa non vi resta che fare un controllo della variabile _action per sapere quale azione vuole l'utente e il gioco e fatto :)

No comments: