Täna räägime bash-skriptidest. See on — , mis on kirjutatud bash-keskkonnas. On ka teisi keskkondi, näiteks — zsh, tcsh, ksh, kuid keskendume bashile. See materjal on mõeldud kõigile, kes soovivad, ainus tingimus on oskus töötada Linuxis.
Käsuread on käskude kogumid, mida saab klaviatuurilt sisestada, kogutud failidesse ja ühendatud mingi ühise eesmärgiga. Samas võivad käskude töötamise tulemused olla kas iseseisev väärtus või teenida sisendina teistele käskudele. Skriptid on võimas viis sageli korduvate toimingute automatiseerimiseks.
Nii et, kui rääkida käsurealt, võib käske täita mitu korraga, sisestades need läbi semikooloni:
pwd ; whoami Tegelikult, kui olete seda oma terminaalis proovinud, on teie esimene bash-skript, millel on kaks käsku, juba kirjutatud. See töötab nii. Esiteks, käsk pwd väljastab ekraanile teavet praeguse töökausta kohta, seejärel käsk whoamikannab süsteemi alloleva kasutaja andmed.
Sarnase lähenemisega saate ühendada samaaegselt nii palju käsklusi, kui soovite, piirang on vaid maksimaalne argumentide arv, mida programmile edastada saab. Selle piirangu määramine on võimalik järgmise käsu abil:
getconf ARG_MAXKäskude rida on suurepärane tööriist, kuid käske tuleb sisestada iga kord, kui need on vajalikud. Mis oleks, kui salvestada käskude kogum faili ja lihtsalt kutsuda see fail nende täitmiseks? Tegelikult on see fail, millest räägime, käskude rida.
Kuidas on bash-skriptid üles ehitatud
Looge tühi fail, kasutades käsku touch. Esimese reana tuleb näidata, millist lõpetust me soovime kasutada. Meid huvitab bash, seega on faili esimene rida järgmine:
#!/bin/bash Selle faili teistes ridades tähistab ristikujuline märk kommentaare, mida lõpetus ei töötle. Siiski on esimene rida erand, siin on ristikujuline märk, millele järgneb hüüdemärk (seda järjestust nimetatakse ) ja tee bash, näitavad süsteemile, et skript on loodud just bash.
Käskude lõpetus eraldatakse reavahetuse märgiga, kommentaarid eristatakse ristikujulise märgiga. Nii see välja näeb:
#!/bin/bash
# This is a comment
pwd
whoamiSiin, nagu ka käsureal, on võimalik kirjutada käske ühel real, eraldades need semikooloniga. Siiski, kui kirjutada käske erinevatesse ridadesse, on faili mõista kergem. Igal juhul töötleb lõpetus neid.
Faili skripti õiguste seadmine
Salvesta fail, andes sellele nime myscript, ja töö bash-skripti loomise kallal on peaaegu valmis. Praegu on jäänud vaid muuta see fail täidetavaks, vastasel juhul, kui proovite seda käivitada, leiate endale vea Permission denied.

Skripti faili käivitamise katse valede õiguste seadistamisega
Teeme failist täidetava:
chmod +x .\/myscriptNüüd proovime seda käivitada:
.\/myscriptPärast õiguste seadmist töötab kõik nagu peab.

Bash-skripti edukas käivitamine
Sõnumite väljund
Teksti väljastamiseks Linuxi konsoolis kasutatakse käsku echo. Kasutame seda teadmist ja redigeerime meie skripti, lisades selgitusi andmetele, mida juba olemasolevad käsklused väljastavad:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiNii näeb välja käivitamisejärgne uuendatud skript.

Sõnumite väljund skriptist
Nüüd saame väljastada selgitavaid pealkirju, kasutades käsku echo. Kui te ei tea, kuidas faili redigeerida, kasutades Linuxi, või ei ole varem kohtunud käsuga echo, vaadake materjali.
Muude muutujate kasutamine
Muutujad võimaldavad salvestada skriptifailis teavet, näiteks — käskude tulemusi, et kasutada neid teiste käskude juures.
Ei ole midagi halba, kui täita üksikuid käske ilman nende tulemuste salvestamiseta, kuid sellise lähenemise võimalused on üsna piiratud.
On kaks tüüpi muutujaid, mida saab kasutada bash-skriptides:
- Keskkonnamuutujad
- Kasutaja määratud muutujad
Keskkonnamuutujad
Mõnikord tuleb shelli käskudes töötada teatud süsteemsete andmetega. Näiteks, kuidas trükkida praeguse kasutaja kodukausta:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Pange tähele, et me saame kasutada süsteemset muutujat $HOME kaksikutejutistes, see ei takista süsteemi selle tuvastamast. Siin on, mis juhtub, kui käivitada ülaltoodud skript.

