Guia de principiants a BASH: condicions i variables

Introducció

Benvingut a la tercera part de la "Guia d'inici per a la BASH". Si heu perdut els dos articles anteriors, probablement voldreu saber què fa que aquesta guia sigui diferent d'altres guies de seqüència de BASH.

Aquesta guia està sent escrita per un principiant complet a BASH i, per tant, com a lector que aprengues a mesura que aprenc. Tot i que sóc un principiant de BASH procedeix d'un fons de desenvolupament de programari encara que la majoria de les coses que he escrit han estat per a la plataforma Windows.

Podeu veure les dues primeres guies visitant:

Si sou nou a les seqüències d'ordres BASH, us recomano llegir les dues primeres guies abans de continuar amb aquest.

En aquesta guia estaré destacant com utilitzar els extractes condicionals per provar l'entrada de l'usuari i controlar com funciona un script.

Instal·la rsstail

Per seguir aquesta guia necessitareu instal·lar una aplicació de línia d'ordres anomenada rsstail que s'utilitza per llegir feeds RSS .

Si utilitzeu un tipus de distribució basat en Debian / Ubuntu / Mint, feu el següent:

sudo apt-get install rsstail

Per a Fedora / CentOS, etc, escriviu el següent:

yum install rsstail

Per a openSUSE escriviu el següent:

zypper install rsstail

La declaració IF

Obriu un terminal i creeu un fitxer anomenat rssget.sh, escriviu el següent:

sudo nano rssget.sh

Dins de l'editor nano, introduïu el text següent:

#! / bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;

Deseu el fitxer prement CTRL i O i, després, surti pressionant CTRL i X.

Executeu el script escrivint el següent:

sh rssget.sh

El script retornarà una llista de títols del feed RSS de linux.about.com.

No és un script massa útil perquè només recupera els títols d'un canal RSS, però sí que oblideu recordar la ruta d'accés al feed RSS de Linux.about.com.

Obriu de nou l'script rssget.sh en nano i editeu el fitxer per veure el següent:

#! / bin / bash

si [$ 1 = "verbose"]
llavors
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Torneu a executar l'script escrivint el següent:

sh rssget.sh verbose

Aquesta vegada, el feed RSS torna amb el títol, l'enllaç i la descripció.

Anem a analitzar la seqüència de comandaments amb una mica de detall:

El #! / Bin / bash apareix a cada script que escrivim. La següent línia analitza bàsicament el primer paràmetre d'entrada proporcionat per l'usuari i el compara amb la paraula "verbose". Si el paràmetre d'entrada i la paraula "verbosa" coincideixen amb les línies entre llavors i fi, es van executar.

L'script anterior és, evidentment, defectuós. Què passa si no proporciona cap paràmetre d'entrada? La resposta és que obteniu un error al llarg de les línies d'operador inesperat.

L'altre defecte important és que si no proporciona la paraula "verbose", res no passa res. L'ideal seria que si no proporcioneu la paraula verbose, el script retornaria una llista de títols.

Torneu a utilitzar nano per editar el fitxer rssget.sh i modificar el codi de la manera següent:

#! / bin / bash

si [$ 1 = "verbose"]
llavors
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
altra cosa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Deseu el fitxer i executeu-lo escriviu el següent:

sh rssget.sh verbose

Apareixerà una llista de títols, descripcions i enllaços. Ara torneu a executar de la següent manera:

sh rssget.sh títols

Aquesta vegada només apareix una llista de títols.

La part addicional del guió és a la línia 4 i introdueix la instrucció else . Bàsicament, l'script ara diu si el primer paràmetre és la paraula "verbose", obteniu la descripció, els enllaços i els títols per al feed RSS, però si el primer paràmetre és qualsevol altra cosa, només obtingui una llista de títols.

El guió ha millorat lleugerament, però encara és erroni. Si no introduïu un paràmetre, encara obtindreu un error. Fins i tot si proveu un paràmetre, només dient que no voleu un verbós no vol dir que només vulgueu els títols. És possible que acabeu d'escriure un verbose incorrecte, per exemple, o potser hauria escrit coloms que, per descomptat, no tenen sentit.

Abans d'intentar aclarir aquests problemes, vull mostrar-vos una ordre més que acompanya la declaració IF.

Editeu la seqüència de comandaments rssget.sh per veure el següent:

#! / bin / bash

si [$ 1 = "all"]
llavors
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descripció"]
llavors
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

altra cosa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi

Vaig decidir desfer-me de la paraula verbosa i reemplaçar-la per tot. Aquesta no és la part important. L'script anterior introdueix elif que és una manera curta de dir ELSE IF.

Ara, l'script funciona de la manera següent. Si executeu sh rssget.sh tot , obteniu descripcions, enllaços i títols. En cas contrari, només executeu la descripció de sh rssget.sh , només obtindreu títols i descripcions. Si proporcioneu alguna altra paraula, obtindreu una llista de títols.

