Skip to main content

Iesācēju rokasgrāmata "Bash" - nosacījumi un mainīgie

Anonim

Ievads

Laipni lūdzam trešajā sadaļā "Iesācēju rokasgrāmata BASH". Ja esat aizmirsis iepriekšējos divus rakstus, iespējams, vēlēsieties uzzināt, kas padara šo ceļvedi atšķirīgu no citām BASH skriptu vadlīnijām.

Šo rokasgrāmatu raksta pilnīgs iesācējs BASH un lasītājs, kuru jūs mācāties, kā iemācos. Lai gan es esmu iesācējs BASH, es esmu nākusi no programmatūras izstrādes fona, lai gan lielākā daļa stuff, ko esmu uzrakstījis, ir bijis Windows platformai.

Pirmos divus ceļvežus varat redzēt, apmeklējot:

  • Iesācēju rokasgrāmata BASH - Hello World
  • Iesācēju rokasgrāmata BASH - ievades parametriem

Ja esat jauns BASH skripters, es ieteiktu izlasīt pirmos divus ceļvežus, pirms turpināt lietot šo vienu.

Šajā rokasgrāmatā es uzsvēršu, kā izmantot nosacījumu paziņojumus, lai pārbaudītu lietotāja ievadi un lai kontrolētu, kā darbojas skripts.

Instalējiet rsstail

Lai sekotu šim ceļvedim, jums būs jāinstalē komandrindas programma ar nosaukumu rsstail, kuru izmanto RSS plūsmu lasīšanai.

Ja jūs izmantojat izplatīšanas veidu pēc Debian / Ubuntu / Mint, rīkojieties šādi:

sudo apt-get install rsstail

Attiecībā uz Fedora / CentOS utt ierakstiet šādu:

yum install rsstail

Attiecībā uz openSUSE ierakstiet šādus:

zypper instalēt rsstail

IF paziņojums

Atveriet termināli un izveidojiet failu ar nosaukumu rssget.sh, ierakstot šo:

sudo nano rssget.sh

Nano redaktorā ievadiet šādu tekstu:

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

Saglabājiet failu, nospiežot CTRL un O, un pēc tam izejiet, nospiežot CTRL un X.

Palaidiet skriptu, ierakstot sekojošo:

sh rssget.sh

Skripts atgriezīs nosaukumu sarakstu no vietnes linux.about.com RSS plūsmas.

Tas nav pārāk noderīgs skripts, jo tas vienkārši izgūst nosaukumus no vienas RSS barotnes, bet tas saglabā, kam jāatceras ceļš uz Linux.about.com RSS barību.

Atveriet rssget.sh skriptu nano vēlreiz un rediģējiet failu, lai tas izskatās šādi:

#! / bin / bash

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

Atkal palaidiet skriptu, ierakstot sekojošo:

sh rssget.sh verbose

Šoreiz RSS plūsma atgriežas ar nosaukumu, saiti un aprakstu.

Mēs analizēsim skriptu mazliet detalizēti:

#! / Bin / bash parādās katrā skriptā, kuru mēs rakstām. Nākamajā rindā galvenokārt aplūkots pirmais lietotāja ievadītais parametrs un tas tiek salīdzināts ar vārdu "verbose". Ja ievades parametrs un vārds "verbose" atbilst līnijām starp tad un fi ir bijuši.

Iepriekš minētais skripts acīmredzami ir kļūdains. Kas notiek, ja vispār neiesniedzat ievades parametru? Atbilde ir tāda, ka tiek parādīta kļūda neparedzēta operatora līnijās.

Cits galvenais trūkums ir tāds, ka, ja jūs nenodrošina vārdu "verbose", tad nekas vispār nenotiek. Ideālā gadījumā, ja jūs nenodrošināsiet verbālo vārdu, skripts atgriezīs nosaukumu sarakstu.

Izmantojiet nano atkal, lai rediģētu failu rssget.sh un grozītu kodu šādi:

#! / bin / bash

ja $ 1 = "verbose"tad rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;cits rsstail -u http://z.about.com/6/o/m/linux_p2.xml;fi

Saglabājiet failu un palaidiet to, ierakstot sekojošo:

sh rssget.sh verbose

Tiks parādīts nosaukumu saraksts, apraksti un saites. Tagad palaidiet to vēlreiz šādi:

sh rssget.sh sadaļas

Šoreiz parādās tikai virsrakstu saraksts.

Skripta papildu daļa ir 4. rindiņā un ievieš cits paziņojums, apgalvojums. Būtībā skripts tagad saka, ja pirmais parametrs ir vārds "verbose", iegūstiet RSS plūsmas aprakstu, saites un nosaukumus, bet, ja pirmais parametrs ir kaut kas cits, vienkārši iegūstiet nosaukumu sarakstu.

