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

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:

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 / bash
rsstail -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" sakrīt ar līnijām starp laiku un fi ir izpildīti.

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 ievada cits paziņojumu. 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š minētais skripts ievieš elifu, kas ir īss veids, kā pateikt ELSE IF.

Tagad skripts darbojas šādi. Ja jūs palaidīsiet sh rssget.sh visu, tad saņemsiet aprakstus, saites un nosaukumus. Ja tā vietā jūs vienkārši palaižat sh rssget.sh aprakstu, jū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;
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

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
fi
fi

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īnija, ja [$ 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 vēl nav ziņojuma par ārējo IF.

Tāpat arī 4. rindiņā rinda, ja [$ 1 = "all"] || [$ 1 = "apraksts"] || [$ 1 = "title"] pārbauda, ​​vai 1. parametrs ir vienāds ar vai nu "visu", vai "aprakstu" vai "titulu".

Tagad, ja lietotājs iet sh rssget.sh kartupeļu siers nekas nav atgriezies, kamēr pirms tie būtu saņēmuši sarakstu ar nosaukumiem no LXER.

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 2]
tad

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
fi
fi

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 2]
tad
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
;;
esac
fi

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

Piemēram, šī loģika

IF augļi = banāni
Tad tas ir
ELSE IF augļi = apelsīni
Tad tas ir
ELSE IF augļi = vīnogas
Tad tas ir
END 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 lieta, ko jūs salīdzināt (ti, augļi). 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 2]
tad
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;
;;
esac
rsstail $ 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 2]
tad
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 "Kā in" (Ritināt uz leju pa kategorijām, lai skatītu rakstu sarakstu), kas atrodas l inux.about.com.