Això introdueix una manera de presentar ràpidament una llista d'afirmacions condicionals. Una forma alternativa de fer ELIF és utilitzar el que es coneix com a declaracions IF anivades.

El següent és un exemple que mostra com funcionen les declaracions IF aniades:

#! / bin / bash

si [$ 2 = "aboutdotcom"]
llavors
si [$ 1 = "all"]
llavors
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descripció"]
llavors
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

altra cosa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
altra cosa
si [$ 1 = "all"]
llavors
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "descripció"]
llavors
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
altra cosa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi

No dubteu a escriure tot allò que us agrada o copieu-lo i enganxeu-lo al vostre fitxer rssget.sh.

El guió anterior introdueix un segon paràmetre que us permet triar "about.com" o "lxer.com" un canal RSS.

Per executar-lo escriviu el següent:

sh rssget.sh tot sobredotcom

o

sh rssget.sh tots els lxer

Per descomptat, podeu substituir totes les descripcions o títols per proporcionar descripcions o títols.

Bàsicament, el codi de dalt diu si el segon paràmetre és aboutdotcom i, a continuació, consulteu la instrucció second if que és la mateixa de la seqüència anterior en cas contrari si el segon paràmetre és lxer llavors consulteu la instrucció inner if per decidir si voleu mostrar títols o descripcions o tot.

Aquest script es proporciona exclusivament com un exemple d'una declaració IF anivada i hi ha tantes coses malament amb aquest script que prendria un altre article per explicar-los a tots. El problema principal és que no és escalable.

Imagineu que voleu afegir un altre canal RSS com ara Everyday Linux User o Linux Today? El guió es convertiria en enorme i si vau decidir que volíeu canviar la instrucció IF interna, haureu de canviar-la en diversos llocs.

Si bé hi ha un lloc i un lloc per a un IF niat, s'haurien d'utilitzar amb moderació. Normalment hi ha una manera de refactoritzar el vostre codi perquè no necessiteu l'IF niat. Aniré a aquest assumpte en un article futur.

Vegem ara la solució del problema de les persones que entren als paràmetres duff. Per exemple, en el script anterior, si l'usuari introdueix una altra cosa que "aboutdotcom" com a segon paràmetre, apareix una llista d'articles del feed RSS de LXER independentment de si l'usuari introdueix lxer o no.

A més, si l'usuari no introdueix "tots" o "descripció" com a primer paràmetre, el valor per defecte és una llista de títols que poden ser o no el que l'usuari ha cercat.

Mireu el següent script (o copieu-lo i enganxeu-lo al vostre fitxer rssget.sh.

#! / bin / bash

si [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
llavors
si [$ 1 = "all"] || [$ 1 = "descripció"] || [$ 1 = "títol"]
llavors
si [$ 2 = "aboutdotcom"]
llavors

si [$ 1 = "all"]
llavors
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descripció"]
llavors
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

altra cosa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
altra cosa
si [$ 1 = "all"]
llavors
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "descripció"]
llavors
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
altra cosa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi

El primer que cal tenir en compte és que el script ara es fa bastant gran i pot veure ràpidament com es pot convertir en declaracions IF aniades sense control.

El bit que és important en aquest script és la instrucció IF || declaració THEN secció a la línia 2 i línia 4.

El | | significa OR. Així que la línia si [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] comprova si el segon paràmetre és igual a "aboutdotcom" o "lxer". Si no és així, la declaració IF es completa perquè no hi ha cap altra declaració per a la majoria de IF exteriors .

De la mateixa manera, a la línia 4, la línia si [$ 1 = "all"] || [$ 1 = "descripció"] || [$ 1 = "title"] comprova si el paràmetre 1 és igual a "tots" o "descripció" o "títol".

Ara, si l'usuari executa sh rssget.sh el formatge de patates no es rep res, mentre que abans haurien rebut una llista de títols de LXER.

El contrari de || és &&. L'operador && representa l'AND.

Vaig a fer que l'escriptura es vegi encara més com un malson, però fa el control important per assegurar-se que l'usuari ha proporcionat 2 paràmetres.

#! / bin / bash

si [$ # -eq 2]
llavors

si [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
llavors
si [$ 1 = "all"] || [$ 1 = "descripció"] || [$ 1 = "títol"]
llavors
si [$ 2 = "aboutdotcom"]
llavors

si [$ 1 = "all"]
llavors
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;
elif [$ 1 = "descripció"]
llavors
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

altra cosa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
altra cosa
si [$ 1 = "all"]
llavors
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "descripció"]
llavors
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
altra cosa
rsstail -u http://z.about.com/6/o/m/linux_p2.xml;
fi
fi
fi
fi
fi

L'única cosa que és extra en aquest script és una altra declaració IF externa de la manera següent: si [$ # -eq 2] . Si llegiu l'article sobre els paràmetres d'entrada, sabreu que $ $ retorna un recompte de la quantitat de paràmetres d'entrada. El -eq significa iguals. La declaració IF, per tant, comprova que l'usuari ha introduït 2 paràmetres i si no només sortia sense fer res. (No és especialment amable).

Sóc conscient que aquest tutorial és bastant gran. No hi ha molt més per cobrir aquesta setmana, però vull ajudar a ordenar el guió abans d'acabar.

L'última ordre que necessiteu per obtenir informació sobre les declaracions condicionals és la instrucció CASE.

#! / bin / bash


si [$ # -eq 2]
llavors
cas a $ 2 in
aboutdotcom)
cas $ 1 a
tot)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
;;
descripció)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
;;
títol)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
;;
esac
;;
lxer)
cas $ 1 a
tot)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
;;
descripció)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
;;
títol)
rsstail -u http://lxer.com/module/newswire/headlines.rss
;;
esac
;;
esac
fi