Skripts ir nedaudz uzlabojies, bet joprojām ir kļūdains. Ja neizdodas ievadīt parametru, jūs joprojām saņemat kļūdu. Pat ja jūs sniedzat parametru, vienkārši sakot, ka nevēlaties verbose nenozīmē, ka vēlaties tikai nosaukumus. Piemēram, jūs, iespējams, vienkārši uzrakstījāt verbose nepareizi vai arī jūs, iespējams, esat ierakstījis baložus, kas, protams, ir bezjēdzīgi.

Pirms mēs mēģinām iztīrīt šos jautājumus, es vēlos jums parādīt vēl vienu komandu, kas atbilst IF paziņojumam.

Rediģējiet rssget.sh skriptu, lai tas izskatās šādi:

#! / bin / bash

ja $ 1 = "visi"tad rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml;elif $ 1 = "apraksts"tad rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

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

Es nolēmu atbrīvoties no vārda verbose un aizstāt to ar visiem. Tā nav svarīga sastāvdaļa. Iepriekš parādīts skripts elif kas ir īss veids, kā pateikt ELSE IF.

Tagad skripts darbojas šādi. Ja palaižat sh rssget.sh all tad jūs saņemat aprakstus, saites un nosaukumus. Ja tā vietā jūs vienkārši palaidat sh rssget.sh aprakstsjūs vienkārši saņemsit virsrakstus un aprakstus. Ja jūs iesniedzat kādu citu vārdu, jūs saņemsit nosaukumu sarakstu.

Tas ievieš veidu, kā ātri iesniegt nosacīto paziņojumu sarakstu. Alternatīvais veids, kā veikt ELIF, ir izmantot to, kas ir pazīstams kā ligzdots IF paziņojums.

Tālāk ir parādīts piemērs, kurā parādīts, kā ligzdoti IF paziņojumi darbojas:

#! / bin / bash

ja $ 2 = "aboutdotcom"tad ja $ 1 = "visi" tad rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "apraksts" tad rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

cits rsstail -u http://z.about.com/6/o/m/linux_p2.xml; ficits ja $ 1 = "visi" tad rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "apraksts" tad rsstail -d -u http://lxer.com/module/newswire/headlines.rss cits rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fifi

Jūtieties brīvi drukāt visu, kas jums patīk, vai arī kopējiet un ielīmējiet to savā rssget.sh failā.

Iepriekšējais skripts ievieš 2.parametru, kas ļauj jums izvēlēties vai nu "about.com" vai "lxer.com" RSS barību.

Lai palaistu to, jūs ierakstiet šādus:

sh rssget.sh all aboutdotcom

vai

sh rssget.sh viss lxer

Jūs varat, protams, aizstāt visus ar aprakstiem vai nosaukumiem, lai sniegtu tikai aprakstus vai vienkārši nosaukumus.

Būtībā šis kods saka, ja otrais parametrs ir aboutdotcom, tad apskatīt otro, ja paziņojums, kas ir tas pats no iepriekšējā skripta cits, ja otrais parametrs ir lxer, pēc tam aplūkojiet iekšējo if paziņojumu vēlreiz, lai izlemtu, vai rādīt nosaukumus, aprakstus vai viss.

Šis skripts tiek sniegts tikai kā ligzdotu IF izteiksmes piemērs, un ar šo skriptu ir tik daudz lietu, tas prasīs vēl vienu rakstu, lai tos visu izskaidrotu. Galvenais jautājums ir tāds, ka tas nav pielāgojams.

Iedomājieties, ka vēlējāties pievienot vēl vienu RSS plūsmu, piemēram, ikdienas Linux lietotāju vai Linux šodien? Skripts kļūs milzīgs, un, ja jūs nolemsiet, ka vēlaties mainīt iekšējo IF paziņojumu, tam vajadzētu mainīt vairākās vietās.

Kaut gan ir laiks un vieta ligzdotu, ja tie būtu jāizmanto taupīgi. Parasti ir veids, kā pārveidot kodu, lai jums vispār nebūtu nepieciešams ligzdots IF. Es pievērsīšos šim jautājumam nākamajā rakstā.

Tagad aplūkosim jautājumu par cilvēkiem, kuri ievada parametrus. Piemēram, iepriekš minētajā skriptā, ja lietotājs ievadīs kaut ko citu kā "aboutdotcom" kā 2. parametru, tad no LXER RSS plūsmas tiek parādīts rakstu saraksts neatkarīgi no tā, vai lietotājs ievadījis lxer vai ne.

