introduzione
Benvenuti nella terza parte della "Guida per principianti di BASH". Se hai perso i due articoli precedenti, probabilmente vorrai sapere che cosa rende questa guida diversa da altre guide di scripting BASH.
Questa guida è stata scritta da un novizio completo di BASH e quindi da lettore che impari mentre imparo. Anche se sono un principiante di BASH, provengo da uno sviluppo di software, anche se la maggior parte delle cose che ho scritto è stata per la piattaforma Windows.
Puoi vedere le prime due guide visitando:
- Guida per principianti A BASH - Hello World
- Guida per principianti A BASH - Parametri di input
Se sei nuovo nello scripting BASH ti consiglio di leggere le prime due guide prima di continuare con questo.
In questa guida evidenzierò come utilizzare le istruzioni condizionali per verificare l'input dell'utente e controllare il funzionamento di uno script.
Installa rsstail
Per seguire questa guida è necessario installare un'applicazione a riga di comando chiamata rsstail che viene utilizzata per leggere i feed RSS.
Se si utilizza una distribuzione basata su Debian / Ubuntu / Mint, digitare quanto segue:
sudo apt-get install rsstail
Per Fedora / CentOS ecc digitare quanto segue:
yum install rsstail
Per openSUSE digitare quanto segue:
zypper installa rsstail
La dichiarazione IF
Apri un terminale e crea un file chiamato rssget.sh digitando quanto segue:
sudo nano rssget.sh
All'interno dell'editor nano inserire il seguente testo:
#! / Bin / bashrsstail -u http://z.about.com/6/o/m/linux_p2.xml;
Salvare il file premendo CTRL e O e quindi uscire premendo CTRL e X.
Esegui lo script digitando quanto segue:
sh rssget.sh
Lo script restituirà un elenco di titoli dal feed RSS di linux.about.com.
Non è uno script troppo utile perché recupera solo i titoli da un feed RSS ma salva il dover ricordare il percorso del feed RSS di Linux.about.com.
Apri nuovamente lo script rssget.sh in nano e modifica il file in modo che appaia come segue:
#! / Bin / bash
se $ 1 = "verbose"poi rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;fi
Eseguire di nuovo lo script digitando quanto segue:
sh rssget.sh verbose
Questa volta il feed RSS torna con il titolo, il link e la descrizione.
Analizziamo lo script con un minimo di dettagli:
Il #! / Bin / bash appare in ogni script che scriviamo. La riga successiva riguarda essenzialmente il primo parametro di input fornito dall'utente e lo confronta con la parola "verbose". Se il parametro di input e la parola "verbose" corrispondono alle linee tra poi e fi sono corse.
Lo script di cui sopra è ovviamente imperfetto. Cosa succede se non fornisci affatto un parametro di input? La risposta è che ottieni un errore sulla falsariga di un operatore inaspettato.
L'altro difetto principale è che se non si fornisce la parola "verbose", allora non succede nulla. Idealmente se non si fornisce la parola verbose lo script restituirebbe un elenco di titoli.
Utilizzare nuovamente nano per modificare il file rssget.sh e modificare il codice come segue:
#! / Bin / bash
se $ 1 = "verbose"poi rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;altro rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Salva il file ed eseguilo digitando quanto segue:
sh rssget.sh verbose
Apparirà una lista di titoli, descrizioni e collegamenti. Ora eseguilo di nuovo come segue:
sh rssget.sh titoli
Questa volta appare solo una lista di titoli.
La parte extra dello script è sulla riga 4 e introduce il altro dichiarazione. Fondamentalmente lo script ora dice che se il primo parametro è la parola "verbose" ottieni la descrizione, i link e i titoli per il feed RSS ma se il primo parametro è qualsiasi altra cosa, ottieni solo un elenco di titoli.
Lo script è leggermente migliorato ma è ancora difettoso. Se non si riesce a inserire un parametro, si otterrà comunque un errore. Anche se fornisci un parametro, solo dicendo che non vuoi verboso non significa che vuoi solo titoli. Per esempio potresti aver scritto erroneamente verbose o potresti aver digitato dei piccioni, il che ovviamente non ha senso.
Prima di provare a risolvere questi problemi, voglio mostrarti un altro comando che accompagna l'istruzione IF.
Modifica lo script rssget.sh in modo che appaia come segue:
#! / Bin / bash
se $ 1 = "tutto"poi rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "descrizione"poi rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
altro rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi
Ho deciso di sbarazzarmi della parola verbose e l'ho sostituita con tutto. Questa non è la parte importante. Lo script sopra presenta Elif che è un modo breve per dire SE SE.
Ora lo script funziona come segue. Se corri sh rssget.sh tutto quindi ottieni descrizioni, link e titoli. Se invece tu corri sh descrizione rssget.shotterrai solo titoli e descrizioni. Se fornisci altre parole, otterrai un elenco di titoli.
Questo introduce un modo per ottenere rapidamente un elenco di istruzioni condizionali. Un modo alternativo per fare ELIF è utilizzare le istruzioni IF annidate.
Di seguito è riportato un esempio che mostra come funzionano le istruzioni IF annidate:
#! / Bin / bash
se $ 2 = "aboutdotcom"poi se $ 1 = "tutto" poi rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descrizione" poi rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
altro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fialtro se $ 1 = "tutto" poi rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descrizione" poi rsstail -d -u http://lxer.com/module/newswire/headlines.rss altro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi
Sentiti libero di digitare tutto quello che vuoi, oppure copialo e incollalo nel tuo file rssget.sh.
Lo script precedente introduce un secondo parametro che ti consente di scegliere "about.com" o "lxer.com" come feed RSS.
Per eseguirlo, digita quanto segue:
sh rssget.sh all aboutdotcom
o
sh rssget.sh all lxer
Ovviamente puoi sostituire tutto con descrizioni o titoli per fornire solo descrizioni o solo titoli.
Fondamentalmente il codice sopra dice se il secondo parametro è aboutdotcom, quindi guarda la seconda istruzione if che è la stessa dello script precedente, se il secondo parametro è lxer, allora guarda di nuovo l'istruzione if interna per decidere se mostrare titoli, descrizioni o tutto.
Questo script è fornito esclusivamente come un esempio di istruzione IF annidata e ci sono così tante cose sbagliate in quello script che richiederebbe un altro articolo per spiegarle tutte. Il problema principale è che non è scalabile.
Immagina di voler aggiungere un altro feed RSS come Utente di tutti i giorni Linux o Linux oggi? La sceneggiatura diventerebbe enorme e se decidessi di volere modificare la dichiarazione IF interna, dovresti cambiarla in più punti.
Mentre c'è un tempo e un posto per un IF annidato dovrebbero essere usati con parsimonia. Di solito c'è un modo per refactoring del codice in modo che non è necessario l'IF nidificato. Verrò su questo argomento in un prossimo articolo.
Vediamo ora come risolvere il problema delle persone che inseriscono i parametri di Duff. Ad esempio, nello script sopra riportato se l'utente inserisce qualcosa di diverso da "aboutdotcom" come secondo parametro, un elenco di articoli viene visualizzato dal feed RSS di LXER indipendentemente dal fatto che l'utente inserisca lxer o meno.
Inoltre, se l'utente non immette "tutti" o "descrizione" come primo parametro, l'impostazione predefinita è un elenco di titoli che possono essere o meno l'intenzione dell'utente.
Guarda il seguente script (o copialo e incollalo nel tuo file rssget.sh.
#! / Bin / bash
se $ 2 = "aboutdotcom" || $ 2 = "lxer"poi se $ 1 = "tutto" || $ 1 = "descrizione" || $ 1 = "titolo" poi se $ 2 = "aboutdotcom" poi se $ 1 = "tutto" poi rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descrizione" poi rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
altro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi altro se $ 1 = "tutto" poi rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descrizione" poi rsstail -d -u http://lxer.com/module/newswire/headlines.rss altro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi
La prima cosa da notare è che lo script sta diventando abbastanza grande e puoi vedere rapidamente come possono diventare dichiarazioni IF annidate fuori controllo.
Il bit che è importante in questo script è l'istruzione IF || dichiarazione THEN sezione sulla linea 2 e linea 4.
|| sta per OR. Quindi la linease $ 2 = "aboutdotcom" || $ 2 = "lxer"controlla se il 2 ° parametro è uguale a "aboutdotcom" o "lxer". Se non lo è, l'istruzione IF è completa perché non c'è altro dichiarazione per il più esterno SE.
Allo stesso modo sulla linea 4 la linea se $ 1 = "tutto" || $ 1 = "descrizione" || $ 1 = "titolo"controlla se il 1 ° parametro è uguale a "tutti" o "descrizione" o "titolo".
Ora se l'utente è in esecuzioneformaggio di patate sh rssget.shnulla viene restituito mentre prima avrebbero ricevuto un elenco di titoli da LXER.
L'opposto di || è &&. L'operatore && sta per AND.
Ho intenzione di rendere la sceneggiatura ancora più simile a un incubo, ma fa il controllo più importante per assicurarsi che l'utente abbia fornito 2 parametri.
#! / Bin / bash
se $ # -eq 2poi
se $ 2 = "aboutdotcom" || $ 2 = "lxer" poi se $ 1 = "tutto" || $ 1 = "descrizione" || $ 1 = "titolo" poi se $ 2 = "aboutdotcom" poi se $ 1 = "tutto" poi rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "descrizione" poi rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;
altro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi altro se $ 1 = "tutto" poi rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "descrizione" poi rsstail -d -u http://lxer.com/module/newswire/headlines.rss altro rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi
L'unico bit che è extra in quello script è un'altra istruzione IF esterna come segue:se $ # -eq 2. Se leggi l'articolo sui parametri di input, saprai che $ # restituisce un conteggio del numero di parametri di input. Il -eq sta per uguale. L'istruzione IF pertanto verifica che l'utente abbia inserito 2 parametri e, in caso contrario, esce solo senza fare nulla. (Non particolarmente amichevole).
Sono consapevole che questo tutorial sta diventando abbastanza grande. Non c'è molto di più da coprire questa settimana, ma voglio aiutare a riordinare la sceneggiatura prima che finiamo.
L'ultimo comando che è necessario conoscere sulle istruzioni condizionali è l'istruzione CASE.
#! / Bin / bash
se $ # -eq 2poi caso $ 2 in aboutdotcom) caso $ 1 in tutti) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; descrizione) rsstail -d -u z.about.com/6/o/m/linux_p2.xml ;; titolo) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; esac ;; lxer) caso $ 1 in tutti) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; descrizione) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; titolo) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi
La dichiarazione del caso è un modo più bello di scrivere SE ALTRO SE SE SE SE SE SE SEI. Ad esempio questa logica Se frutto = bananePoi questoALTRO SE frutto = arancePoi questoALTRO Se frutto = uvaPoi questoFINISCI SE può essere riscritto come: caso frutto in banane) Fai questo ;; arance) Fai questo ;; uva) Fai questo ;;esac Fondamentalmente, il primo oggetto dopo il caso è la cosa che si confronterà (cioè il frutto). Quindi ogni elemento prima delle parentesi è la cosa a cui si sta confrontando e se corrisponde alle righe precedenti; sarà eseguito. Una dichiarazione di un caso è terminata con il reverse esac (che è il caso all'indietro). Nello script rssget.sh la dichiarazione del caso rimuove alcune di quelle terribili nidificazioni anche se non migliora davvero abbastanza. Per migliorare davvero lo script ho bisogno di presentarti le variabili. Guarda il seguente codice: #! / Bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" se $ # -lt 2 || $ # -gt 2poi echo "usage: rssget.sh all | description | title aboutdotcom | lxer"; Uscita;fi caso $ 1 in tutti) display = "- d -l -u" ;; descrizione) display = "- d -u" ;; titolo) display = "- u" ;;esac caso $ 2 in aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esacrsstail $ display $ url; Una variabile viene definita assegnandogli un nome e assegnandogli un valore. Nell'esempio precedente le seguenti sono assegnazioni di variabili: lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"display = ""url = "" Lo script è immediatamente più gestibile utilizzando le variabili. Ad esempio ogni parametro viene gestito separatamente e quindi non ci sono istruzioni IF annidate. La variabile di visualizzazione è ora impostata a seconda che tu abbia scelto tutto, la descrizione o il titolo e la variabile url sia impostata sul valore della variabile aboutdotcom o il valore della variabile lxer a seconda che tu abbia scelto aboutdotcom o lxer. Il comando rsstail ora deve solo usare il valore di display e url per funzionare correttamente. Mentre le variabili sono impostate semplicemente dando loro un nome, per usarle effettivamente devi mettere un segno $ davanti a loro. In altre parole, variabile = valore imposta una variabile su un valore mentre $ variabile indica il contenuto della variabile. Quello che segue è lo script finale per questo tutorial. #! / Bin / bash lxer = "lxer.com/module/newswire/headlines.rss"aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"everydaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"Linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"usage = "usage: rssget.sh tutti | descrizione | titolo lxer | aboutdotcom | everydaylinuxuser | linuxtoday"display = ""url = "" se $ # -lt 2 || $ # -gt 2poi echo $ usage; Uscita;fi caso $ 1 in tutti) display = "- d -l -u" ;; descrizione) display = "- d -u" ;; titolo) display = "- u" ;; *) echo $ usage; Uscita; ;;esac caso $ 2 in aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; Linuxtoday) url = $ Linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) echo $ usage; Uscita;esac rsstail $ display $ url; Lo script precedente introduce più feed RSS e c'è una variabile di utilizzo che indica all'utente come utilizzare lo script se non immettono 2 variabili o se inseriscono opzioni errate per le variabili. Questo è stato un articolo epico e potrebbe essere andato troppo lontano troppo presto. Nella prossima guida mostrerò tutte le opzioni di confronto per le dichiarazioni IF e c'è ancora molto altro da discutere riguardo alle variabili. C'è anche altro che può essere fatto per migliorare lo script sopra e questo sarà trattato nelle guide future mentre esploriamo loop, grep ed espressioni regolari. Consulta la sezione Come (scorri verso il basso le categorie per vedere un elenco di articoli) di linux.about.com per trovare altre utili guide dal doppio avvio di Windows e Ubuntu alla configurazione di una macchina virtuale utilizzando le caselle GNOME. Sommario