Keskkonnamuutuja kasutamine skriptis
Ent mis siis, kui soovime ekraanile trükkida dollarimärki? Proovime nii:
echo "I have $1 in my pocket" Süsteem tuvastab dollarimärgi tsiteeritud reas ja arvab, et viidame muutuja väärtusele. Skript püüab ekraanile trükkida määramata muutuja väärtuse $1. See ei ole see, mida me vajame. Mida teha?
Sellises olukorras aitab kasutada juhtmärk, tagurpidi kaldkriips, dollarimärgi ees:
echo "I have $1 in my pocket"Nüüd trükib skript täpselt seda, mida ootasime.

Juhtmärkide kasutamine dollarimärgi trükkimiseks
Kasutaja määratud muutujad
Lisaks keskkonnamuutujatele võimaldavad bash-skriptid määrata ja kasutada skriptis ka kasutaja muutujaid. Need muutujad säilitavad oma väärtuse kuni skripti täitmine on lõpetatud.
Nagu süsteemsete muutujate puhul, saab kasutaja muutujatele viidata dollarimärgiga:
TNW-CUS-FMP — 10% sooduskupon meie teenustele, mis on saadaval aktiveerimiseks 7 päeva jooksul
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Siin on, mis juhtub pärast sellise skripti käivitamist.