Turklāt, ja lietotājs 1. parametru neievada kā "visu" vai "aprakstu", tad noklusējums ir to nosaukumu saraksts, kurus var vai nebūt tas, ko paredzēts lietotājam.

Apskatiet šādu skriptu (vai arī kopējiet un ielīmējiet to savā rssget.sh failā.

#! / bin / bash

ja $ 2 = "aboutdotcom" || $ 2 = "lxer"tad ja $ 1 = "visi" || $ 1 = "apraksts" || $ 1 = "nosaukums" tad ja $ 2 = "aboutdotcom" tad ja $ 1 = "visi" tad rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "apraksts" tad rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

cits rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi cits ja $ 1 = "visi" tad rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "apraksts" tad rsstail -d -u http://lxer.com/module/newswire/headlines.rss cits rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fifi

Pirmā lieta, kas jāņem vērā, ir tas, ka skripts tagad kļūst diezgan liels, un jūs varat ātri uzzināt, kā no kontroles pārapdzīvotajiem IF paziņojumiem var kļūt.

Šajā scenārijā svarīgais bits ir IF paziņojums || paziņojums THEN sadaļā 2. un 4. rindā.

|| apzīmē OR. Tātad līnijaja $ 2 = "aboutdotcom" || $ 2 = "lxer"pārbauda, ​​vai 2. parametrs ir vienāds ar "aboutdotcom" vai "lxer". Ja tas nav, tad IF paziņojums ir pilnīgs, jo tā nav cits paziņojums par ārējo visvairāk IF

Tāpat arī 4. līnijā līnija ja $ 1 = "visi" || $ 1 = "apraksts" || $ 1 = "nosaukums"pārbauda, ​​vai 1. parametrs ir vienāds ar vai nu "visu", vai "aprakstu" vai "virsrakstu".

Tagad, ja lietotājs palaižsh rssget.sh kartupeļu siersnekas netiek atgriezts, kamēr tie nebūtu saņēmuši LXER nosaukumu sarakstu.

Pretējā no || ir && && operators apzīmē AND.

Es gatavojas padarīt skriptu izskatīties vēl vairāk kā murgs, bet tas padara visu svarīgu pārbaudi, lai pārliecinātos, ka lietotājs ir iesniedzis 2 parametrus.

#! / bin / bash

ja $ # -eq 2tad

ja $ 2 = "aboutdotcom" || $ 2 = "lxer" tad ja $ 1 = "visi" || $ 1 = "apraksts" || $ 1 = "nosaukums" tad ja $ 2 = "aboutdotcom" tad ja $ 1 = "visi" tad rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml; elif $ 1 = "apraksts" tad rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml;

cits rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi cits ja $ 1 = "visi" tad rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss elif $ 1 = "apraksts" tad rsstail -d -u http://lxer.com/module/newswire/headlines.rss cits rsstail -u http://z.about.com/6/o/m/linux_p2.xml; fi fi fi fifi

Vienīgais bits, kas šajā scenārijā ir papildus, ir vēl viens ārējais IF paziņojums šāds:ja $ # -eq 2. Ja jūs izlasīsit rakstu par ievades parametriem, jūs zināt, ka $ # atgriež ieejas parametru skaita skaitu. -Eq ir vienāds. IF paziņojums tāpēc pārbauda, ​​vai lietotājs ir ievadījis divus parametrus, un, ja viņi to ne tikai iziet, neko nedarot. (Nav īpaši draudzīgs).

Es zinu, ka šī apmācība kļūst diezgan liela. Šajā nedēļā nav daudz vairāk, taču es vēlos palīdzēt sakārtot skriptu pirms tā pabeigšanas.

Viena pēdējā komanda, kas jums jāzina par nosacītajiem apgalvojumiem, ir CASE paziņojums.

#! / bin / bash

ja $ # -eq 2tad gadījums 2 dolāri iekšā aboutdotcom) gadījumā $ 1 collas visi) rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml ;; apraksts) rsstail -d -u z.about.com/6/o/m/linux_p2.xml ;; nosaukums) rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml ;; esac ;; lxer) gadījumā $ 1 collas visi) rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss ;; apraksts) rsstail -d -u http://lxer.com/module/newswire/headlines.rss ;; nosaukums) rsstail -u http://lxer.com/module/newswire/headlines.rss ;; esac ;; esacfi

Lietu izraksts ir labāks veids, kā rakstīt IF IFSE IFSE IF IFSE IF.

Piemēram, šī loģika

IF augļi = banāniTad tas irELSE IF augļi = apelsīniTad tas irELSE IF augļi = vīnogasTad tas irEND IF

var pārrakstīt kā:

dārzeņu augļi banāni) dari šo ;; apelsīni) dari šo ;; vīnogas) dari šo ;;esac

