Tutto ciò che vedo utilizza getopt
o il leggermente più elegante getopts
che supporta solo le opzioni a un carattere (ad esempio, -h
ma non --help
). Voglio fare fantasiose opzioni a lungo termine.Come posso analizzare gli argomenti di lunga durata nella shell?
risposta
che ho fatto qualcosa di simile this:
_setArgs(){
while [ "${1:-}" != "" ]; do
case "$1" in
"-c" | "--configFile")
shift
configFile=$1
;;
"-f" | "--forceUpdate")
forceUpdate=true
;;
"-r" | "--forceRetry")
forceRetry=true
;;
esac
shift
done
}
Come si può vedere, questa supporta sia il singolo personaggio e le opzioni più piacevolmente. Consente di associare valori a ciascun argomento, come nel caso di --configFile
. È anche abbastanza estensibile, senza limitazioni artificiali su quali opzioni possono essere configurate, ecc.
Come già accennato, "${1:-}"
impedisce un errore "variabile non associata" durante l'esecuzione in modalità "strict" bash (set -euo pipefail
).
Funzionerebbe, ma non obbedirebbe ad alcune convenzioni: piegando insieme argomenti con una singola lettera e cose come '-configFile = nomefile' (il' = '). –
@IanBicking - Molto vero. Tuttavia, per quanto riguarda il mio caso, ho deciso di consentire a questo di superare la frustrazione con getopt/getop ripreso dalle molte (sebbene comunque valide) risposte fornite nel duplicato contrassegnato su http://stackoverflow.com/questions/402377/using-getopts -in-bash-script di shell-to-get-lungo-e-short-riga di comando-options. – ziesemer
Ah ... quella domanda non era tra i candidati per i duplicati quando ho scritto la mia domanda. Grazie! –
Supponendo di "voler fare fantasiose opzioni lunghe" indipendentemente dallo strumento, basta andare con getopt
(getopts
sembra essere utilizzato principalmente quando la portabilità è fondamentale). Ecco un example di circa la complessità massima che si otterrà:
params="$(getopt -o e:hv -l exclude:,help,verbose --name "$(basename "$0")" -- "[email protected]")"
if [ $? -ne 0 ]
then
usage
fi
eval set -- "$params"
unset params
while true
do
case $1 in
-e|--exclude)
excludes+=("$2")
shift 2
;;
-h|--help)
usage
;;
-v|--verbose)
verbose='--verbose'
shift
;;
--)
shift
break
;;
*)
usage
;;
esac
done
Con questo codice, è possibile specificare più -e
/--exclude
di una volta, e ${excludes[@]}
conterrà tutti i dati esclude. Dopo l'elaborazione (--
è sempre presente) tutto ciò che rimane viene memorizzato in [email protected]
.
'basename' non accetta il percorso come opzione, ma come argomento. (Non ho potuto modificare la risposta, perché il sistema richiede almeno 6 modifiche di carattere.) – jarno
Grazie a @jarno, non so come si intromise. – l0b0
Per un'altra cosa, penso che non sia necessario usare '$ { 2-} ', ma' $ 2' è sufficiente, dato che 'getopt' uscirà con un codice diverso da zero, se non ci fosse argomento per' -e', giusto? – jarno
- 1. Come eseguire attività di lunga durata?
- 2. Servizio Android di lunga durata
- 3. Come analizzare gli argomenti di rake con OptionParser
- 4. Come analizzare gli argomenti della riga di comando in Python?
- 5. Come posso passare argomenti allo script di shell?
- 6. asp.net ThreadPool - funzionamento di lunga durata
- 7. Wicket: come gestire le attività di lunga durata
- 8. Come terminare un isolamento di lunga durata n. 2
- 9. Come mantenere i rami git di lunga durata
- 10. Analizzare gli argomenti della riga di comando negli script R
- 11. Transazioni di lunga durata con Spring e Hibernate?
- 12. Modo portatile per creare argomenti per un'utilità nella shell?
- 13. Come posso espandere gli argomenti in Java?
- 14. .NET: meccanismo per la sincronizzazione di attività di lunga durata
- 15. passando gli argomenti citati al nodo tramite script di shell?
- 16. Errore di orchestrazione nel test dell'unità di lunga durata
- 17. Come posso cancellare una query di lunga durata usando Spring e JDBCTemplate?
- 18. Mantain vecchie versioni senza creare filiali di lunga durata
- 19. Argomenti virtuali/code e durata
- 20. Trasmissione di testo in streaming per un'azione di lunga durata?
- 21. gestisce transazioni di lunga durata con perl dbi
- 22. Come posso analizzare gli URL HTTP in C#?
- 23. L'animazione incorporata è adatta per animazioni lente di lunga durata?
- 24. Come passare gli argomenti nella finestra mobile-comporre?
- 25. Haskell è appropriato per le applicazioni di lunga durata?
- 26. Test automatizzati .NET per processi di lunga durata
- 27. Devo sfuggire gli argomenti della shell in Perl?
- 28. Arresta o termina la query di lunga durata in JDBC
- 29. Attività di lunga durata (o per sempre) su Windows Azure
- 30. profiler gevent per il codice di lunga durata
possibile duplicato di [Utilizzo di getopts nello script della shell bash per ottenere opzioni della riga di comando lunghe e brevi] (http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get -long-and-short-command-line-options) –
@JonathanLeffler Davvero non un duplicato come 'getops' non deve essere sempre la risposta – Potherca
@Potherca: E infatti,' getopts' è * non * la risposta, come ha spiegato sia in questa domanda sia nelle risposte a questa domanda. – ruakh