Kasutaja muutujad skriptis
Käskude asendamine
Üks bash-skriptide kasulikumaid omadusi on võimalus väljundist teavet välja tõmmata ja määrata see muutujatele, mis võimaldab selle teabe kasutamist kõikjal skriptifailis.
Seda saab teha kahel viisil.
- Tagurpidi jutumärgi «`» abil
- Konstruktsiooni abil
$()
Esimese lähenemisega veenduge, et ei sisestata tagurpidi jutumärgi asemel ühtegi tavalist jutumärki. Käsk tuleb sulguda kahe sellise märgiga:
mydir=`pwd`Teise lähenemisega kirjutatakse sama nii:
mydir=$(pwd)Ja skript võib lõppenud kujul välja näha nii:
#!/bin/bash
mydir=$(pwd)
echo $mydir Selle käigus salvestatakse käsu väljund pwdmuutujasse mydir, mille sisu, kasutades käsku echo, jõuab konsooli.

Skript, mis salvestab käsu tulemused muutuja sisse
Matemaatilised toimingud
Matemaatiliste operatsioonide tegemiseks skriptifailis saab kasutada konstruktsiooni nagu $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Matemaatilised operatsioonid skriptis
Kontrollstruktuur if-then
Mõnes skriptis on vajalik juhtida käskude juhtimist. Näiteks, kui mingisugune väärtus on suurem kui viis, tuleb teostada üks tegevus, vastasel juhul – teine. See on rakendatav paljude olukordade puhul, ning siin aitab meid kontrollstruktuur if-then. Lihtsaim versioon näeb välja nii:
if käsk
then
käskud
fiSiin on töötav näide:
#!/bin/bash
if pwd
then
echo "It works"
fi Antud juhul, kui käsk pwdtäitmine õnnestub, kuvatakse konsoolis tekst "it works".
Kasutan olemasolevaid teadmisi ja kirjutan keerukama skripti. Oletame, et peame leidma mingi kasutaja /etc/passwd, ja kui seda õnnestub leida, teavitame, et ta eksisteerib.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiNii näeb see välja pärast skripti käivitamist.

Kasutaja otsimine
Siin kasutasime käsku grepkasutaja leidmiseks failis /etc/passwd. Kui käsk grepon teile tundmatu, siis selle kirjeldus on saadaval .
Selles näites, kui kasutaja leitakse, kuvab skript vastava teate. Aga kui kasutaja leidmine ei õnnestu? Sellisel juhul lõpetab skript lihtsalt täitmise, teatamata meile sellest. Soovime, et ta meile ka sellest räägiks, seega täiustame koodi.
Kontrollstruktuur if-then-else
Et programm saaks teavitada nii edukatest leidmistest kui ka ebaõnnestumisest, kasutame konstruktsiooni if-then-else. Nii see toimib:
if käsk
then
käskud
else
käskud
fi Kui esimene käsk tagastab nulli, mis tähistab selle eduka täitmist, osutub tingimus tõeseks ja täitmine ei lähe haru muul juhul. Vastupidisel juhul, kui tagastatakse midagi, mis erineb nullist, mis tähistab ebaõnnestumist või vale tulemust, täidetakse käskud, mis on pärast muul juhul.
Kirjutame sellise skripti:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Tema täitmine läks haru muul juhul.

Skripti käivitamine konstruktsiooniga if-then-else
Nii, jätkame edasi ja küsime keerulisemate tingimuste kohta. Mida teha, kui on vaja kontrollida mitte ühte, vaid mitut tingimust? Näiteks, kui vajalik kasutaja on leitud, peaksime kuvama ühe sõnumi, kui lisatingimus on täidetud — teise sõnumi jne. Sarnases olukorras aitavad meid sissetallatud tingimused. See näeb välja selline:
if käsk1
then
käsklused
elif käsk2
then
käsklused
fi Kui esimene käsk tagastab nulli, mis näitab selle eduka täitmise, täidetakse käsklused esimeses plokis. siis, vastasel juhul, kui esimene tingimus osutub vale olevaks, ja kui teine käsk tagastab nulli, täidetakse teise ploki kood.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi Sarnases skriptis võib näiteks luua uue kasutaja käsklusega useradd, kui otsing ei too tulemusi, või teha midagi muud kasulikku.
Numbrite võrdlemine
Skriptides saab võrrelda arvulisi väärtusi. Allpool on loetelu vastavatest käsklustest.
n1 -eq n2Tagastab tõese väärtuse, kuin1size / bsn2.
n1 -ge n2Tagastab tõese väärtuse, kuin1suurem või võrdnen2.
n1 -gt n2Tagastab tõese väärtuse, kuin1ei nõuta enamn2.
n1 -le n2Tagastab tõese väärtuse, kuin1väiksem või võrdnen2.
n1 -lt n2Tagastab tõese väärtuse, kui n1 on väiksemn2.
n1 -ne n2Tagastab tõese väärtuse, kuin1ei ole võrdnen2.
Näiteks proovime ühte võrdlusoperaatorit. Pange tähele, et väljend on sulgudes.
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fiSee on, mida see käsk kuvab.

Numbrite võrdlemine skriptides
Muu muutuja väärtus val1suurem kui 5, mille tulemusena täidetakse võrdlusoperaatori haru ja konsooli kuvatakse vastav sõnum. siisStringide võrdlemine
Skeemides saab võrrelda ka stringiväärtusi. Võrdlusoperaatorid näevad üsna lihtsad välja, kuid stringide võrdlemisel on teatud eripärad, millega me allpool tutvume. Siin on loetelu operaatoritest.
str1 = str2
Kontrollib, kas stringid on võrdsed, tagastab tõeteate, kui stringid on identsed.tr1 != str2
sTagastab tõeteate, kui stringid ei ole identsed.str1 < str2
Tagastab tõeteate, kuistr1on väiksem kuistr2str1 > str2.
suurem kuistr1on väiksem kui-n str1str1 > str2.
Tagastab tõeteate, kui pikkuson suurem nullist.on väiksem kui-z str1
on võrdne nulliga.on suurem nullist.on väiksem kuiSiin on näide stringide võrdlemisest skriptis:
Skripti täitmise tulemus on järgmine.
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiStringide võrdlemine skriptides

Skripti stringide võrdlemine
Siin on üks stringide võrdlemise eripära, millest tasub rääkida. Nimelt tuleb operaatorid „>” ja „” kui väljundi suunamise käsku.
Nii näeb nende operaatoritega töötamine välja koodis:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiSiin on skripti töö tulemused.

Stringide võrdlemine, väljastatud hoiatus
Pange tähele, et skript, kuigi see täidetakse, väljastab hoiatuse:
./myscript: line 5: [: liiga palju argumente Kuna sellest hoiatust lahti saada, paneme $val2 kahe jutumargi vahele:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiNüüd töötab kõik nagu peab.

Skeemides saab võrrelda ka stringiväärtusi. Võrdlusoperaatorid näevad üsna lihtsad välja, kuid stringide võrdlemisel on teatud eripärad, millega me allpool tutvume. Siin on loetelu operaatoritest.
Veel üks operaatorite „>” ja „<” eripära seisneb selles, kuidas nad töötavad suur- ja väiketähtedega. Selle eripära mõistmiseks valmistan ette tekstifaili sellise sisuga:
Likegeeks
likegeeks Salvestame selle nimega myfile, seejärel täidame terminalis sellise käsu:
sort myfileSee sorteerib faili read järgmiselt:
likegeeks
Likegeeks Meeskond sort, vaikimisi sorteerib read kasvavat. See tähendab, et väike täht meie näites on väiksem kui suur täht. Nüüd valmistame ette skripti, mis võrdleb samu stringe:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiKui seda käivitada, selgub, et kõik on vastupidi - väike täht on nüüd suurest tähtest suurem.

Käsk sort ja stringide võrdlemine skripti failis
Võrdluskaaludes on suured tähed väikestest väiksemad. Stringide võrdlemine toimub ASCII koodide võrdlemise kaudu, seega sõltub sortimisjärjekord sümbolite koodidest.
Meeskond sort, omakorda kasutab järjestus, mille määrab süsteemi keele seaded.
Failide kontrollid
Võib-olla, allpool toodud käsud on bash-skriptides kõige sagedamini kasutatavad. Need võimaldavad kontrollida erinevaid tingimusi, mis puudutavad faile. Siin on nende käskude loetelu.
-d fileKontrollib, kas fail eksisteerib ja kas see on kaust.
-e fileKontrollib, kas fail eksisteerib.
-f fileKontrollib, kas fail eksisteerib ja kas see on fail.
-r fileKontrollib, kas fail eksisteerib ja kas sellele on juurdepääs lugemiseks.
-s fileKontrollib, kas fail eksisteerib ja kas see ei ole tühi.
-w fileKontrollib, kas fail eksisteerib ja kas sellele on juurdepääs kirjutamiseks.
-x fileKontrollib, kas fail eksisteerib ja kas see on täidetav.
file1 -nt file2Kontrollib, kas on uuemfile1, kuifile2.
file1 -ot file2Kontrollib, kas on vanemfile1, kuifile2.
-O fileKontrollib, kas fail eksisteerib ja kas selle omanik on praegune kasutaja.
-G fileKontrollib, kas fail eksisteerib ja kas selle grupi identifikaator vastab praeguse kasutaja grupi identifikaatorile.
Need käsud, nagu paljusid teisi, mida täna käsitlesime, on lihtne meeles pidada. Nende nimed, olles lühendatud erinevatest sõnadest, näitavad otseselt, milliseid kontrollimisi nad teevad.
Proovi üks käsk praktikas:
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fiSee skript, olemasoleva katalooge jaoks, kuvab selle sisu.

Katalooge sisu väljastamine
Oletame, et teiste käskudega suudate ise katsetada, kõik need toimivad sama põhimõtte järgi.
Summary
Täna rääkisime sellest, kuidas alustada bash-skriptide kirjutamist ja käsitlesime mõningaid põhilisi teemasid. Tegelikult on bash-programmeerimise teema tohutu. See artikkel on tõlge mahuka seeria esimese osa 11 materjalist. Kui soovite jätku kohe - siin on nende materjalide originaallinkide nimekiri. Mugavuse huvides on siia ka lisatud see, mille tõlge on just loetud.
- — selles räägitakse, kuidas alustada bash-skriptide loomist, käsitletakse muutujate kasutamist, kirjeldatakse tingimuslikke konstruktsioone, arvutusi, numbrite ja stringide võrdlemist, küsimist failide kohta.
- — siin käsitletakse for ja while tsüklite töö eripära.
- — see materjal käsitleb käsurea parameetreid ja võtmeid, mis võivad skripti edasi minna, samuti andmeid, mida sisestab kasutaja ja mida on võimalik lugeda failidest.
- — siin räägitakse failide descriptoritest ja nende kasutamisest, sisendi, väljundi ja vigade voogudest, väljundi suunamisest.
- — see materjal käsitleb Linuxi signaale, nende töötlemist skriptides ja skriptide käivitamist ajakava järgi.
- — siin saab teada, kuidas funktsioonide loomine ja kasutamine skriptides, raamatukogude arendamine.
- — see artikkel käsitleb voolava tekstiredaktori sed kasutamist.
- — see materjal käsitleb andmetöötluse keele awk programmeerimist.
- — siin saab lugeda, kuidas kasutada regulaaravaldusi bash-skriptides.
- — siin on toodud meetodeid sõnumite töötlemiseks, mida saab kasutajatele saata, samuti meetodeid ketta jälgimiseks.
- — see materjal käsitleb Expect'i tööriista, millega saab automatiseerida interaktiivsete utiliitidega suhtlemist. Eelkõige räägitakse siin expect-skriptidest ja nende koostööst bash-skriptide ja teiste programmide kanssa.
Peame oluliseks, et selle artiklite sarja üks väärtuslikimaid omadusi on see, et see alustab kõige lihtsamast, mis sobib igasuguse tasemega kasutajatele, ja suunab järk-järgult tõsistele teemadele, andes võimaluse kõigile, kes soovivad, edusammude saavutamiseks Linuxi käsurea skriptide loomises.
Austatud lugejad! Palume bash-programmeerimise eksperte jagada, kuidas nad saavutasid oma oskustes tipptaseme, jagada saladusi, ja ootame muljeid nendelt, kes just kirjutasid oma esimese skripti.
Ainult registreeritud kasutajad saavad küsitluses osaleda. , palun.
Kas tõlkida teiste artiklite osad?
Jah!
Ei, ei ole vajalik
Hääletas 1030 kasutajat. Erakuks jäi 106 kasutajat.
Allikas: habr.com
