[Bash-scripting] Usare getopt oppure getopts?

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3986
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

[Bash-scripting] Usare getopt oppure getopts?

Messaggio da joe »

Utilizzando spesso lo scripting bash per uso personale, ed essendomi imbattuto nella necessità di passare delle opzioni/argomenti allo script, mi sono posto la domanda in oggetto. Quale dei due comandi sarebbe preferibile e perchè?
Sinceramente mi piacerebbe anche la possibilità di usare opzioni in formato lungo, ma allo stesso tempo il fatto che getopts sia un builtin bash mi pare preferibile, anche se forse è meno standard di getopt... ma non saprei... per questo vi giro la questione.

Insomma pur dando per scontato che quando si usano scriptini per uso personale si possono fare come si vuole, mi piacerebbe capire quale sarebbe la strada maestra, ovvero se c'è un qualche standard che comunque sarebbe preferibile seguire.
Grazie in anticipo.

kanzy
Linux 2.x
Linux 2.x
Messaggi: 210
Iscritto il: sab 10 mag 2008, 15:02
Slackware: 14.2

Re: [Bash-scripting] Usare getopt oppure getopts?

Messaggio da kanzy »

Ho avuto anch'io lo stesso piccolo dubbio tempo fa.. poi la pratica risolve la cosa. Per i piccoli script personali con opzioni limitate uso getopts, mentre se subentra la necessità di utilizzare delle opzioni più chiarificatrici, dunque lunghe, utilizzo semplicemente il ciclo for sempre con case.
l'uomo ha bisogno di cibo rifugio e storie

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3986
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

Re: [Bash-scripting] Usare getopt oppure getopts?

Messaggio da joe »

Eh, capisco. Francamente da ignorante mi pare una questione talmente semplice che non immmaginavo vi fossero tutti questi problemi ad effettuare il parse degli argomenti/opzioni.
Mi aspettavo uno strumento tipo getopts ma che funzionasse anche con le opzioni lunghe... in modo che lo script si mostrasse all'utente in modo "consueto", tipo che --help --version ecc non dessero errore.
Da quanto invece capisco il metodo migliore per essere sicuri che il tutto funzioni anche in ambienti differenti dal nostro sistema, sia quello di costruirsi una "funzione getopt" più evoluta ed includerla direttamente nel corpo dello script. Altrimenti come dici tu bisogna rinunciare alle opzioni lunghe "--opzione-lunga" e rivolgersi a getopts che da quanto leggo in giro e da quanto affermi nella tua risposta direi essere una alternativa migliore rispetto a getopt. Infatti sebbene getopt della gnu accetti le opzioni lunghe, non è detto che sia presente in tutti gli ambienti (presumibilmente in *nix differenti da gnu/linux). Un'altra versione di getopt presente in bsd mi pare sembra non supportare le opzioni lunghe.
Insomma una gran casino per una operazione apparentemente (almeno ai miei occhi ignoranti) banale.

Viste queste "lacune" ho pensato di non essere il primo a pormi il problema, pertanto ho tcercato in rete trovando qualcosa di già precotto.
PEr esempio in questo sito:
http://www.shelldorado.com/
dove viene trattato l'argomento e suggerito anche un esempio di parsing delle opzioni fatto in casa. Che spero sia abbastanza pulito.
http://www.shelldorado.com/goodcoding/cmdargs.html

Cercando cercando ho trovato anche una pagina di manuale di getopts (strano perchè avevo letto essere un builtin di bash). E sembra che effettivamente supportile opzioni lunghe usando un invocazione piuttosto banale del tipo: getopts "o(long-option)" opt
così lanciando lo script con --long-opt oppure con -o è equivalente.. Probabilmente ho capito male e potrebbe darsi che questa possibilità sia data solo nella shell "ksh":
Ecco il link, se volete confermare:
http://cims.nyu.edu/cgi-comment/man.cgi ... ic=getopts

Ora si tratta di capire se questo ciclo case che tu usi per il parse in caso di opzioni lunghe sia fatto in un modo particolarmente pulito, oppure se fai come me e vai un po' a casaccio...

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3986
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

Re: [Bash-scripting] Usare getopt oppure getopts?

Messaggio da joe »

Nel frattempo ho trovato una soluzione interessante: convertire le eventuali opzioni lunghe nelle corrispondenti opzioni corte, dopodichè passare tutto a getopts.
In questo modo si dovrebbe ottenere una certa portabilità del tutto utilizzando strumenti standard come getopts builtin della shell. Allo stesso tempo non si ricorre a tools esterni potenzialmente non presenti nel sistema, per raggiungere un utilizzo dello script quanto più standard il che comprende (a mio personalissimo modo di vedere) anche la possibilità di passare allo script le classiche opzioni in formato lungo.

Vi propongo il seguente link:
http://kirk.webfinish.com/2009/10/bash- ... arameters/

Sembra che con queste poche linee di codice si possa raggiungere lo scopo riconducendo poi la gestione delle opzioni a getopts (senza dover così reinventare la ruota):

Codice: Seleziona tutto

#!/bin/bash
for arg
do
    delim=""
    case "$arg" in
    #translate --gnu-long-options to -g (short options)
        --some-other-gnu) args="${args}-g ";;
       --long-gnu-option) args="${args}-l ";;
       #pass through anything else
       *) [[ "${arg:0:1}" == "-" ]] || delim="\""
           args="${args}${delim}${arg}${delim} ";;
    esac
done
 
#Reset the positional parameters to the short options
eval set -- $args

[...]
Devo anche precisare di non averlo testato. Intanto mi piacerebbe sapere cosa ne pensate.

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3986
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

Re: [Bash-scripting] Usare getopt oppure getopts?

Messaggio da joe »

Ho trovato anche questo: http://www.opensource.apple.com/source/ ... toptx.bash
A quanto pare già diversi anni fa si erano posti questo problema e la faccenda era stata trattata su usenet:
#From: "Grigoriy Strokin" <grg@philol.msu.ru>
#Newsgroups: comp.unix.shell
#Subject: BASH: getopt function that parses long-named options
#Date: Mon, 22 Dec 1997 20:35:18 +0300

#Hi, I have written a BASH function named getoptex, that is like bash builtin
#"getopts", but does parse long-named options and optional arguments. It only
#uses builtin bash commands, so it is very fast. [....]

Rispondi