Questo è l'ultimo articolo di una serie incentrata sullo scripting di Gnu Bash. Nel primo articolo abbiamo appena creato un semplice script con i comandi, uno dopo l'altro. Abbiamo anche visto l'uso di alcune variabili.
Il secondo articolo riguardava alcune strutture di controllo bash. Il terzo riguardava reindirizzamenti, pipe e sostituzione dei comandi.
Su quest'ultimo (per ora) mostrerò come creare interfacce utente con dialog nei nostri script.
Finestra di installazione
Il sorgente può essere scaricato per la compilazione da qui:https://invisible-island.net/dialog/. Per installare i binari precompilati la tua distribuzione ha sicuramente un pacchetto chiamato "dialog" che puoi installare con gli strumenti del pacchetto.
Opzioni generali
Le seguenti opzioni si applicano a ogni widget che possiamo usare nella finestra di dialogo. Quelli elencati qui non sono tutti, ma quelli che uso di più.
- --ascii-lines Invece di disegnare linee grafiche intorno ai riquadri, “+” e “-” nello stesso punto.
- --title titolo Specifica una stringa del titolo da visualizzare nella parte superiore della finestra di dialogo.
- --default-button stringa Imposta il pulsante preselezionato in un widget. Normalmente il primo pulsante in ogni widget è quello predefinito.
- --default-item stringa Imposta l'elemento predefinito in un elenco di controllo, modulo o casella di menu.
- --nessuna riga Invece di disegnare linee attorno ai riquadri, disegna spazi nello stesso punto.
- --nessuna ombra Elimina le ombre che verrebbero disegnate a destra e in fondo a ciascuna finestra di dialogo
- --backtitle backtitle Specifica una stringa di backtitle da visualizzare nella parte superiore dello schermo.
- --stdout Uscita diretta sull'uscita standard. Utile per memorizzare la scelta o la risposta dell'utente in una variabile
Ad esempio:
dialog --backtitle 'this is backtitle' --title 'Title' --infobox "This is just an infobox with some options settled" 0 0
produrrebbe questo output:
Altri esempi:
Il mio suggerimento per gli script con più schermate è di aggiungere un alias con alcune opzioni generali in modo da non dover digitare (o copiare) ogni volta, in questo modo:
alias dialog="dialog --backtitle 'this is backtitle' --title 'Title' --stdout" dialog --infobox "This is just an infobox" 0 0
Alcuni widget
Infobox
È l'esempio dall'alto. La sintassi è:
--infobox text height width
Dove testo è il testo da visualizzare e altezza e larghezza sono le dimensioni della finestra di dialogo. Puoi usare l'output di un comando per il testo con la sostituzione del comando, ad es. --infobox "$(cat somefile.txt)" . La dimensione è espressa in caratteri, un valore 0 significa automatico.
sì
Tipica casella di stile di query con pulsanti di risposta "Sì" e "No". La sintassi è:
--yesno text height width
Possiamo usarlo su un blocco if-then-else con un codice come questo:
if dialog --yesno "continue?" 0 0 then echo "You choose to continue" some_command some_other_command else echo "no" fi
menu
Un elenco a scorrimento di scelte con selezione a voce singola. La sintassi è:
--menu text height width menu-height tagX itemX tagY itemY
Ciascuna voce di menu è composta da una stringa di tag e da una stringa di voce. Penso che sia fantastico da combinare con un blocco case-esac come nel prossimo esempio:
case $(dialog --menu "A menu of choices " 0 0 0 a item\ 1 b item\ 2 c item\ 3 d item\ 4) in a) echo "Item A" some commands ;; b) echo "Item B" some other commands ;; *) echo other ;; esac
inputbox
Una casella di input è utile quando si desidera porre domande che richiedono all'utente di inserire una stringa come risposta. La sintassi è:
--inputbox text height width [init]
inizializzazione è facoltativo e può essere utilizzato per impostare una risposta predefinita.
lista di controllo
Una casella di controllo è simile a una casella di menu:ci sono più voci presentate sotto forma di menu. Ma invece di scegliere una sola voce, ogni voce può essere attivata o disattivata. La sintassi è:
--checklist text height width list-height tag item status
lo stato può essere attivato o disattivato. Possiamo lavorare con le opzioni selezionate con un ciclo for e un case block per valutare le opzioni selezionate. Esempio:
for i in $(dialog --checklist "A menu of choices " 0 0 0 a item\ 1 off b item\ 2 off c item\ 3 off ) do case $i in a) echo "item 1 selected" ;; b) echo "item 2 selected" ;; c) echo "item 3 selected" ;; esac done
Un'alternativa è la lista radio in cui l'utente può scegliere un solo elemento.
indicatore
Una tipica barra di avanzamento. Il contatore indica la percentuale. Le nuove percentuali vengono lette dall'input standard, un intero per riga. La sintassi è:
--gauge text height width [percent]
La percentuale è facoltativa e rappresenta la percentuale iniziale ottenuta. Questo può essere utilizzato con i tubi. Ad esempio:
seq 1 100|dialog --gauge "A gauge" 0 0
Calendario
Una casella del calendario mostra mese, giorno e anno. La sintassi è:
--calendar text height width day month year
Se i valori di giorno, mese o anno sono mancanti o negativi, viene utilizzata la data corrente.
Dove andare da qui
Ho appena mostrato alcuni dei widget disponibili (ce ne sono più di venti). La pagina di manuale della finestra di dialogo fornisce aiuto per tutti loro.
Naturalmente, la finestra di dialogo non è l'unico strumento disponibile per creare interfacce utente di testo. Ci sono alternative come Xdialog, Whiptail (entrambi menzionati nella manpage della finestra di dialogo) o Zenity. Ricorda che c'è più di un modo per farlo.
Questa serie di quattro articoli sullo scripting bash è molto lontana per essere completa. La mia intenzione è di farti sentire abbastanza curioso da indagare da solo. Tieni in mano la manpage di bash (che a volte può creare confusione, almeno per me). E tieni più vicino a te la Advanced Bash Scripting Guide per una guida più completa, piena di esempi.