Būtībā pirmais postenis pēc lietas ir tas, ko jūs salīdzināt (t.i., ar augļiem). Tad katrs priekšmets pirms iekavām ir tas, ko jūs salīdzinājat pret un ja tas atbilst līnijām pirms ;; darbosies. Gadījumu paziņojums tiek pārtraukts ar reverso esac (kas ir gadījumā atpakaļ).

Skriptā rssget.sh paziņojums par notikumiem noņem dažus no šīm briesmīgajām ligzdošanas iespējām, lai gan to nav pietiekami uzlabojis.

Lai tiešām uzlabotu skriptu, man ir nepieciešams iepazīstināt jūs ar mainīgajiem lielumiem.

Apskatiet šādu kodu:

#! / bin / bash

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

ja $ # -lt 2 || $ # -gt 2tad echo "izmantošana: rssget.sh all | apraksts | nosaukums aboutdotcom | lxer"; Izeja;fi

gadījumā $ 1 collas visi) displejs = "-d -l -u" ;; apraksts) displejs = "- d -u" ;; nosaukums) displejs = "- u" ;;esac

gadījums 2 dolāri iekšā aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;;esacrsstail $ displejs $ url;

Mainīgais ir definēts, piešķirot tam nosaukumu un pēc tam tam piešķirot vērtību. Iepriekš minētajā piemērā šādi ir mainīgo lielumu uzdevumi:

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

Skripts ir ātrāk pārvaldāms, izmantojot mainīgos. Piemēram, katrs parametrs tiek apstrādāts atsevišķi, tādēļ nav neviena nesaistīta IF paziņojuma.

Displeja mainīgais tagad tiek iestatīts atkarībā no tā, vai esat izvēlējies visu, aprakstu vai nosaukumu, un url mainīgais ir iestatīts uz value aboutdotcom mainīgo vai lxer mainīgā vērtības atkarībā no tā, vai esat izvēlējies aboutdotcom vai lxer.

Rsstail komandai tagad ir tikai jāizmanto displeja un url vērtības pareiza darbība.

Lai gan mainīgie tiek iestatīti tikai, norādot viņiem nosaukumu, lai to faktiski izmantotu, jums ir jāpiestiprina $ zīme. Citiem vārdiem sakot, mainīgais = vērtība iestata mainīgo vērtību, bet $ mainīgais nozīmē mainīgā saturu.

Tālāk ir sniegts šīs apmācības galīgais skripts.

#! / 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"izmantošana = "izmantošana: rssget.sh all | apraksts | nosaukums lxer | aboutdotcom | everydaylinuxuser | linuxtoday"displejs = ""url = ""

ja $ # -lt 2 || $ # -gt 2tad echo $ izmantošana; Izeja;fi

gadījumā $ 1 collas visi) displejs = "-d -l -u" ;; apraksts) displejs = "- d -u" ;; nosaukums) displejs = "- u" ;; *) echo $ izmantošana; Izeja; ;;esac

gadījums 2 dolāri iekšā aboutdotcom) url = $ aboutdotcom; ;; lxer) url = $ lxer; ;; linuxtoday) url = $ linuxtoday; ;; everydaylinuxuser) url = $ everydaylinuxuser; ;; *) echo $ izmantošana; Izeja;esac

rsstail $ displejs $ url;

Iepriekš minētais skripts ievieš vairāk RSS plūsmu, un ir izmantošanas mainīgais, kas lietotājam norāda, kā izmantot skriptu, ja tie vai nu neievada 2 mainīgos, vai arī ievadīs nepareizas mainīgo lielumu opcijas.

Kopsavilkums

Tas ir bijis episks raksts, un tas var būt pārāk pārāk drīz. Nākamajā rokasgrāmatā es parādīšu jums visus salīdzinošos variantus IF paziņojumiem, un joprojām ir daudz vairāk runāt par mainīgajiem lielumiem.

Ir arī vairāk, ko var izdarīt, lai uzlabotu iepriekš minēto skriptu, un tas tiks apskatīts turpmākajās rokasgrāmatās, kad mēs izpētīsim cilpas, grep un regulārās izteiksmes.

Lai uzzinātu vairāk noderīgu rokasgrāmatu no dubultās booting sistēmas Windows un Ubuntu, lai izveidotu virtuālo mašīnu, izmantojot GNOME lodziņus, skatiet sadaļu How to (Ritināt uz leju pa kategorijām, lai skatītu rakstu sarakstu) par linux.about.com sadaļu.