Täna räägime bash-skriptidest. see - käsurea skriptid, kirjutatud bash-shelli jaoks. On ka teisi kestasid, nagu zsh, tcsh, ksh, kuid me keskendume bashile. See materjal on mõeldud kõigile, ainsaks tingimuseks on töövõime käsurida Linux.
Käsurea skriptid on samade käskude kogumid, mida saab sisestada klaviatuurilt, koguda failidesse ja ühendada mõne ühise eesmärgiga. Sel juhul võivad meeskondade töö tulemused olla iseseisva väärtusega või olla sisendandmeteks teistele meeskondadele. Skriptid on võimas viis sageli sooritatavate toimingute automatiseerimiseks.
Niisiis, kui me räägime käsurealt, siis see võimaldab teil täita mitu käsku korraga, sisestades need semikooloniga eraldatuna:
pwd ; whoami
Tegelikult, kui proovisite seda oma terminalis, on teie esimene kahte käsku sisaldav bash-skript juba kirjutatud. See toimib nii. Meeskond esimene pwd kuvab teavet praeguse töökataloogi ja seejärel käsu kohta whoaminäitab teavet selle kasutaja kohta, kellena olete sisse logitud.
Seda lähenemist kasutades saate ühele reale kombineerida nii palju käske kui soovite, ainsaks piiranguks on programmile edastatavate argumentide maksimaalne arv. Selle piirangu saate määrata järgmise käsuga:
getconf ARG_MAX
Käsurida on suurepärane tööriist, kuid käske tuleb sisestada iga kord, kui neid vaja läheb. Mis siis, kui kirjutaksime faili käsud ja kutsuksime selle faili lihtsalt nende täitmiseks? Tegelikult nimetatakse faili, millest me räägime, käsurea skriptiks.
Kuidas bash-skriptid töötavad
Looge käsuga tühi fail touch. Selle esimene rida peab näitama, millist kesta me kasutame. Oleme huvitatud bash, seega on faili esimene rida:
#!/bin/bash
Selle faili teised read kasutavad räsimärki, et näidata kommentaare, mida kest ei töötle. Esimene rida on aga erijuhtum, seal on räsi, millele järgneb hüüumärk (seda jada nimetatakse shebang) ja tee bash, osutage süsteemile, mille jaoks skript on spetsiaalselt loodud bash.
Shelli käsud on eraldatud reavahetusega, kommentaarid on eraldatud räsimärgiga. See näeb välja selline:
#!/bin/bash
# This is a comment
pwd
whoami
Siin saab sarnaselt käsureale kirjutada käsud ühele reale, eraldades need semikooloniga. Kui aga kirjutada käsud erinevatele ridadele, on faili lihtsam lugeda. Igal juhul töötleb kest neid.
Skriptifaili õiguste määramine
Salvestage fail, andes sellele nime myscriptja bash-skripti loomise töö on peaaegu lõppenud. Nüüd jääb üle vaid see fail käivitatavaks muuta, muidu kui proovite seda käivitada, tekib tõrge Permission denied.
Proovitakse käivitada skriptifaili valesti konfigureeritud õigustega
Teeme faili käivitatavaks:
chmod +x ./myscript
Nüüd proovime seda teostada:
./myscript
Pärast lubade seadistamist töötab kõik nii nagu peab.
Bash-skripti käivitamine õnnestus
Sõnumi väljund
Teksti väljastamiseks Linuxi konsooli kasutage käsku echo. Kasutame selle fakti teadmisi ja redigeerime oma skripti, lisades selgitused andmetele, mida selles juba olevad käsud väljastavad:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
See juhtub pärast värskendatud skripti käivitamist.
Sõnumite väljastamine skriptist
Nüüd saame käsu abil kuvada selgitavad märkused echo. Kui te ei tea, kuidas faili Linuxi tööriistade abil redigeerida või te pole seda käsku varem näinud echo, viska pilk peale see materjali.
Muutujate kasutamine
Muutujad võimaldavad salvestada skriptifaili teavet, näiteks käskude tulemusi, et seda saaks kasutada teised käsud.
Üksikute käskude täitmisel ilma nende tulemusi salvestamata pole midagi halba, kuid selle lähenemisviisi võimalused on üsna piiratud.
Bash-skriptides saab kasutada kahte tüüpi muutujaid:
Keskkonnamuutujad
Kasutaja muutujad
Keskkonnamuutujad
Mõnikord peavad shellikäsud töötama teatud süsteemiandmetega. Siin on näide praeguse kasutaja kodukataloogi kuvamiseks:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
Pange tähele, et saame kasutada süsteemimuutujat $HOME jutumärkides, ei takista see süsteemil seda ära tunda. See on see, mida saate ülaltoodud stsenaariumi käivitamisel.
Keskkonnamuutuja kasutamine skriptis
Mida teha, kui teil on vaja ekraanile kuvada dollarimärk? Proovime seda:
echo "I have $1 in my pocket"
Süsteem tuvastab tsiteeritud stringis dollarimärgi ja eeldab, et oleme viidanud muutujale. Skript püüab kuvada määratlemata muutuja väärtust $1. See pole see, mida me vajame. Mida teha?
Sellises olukorras aitab paomärk, kaldkriips enne dollarimärki:
echo "I have $1 in my pocket"
Skript väljastab nüüd täpselt seda, mida oodatakse.
Põgenemisjärjestuse kasutamine dollarimärgi printimiseks
Kasutaja muutujad
Lisaks keskkonnamuutujatele võimaldavad bash-skriptid määratleda ja kasutada skriptis oma muutujaid. Sellised muutujad hoiavad väärtust kuni skripti täitmise lõpuni.
Nagu süsteemimuutujate puhul, pääseb kasutaja muutujatele juurde dollarimärgi abil:
TNW-CUS-FMP - sooduskood meie teenustelt 10% allahindluseks, aktiveerimiseks saadaval 7 päeva jooksul
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"
See juhtub pärast sellise skripti käivitamist.
Kohandatud muutujad skriptis
Käskude asendamine
Bash-skriptide üks kõige kasulikumaid funktsioone on võime eraldada käsuväljundist teavet ja määrata see muutujatele, võimaldades teil seda teavet kasutada skriptifailis kõikjal.
Seda saab teha kahel viisil.
Kasutades märki "`"
Disaini järgi $()
Kui kasutate esimest lähenemist, olge ettevaatlik, et mitte lisada seljamärgi asemel ühte jutumärki. Käsk peab olema ümbritsetud kahe sellise ikooniga:
mydir=`pwd`
Teises lähenemises kirjutatakse sama asi järgmiselt:
mydir=$(pwd)
Ja skript võib lõpuks välja näha selline:
#!/bin/bash
mydir=$(pwd)
echo $mydir
Selle töö ajal käsu väljund pwdsalvestatakse muutujasse mydir, mille sisu, kasutades käsku echo, läheb konsooli.
Skript, mis salvestab käsu tulemused muutujasse
Matemaatilised tehted
Skriptifailis matemaatiliste toimingute tegemiseks võite kasutada konstruktsiooni nagu $((a+b)):
Mõne stsenaariumi korral peate juhtima käsu täitmise voogu. Näiteks kui teatud väärtus on suurem kui viis, peate tegema ühe toimingu, vastasel juhul teise. See on rakendatav paljudes olukordades ja siin aitab meid juhtimisstruktuur if-then. Kõige lihtsamal kujul näeb see välja järgmine:
if команда
then
команды
fi
Siin on toimiv näide:
#!/bin/bash
if pwd
then
echo "It works"
fi
Sel juhul, kui käsk täidetakse pwdedukalt lõpule viidud, kuvatakse konsoolis tekst "see töötab".
Kasutame oma teadmisi ja kirjutame keerulisema stsenaariumi. Oletame, et peame leidma kindla kasutaja /etc/passwdja kui teil õnnestus see leida, andke teada, et see on olemas.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
See juhtub pärast selle skripti käivitamist.
Kasutaja otsing
Siin kasutasime käsku grepfailist kasutaja otsimiseks /etc/passwd. Kui meeskond grepteile võõras, selle kirjelduse leiate siin.
Selles näites, kui kasutaja leitakse, kuvab skript vastava teate. Mis siis, kui kasutajat ei leitud? Sel juhul lõpetab skript lihtsalt täitmise ilma meile midagi ütlemata. Soovime, et ta meile ka sellest räägiks, nii et me parandame koodi.
kui-siis-muidu juhtkonstruktsioon
Selleks, et programm saaks aru anda nii eduka otsingu kui ka ebaõnnestumise tulemustest, kasutame konstruktsiooni if-then-else. See toimib järgmiselt.
if команда
then
команды
else
команды
fi
Kui esimene käsk tagastab nulli, mis tähendab, et see täideti edukalt, on tingimus tõene ja täitmine ei jätku haru kaudu else. Vastasel juhul, kui tagastatakse midagi muud kui null, mis viitaks ebaõnnestumisele või valele tulemusele, käsud pärast else.
Kirjutame järgmise 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 hukkamine läks tühjaks else.
Skripti käitamine if-then-else konstruktsiooniga
Noh, lähme edasi ja küsime endalt keerulisemate tingimuste kohta. Mis siis, kui peate kontrollima mitte ühte, vaid mitut tingimust? Näiteks kui soovitud kasutaja leitakse, tuleb kuvada üks teade, kui mõni muu tingimus on täidetud, siis teine teade jne. Sellises olukorras aitavad meid pesastatud tingimused. See näeb välja selline:
if команда1
then
команды
elif команда2
then
команды
fi
Kui esimene käsk tagastab nulli, mis näitab selle edukat täitmist, täidetakse esimese ploki käsud then, vastasel juhul, kui esimene tingimus on väär ja kui teine käsk tagastab nulli, käivitatakse teine koodiplokk.
#!/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
Sellises skriptis saab näiteks käsu abil luua uue kasutaja useradd, kui otsing ei andnud tulemusi või tehke midagi muud kasulikku.
Numbrite võrdlus
Skriptides saate võrrelda arvväärtusi. Allpool on asjakohaste käskude loend.
n1 -eq n2Tagastab tõesuse, kui n1 võrdub n2. n1 -ge n2 Tagastab tõesuse, kui n1rohkem või võrdne n2. n1 -gt n2Tagastab tõesuse, kui n1 parem n2. n1 -le n2Tagastab tõesuse, kui n1väiksem või võrdne n2. n1 -lt n2Tagastab tõene, kui n1 on väiksem kui n2. n1 -ne n2Tagastab tõesuse, kui n1mitte võrdne n2.
Näitena proovime üht võrdlusoperaatorit. Pange tähele, et väljend on nurksulgudes.
#!/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"
fi
See on see, mida see käsk väljastab.
Numbrite võrdlus skriptides
Muutuv väärtus val1suurem kui 5, siis haru täidetakse thenvõrdlusoperaator ja konsoolis kuvatakse vastav teade.
Stringide võrdlus
Skriptid võivad võrrelda ka stringi väärtusi. Võrdlusoperaatorid näevad välja üsna lihtsad, kuid stringide võrdlusoperatsioonidel on teatud funktsioonid, mida me allpool käsitleme. Siin on operaatorite loend.
str1 = str2 Testib stringide võrdsust, tagastades tõene, kui stringid on identsed.
str1 != str2Tagastab tõene, kui stringid ei ole identsed. str1 < str2Tagastab tõesuse, kui str1vähem kui str2. str1 > str2 Tagastab tõesuse, kui str1rohkem kui str2. -n str1 Tagastab tõene, kui pikkus str1Üle nulli. -z str1Tagastab tõene, kui pikkus str1võrdne nulliga.
Siin on näide stringide võrdlemisest skriptis:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fi
Skripti täitmise tulemusena saame järgmise.
Stringide võrdlemine skriptides
Siin on üks stringide võrdlemise funktsioon, mida tasub mainida. Nimelt tuleb operaatorid ">" ja "<" paotada kaldkriipsuga, vastasel juhul ei tööta skript õigesti, kuigi veateateid ei ilmu. Skript tõlgendab märki ">" väljundi ümbersuunamise käsuna.
Nende operaatoritega töötamine koodis näeb välja järgmine:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
Siin on skripti tulemused.
Stringide võrdlus, hoiatus antud
Pange tähele, et kuigi skript on käivitatud, annab see hoiatuse:
./myscript: line 5: [: too many arguments
Sellest hoiatusest vabanemiseks järeldame $val2 jutumärkides:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
Nüüd töötab kõik nii nagu peab.
Stringide võrdlus
Operaatorite ">" ja "<" teine omadus on see, kuidas nad töötavad suur- ja väiketähtedega. Selle funktsiooni mõistmiseks valmistame ette järgmise sisuga tekstifaili:
Likegeeks
likegeeks
Salvestame selle nime andes myfile, seejärel käivitage terminalis järgmine käsk:
sort myfile
See sorteerib faili read järgmiselt:
likegeeks
Likegeeks
Meeskond sort, vaikimisi sorteerib stringid kasvavas järjekorras, see tähendab, et meie näite väiketäht on väiksem kui suur. 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"
fi
Kui seda käivitada, selgub, et kõik on vastupidi – väiketäht on nüüd suurem kui suur.
Skriptifaili sortimiskäsk ja stringide võrdlemine
Võrdluskäskudes on suurtähed väiksemad kui väikesed tähed. Stringide võrdlemine toimub siin märkide ASCII koodide võrdlemise teel, sortimisjärjekord sõltub seega märgikoodidest.
Meeskond sortkasutab omakorda süsteemi keeleseadetes määratud sortimisjärjekorda.
Failide kontrollid
Võib-olla kasutatakse bash-skriptides kõige sagedamini järgmisi käske. Need võimaldavad teil kontrollida failide erinevaid tingimusi. Siin on nende käskude loend.
-d fileKontrollib, kas fail on olemas ja kas see on kataloog. -e fileKontrollib, kas fail on olemas. -f file Kontrollib, kas fail on olemas ja kas see on fail. -r fileKontrollib, kas fail on olemas ja loetav. -s file ПKontrollib, kas fail on olemas ja kas see pole tühi. -w fileKontrollib, kas fail on olemas ja kirjutatav. -x fileKontrollib, kas fail on olemas ja käivitatav. file1 -nt file2 Kontrollib, kas see on uuem file1kui file2. file1 -ot file2Kontrollib, kas vanem file1kui file2. -O file Kontrollib, kas fail on olemas ja kuulub praegusele kasutajale. -G fileKontrollib, kas fail on olemas ja kas selle grupi ID ühtib praeguse kasutaja grupi ID-ga.
Neid käske, nagu ka paljusid teisi täna käsitletavaid, on lihtne meeles pidada. Nende nimed, mis on lühendid erinevatest sõnadest, näitavad otseselt nende teostatavaid kontrolle.
Proovime ühte käskudest 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"
fi
See olemasoleva kataloogi skript kuvab selle sisu.
Kataloogi sisu loetlemine
Usume, et ülejäänud käskudega saate ise katsetada, neid kõiki kasutatakse samal põhimõttel.
Tulemused
Täna rääkisime bash-skriptide kirjutamise alustamisest ja käsitlesime mõningaid põhiteadmisi. Tegelikult on bashi programmeerimise teema tohutu. See artikkel on suure 11 materjalist koosneva sarja esimese osa tõlge. Kui soovite praegu jätkata, siis siin on nende materjalide originaalide loend. Mugavuse huvides on siin lisatud tõlge, mille just lugesite.
Bashi skript samm-sammult — siin räägitakse sellest, kuidas alustada bash-skriptide loomist, käsitletakse muutujate kasutamist, kirjeldatakse tinglikke struktuure, arvutusi, arvude, stringide võrdlemist ning failide kohta info väljaselgitamist.
Bashi skriptimise osa 3, parameetrid ja valikud — see materjal on pühendatud käsurea parameetritele ja võtmetele, mida saab skriptidele edastada ning mis töötavad andmetega, mida kasutaja sisestab ja mida saab lugeda failidest.
Bashi skriptimise osa 11, oodake käsku — see materjal on pühendatud tööriistale Expect, mille abil saate interaktiivsete utiliitidega suhtlemist automatiseerida. Eelkõige räägime oodatavatest skriptidest ja nende koostoimest bash-skriptide ja muude programmidega.
Usume, et selle artiklisarja üks väärtuslikke omadusi on see, et alustades kõige lihtsamast, mis sobib iga taseme kasutajatele, viib see järk-järgult üsna tõsiste teemadeni, andes kõigile võimaluse Linuxi käsurea skriptide loomisel edasi liikuda. .
Head lugejad! Palume bash-programmeerimisgurudel rääkida, kuidas nad oma meisterlikkuse kõrgustele jõudsid, oma saladusi jagada ning ootame muljeid neilt, kes just oma esimese stsenaariumi kirjutasid.
Küsitluses saavad osaleda ainult registreerunud kasutajad. Logi sissepalun.
Kas ma peaksin tõlkima ülejäänud artiklite sarja?
Jah!
Pole vaja
1030 kasutajat hääletas. 106 kasutajat jäi erapooletuks.