La declaració de casos és una forma més senzilla d'escriure SI ELS SI ELSE FI SI ALTRES SI.

Per exemple, aquesta lògica

Fruita IF = plàtans
A continuació, això
ELSE SI fruit = taronges
A continuació, això
ELSE Si la fruita = raïm
A continuació, això
FI SI

es pot reescriure com:

fruit del cas a
plàtans)
fer això
;;
taronges)
fer això
;;
raim)
fer això
;;
esac

Bàsicament, el primer element després del cas és el que es va a comparar (és a dir, fruita). A continuació, cada element abans dels claudàtors és el que està comparant i si coincideix amb les línies anteriors; serà corrent. Una declaració del cas es rescindeix amb l'esac invers (que és cas a l'inrevés).

A l'script rssget.sh, l'extracte del cas elimina algunes d'aquestes nidificants nidades, encara que en realitat no n'hi ha prou millor.

Per millorar realment el script, he de presentar-vos variables.

Mireu el següent codi:

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

si [$ # -lt 2] || [$ # -gt 2]
llavors
echo "use: rssget.sh [all | description | title] [aboutdotcom | lxer]";
sortir;
fi

cas $ 1 a
tot)
display = "- d -l -u"
;;
descripció)
display = "- d -u"
;;
títol)
display = "- u"
;;
esac

cas a $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
esac
rsstail $ display $ url;

Una variable es defineix donant-li un nom i assignant-li un valor. A l'exemple anterior, les següents són assignacions de variables:

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

La seqüència d'ordres és més fàcil de gestionar instantàniament mitjançant l'ús de variables. Per exemple, cada paràmetre es gestiona per separat i, per tant, no hi ha cap declaració IF anidada.

La variable de visualització ara s'estableix en funció de si escolliu tot, la descripció o el títol i la variable d'URL s'estableix al valor de la variable aboutdotcom o al valor de la variable lxer depenent de si escolliu arounddotcom o lxer.

Ara, l'ordre rsstail només ha d'utilitzar el valor de la visualització i l'url per executar-se correctament.

Mentre que les variables s'estableixen només amb un nom, per fer-les servir, heu de posar un senyal $ al davant. En altres paraules, variable = valor estableix una variable a un valor, mentre que $ variable significa donar-me el contingut de la variable.

El següent és el guió final d'aquest tutorial.

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
dailylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
usage = "use: rssget.sh [tot | descripció | títol] [lxer | aboutdotcom | dailylinuxuser | linuxtoday]"
display = ""
url = ""

si [$ # -lt 2] || [$ # -gt 2]
llavors
eco $ use;
sortir;
fi

cas $ 1 a
tot)
display = "- d -l -u"
;;
descripció)
display = "- d -u"
;;
títol)
display = "- u"
;;
*)
eco $ use;
sortir;
;;
esac

cas a $ 2 in
aboutdotcom)
url = $ aboutdotcom;
;;
lxer)
url = $ lxer;
;;
linuxtoday)
url = $ linuxtoday;
;;
dailylinuxuser)
url = $ dailylinuxuser;
;;
*)
eco $ use;
sortir;
esac

rsstail $ display $ url;

L'script anterior introdueix més canals de RSS i hi ha una variable d'ús que indica a l'usuari com utilitzar l'script si no introdueixen dues variables o introdueixen opcions incorrectes per a les variables.

Resum

Aquest ha estat un article èpic i pot haver estat massa ràpid. A la següent guia us mostraré totes les opcions de comparació per a les declaracions IF i encara hi ha molt més per parlar sobre variables.

També hi ha més coses que es poden fer per millorar l'script anterior i això es cobrirà en futures guies mentre explorem bucles, grep i expressions regulars.

Consulteu la secció Com (desplaçar cap avall per veure una llista d'articles) de l inux.about.com per trobar guies més útils de l'arrencada dual de Windows i Ubuntu per configurar una màquina virtual amb caixes de GNOME .