Šiandien kalbėsime apie bash scenarijus. tai - komandinės eilutės scenarijai, parašytas bash apvalkalui. Yra ir kitų apvalkalų, tokių kaip zsh, tcsh, ksh, bet mes sutelksime dėmesį į bash. Ši medžiaga skirta visiems, vienintelė sąlyga – galimybė dirbti komandinė eilutė Linux.
Komandinės eilutės scenarijai yra tų pačių komandų rinkiniai, kuriuos galima įvesti iš klaviatūros, surinkti į failus ir sujungti tam tikru bendru tikslu. Tokiu atveju komandų darbo rezultatai gali turėti nepriklausomą vertę arba būti kitų komandų įvesties duomenys. Scenarijai yra galingas būdas automatizuoti dažnai atliekamus veiksmus.
Taigi, jei mes kalbame apie komandų eilutę, ji leidžia vienu metu vykdyti kelias komandas, įvedant jas atskiriant kabliataškiu:
pwd ; whoami
Tiesą sakant, jei išbandėte tai savo terminale, jūsų pirmasis bash scenarijus, apimantis dvi komandas, jau buvo parašytas. Tai veikia taip. Komanda pirma pwd rodoma informacija apie dabartinį darbo katalogą, tada komanda whoamirodo informaciją apie vartotoją, kuriuo esate prisijungę.
Naudodamiesi šiuo metodu, vienoje eilutėje galite sujungti tiek komandų, kiek norite, vienintelis apribojimas yra didžiausias argumentų, kuriuos galima perduoti programai, skaičius. Šią ribą galite apibrėžti naudodami šią komandą:
getconf ARG_MAX
Komandų eilutė yra puikus įrankis, tačiau kiekvieną kartą, kai jų prireikia, turite įvesti komandas. Ką daryti, jei į failą įrašytume komandų rinkinį ir tiesiog iškviestume tą failą, kad jas vykdytume? Tiesą sakant, failas, apie kurį kalbame, vadinamas komandinės eilutės scenarijumi.
Kaip veikia bash scenarijai
Sukurkite tuščią failą naudodami komandą touch. Pirmoje jo eilutėje reikia nurodyti, kurį apvalkalą naudosime. Mus domina bash, todėl pirmoji failo eilutė bus tokia:
#!/bin/bash
Kitose šio failo eilutėse naudojamas maišos simbolis, nurodantis komentarus, kurių apvalkalas neapdoroja. Tačiau pirmoji eilutė yra ypatingas atvejis, yra maiša, po kurios yra šauktukas (ši seka vadinama Shebang) ir kelias į bash, nurodykite sistemai, kuriai scenarijus buvo sukurtas specialiai bash.
Shell komandos yra atskirtos eilutės kanalu, komentarai – maišos ženklu. Štai kaip atrodo:
#!/bin/bash
# This is a comment
pwd
whoami
Čia, kaip ir komandinėje eilutėje, komandas galima rašyti vienoje eilutėje, atskiriant kabliataškiais. Tačiau jei komandas rašote skirtingose eilutėse, failą lengviau skaityti. Bet kokiu atveju apvalkalas juos apdoros.
Scenarijaus failo leidimų nustatymas
Išsaugokite failą suteikdami jam pavadinimą myscript, ir bash scenarijaus kūrimo darbas beveik baigtas. Dabar belieka padaryti šį failą vykdomąjį, kitaip, jei bandysite jį paleisti, susidursite su klaida Permission denied.
Bandoma paleisti scenarijaus failą su netinkamai sukonfigūruotais leidimais
Padarykime failą vykdomąjį:
chmod +x ./myscript
Dabar pabandykime tai įvykdyti:
./myscript
Nustačius leidimus viskas veikia kaip turėtų.
Sėkmingai paleistas bash scenarijus
Pranešimo išvestis
Norėdami išvesti tekstą į Linux konsolę, naudokite komandą echo. Pasinaudokime žiniomis apie šį faktą ir redaguosime savo scenarijų, pridėdami paaiškinimų prie duomenų, kuriuos išveda jame jau esančios komandos:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
Taip nutinka paleidus atnaujintą scenarijų.
Pranešimų išvedimas iš scenarijaus
Dabar galime parodyti aiškinamąsias pastabas naudodami komandą echo. Jei nežinote, kaip redaguoti failą naudodami „Linux“ įrankius, arba anksčiau nematėte komandos echo, pažiūrėk į tai medžiaga.
Kintamųjų naudojimas
Kintamieji leidžia scenarijaus faile saugoti informaciją, pvz., komandų rezultatus, skirtą naudoti kitoms komandoms.
Nėra nieko blogo vykdant atskiras komandas neišsaugojus jų rezultatų, tačiau šio metodo galimybės yra gana ribotos.
Bash scenarijuose gali būti naudojami dviejų tipų kintamieji:
aplinkos įvairovė
Vartotojo kintamieji
aplinkos įvairovė
Kartais apvalkalo komandos turi veikti su kai kuriais sistemos duomenimis. Štai pavyzdys, kaip rodyti dabartinio vartotojo namų katalogą:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
Atkreipkite dėmesį, kad galime naudoti sistemos kintamąjį $HOME dvigubose kabutėse, tai netrukdys sistemai jo atpažinti. Tai, ką gausite, jei vykdysite aukščiau pateiktą scenarijų.
Aplinkos kintamojo naudojimas scenarijuje
Ką daryti, jei ekrane reikia parodyti dolerio ženklą? Pabandykime tai:
echo "I have $1 in my pocket"
Sistema aptiks dolerio ženklą kabutinėje eilutėje ir manys, kad nurodėme kintamąjį. Scenarijus bandys parodyti neapibrėžto kintamojo reikšmę $1. Tai nėra tai, ko mums reikia. Ką daryti?
Šioje situacijoje pabėgimo simbolis, pasvirasis brūkšnys prieš dolerio ženklą padės:
Be aplinkos kintamųjų, bash scenarijai leidžia scenarijuje apibrėžti ir naudoti savo kintamuosius. Tokie kintamieji turi reikšmę tol, kol scenarijus baigs vykdyti.
Kaip ir sistemos kintamuosius, vartotojo kintamuosius galima pasiekti naudojant dolerio ženklą:
TNW-CUS-FMP - reklaminis kodas su 10% nuolaida mūsų paslaugoms, kurį galima aktyvuoti per 7 dienas
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"
Taip nutinka paleidus tokį scenarijų.
Priskirti kintamieji scenarijuje
Komandų pakeitimas
Viena iš naudingiausių bash scenarijų savybių yra galimybė iš komandos išvesties išgauti informaciją ir priskirti ją kintamiesiems, todėl šią informaciją galite naudoti bet kurioje scenarijaus failo vietoje.
Tai galima padaryti dviem būdais.
Varnele "`"
Pagal dizainą $()
Naudodami pirmąjį metodą, būkite atsargūs ir neįtraukite vienos kabutės vietoj varnelės. Komanda turi būti įtraukta į dvi tokias piktogramas:
mydir=`pwd`
Antruoju metodu tas pats parašyta taip:
mydir=$(pwd)
Ir scenarijus gali atrodyti taip:
#!/bin/bash
mydir=$(pwd)
echo $mydir
Jo veikimo metu komandos išvestis pwdbus išsaugotas kintamajame mydir, kurio turinys, naudojant komandą echo, pereis į konsolę.
Scenarijus, kuris išsaugo komandos rezultatus kintamajame
Matematinės operacijos
Norėdami atlikti matematines operacijas scenarijaus faile, galite naudoti tokią konstrukciją kaip $((a+b)):
Kai kuriais atvejais turite kontroliuoti komandų vykdymo eigą. Pavyzdžiui, jei tam tikra reikšmė didesnė už penkis, reikia atlikti vieną veiksmą, kitu atveju – kitą. Tai taikoma daugelyje situacijų, ir čia mums padės valdymo struktūra if-then. Paprasčiausia forma jis atrodo taip:
if команда
then
команды
fi
Štai darbo pavyzdys:
#!/bin/bash
if pwd
then
echo "It works"
fi
Šiuo atveju, jei komanda vykdoma pwdbus sėkmingai užbaigtas, konsolėje bus rodomas tekstas „tai veikia“.
Pasinaudokime turimomis žiniomis ir parašykime sudėtingesnį scenarijų. Tarkime, kad turime rasti tam tikrą vartotoją /etc/passwd, o jei pavyko jį rasti, praneškite, kad jis egzistuoja.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
Taip nutinka paleidus šį scenarijų.
Vartotojo paieška
Čia mes panaudojome komandą grepieškoti vartotojo faile /etc/passwd. Jei komanda grepjums nepažįstamas, jo aprašymą galima rasti čia.
Šiame pavyzdyje, jei vartotojas rastas, scenarijus parodys atitinkamą pranešimą. Ką daryti, jei vartotojo nepavyko rasti? Tokiu atveju scenarijus tiesiog užbaigs vykdymą nieko mums nepasakydamas. Norėtume, kad jis taip pat mums apie tai praneštų, todėl patobulinsime kodą.
jei-tai-kita valdymo konstrukcija
Tam, kad programa galėtų pranešti ir apie sėkmingos paieškos rezultatus, ir apie nesėkmę, panaudosime konstrukciją if-then-else. Štai kaip tai veikia:
if команда
then
команды
else
команды
fi
Jei pirmoji komanda grąžina nulį, o tai reiškia, kad ji buvo sėkmingai įvykdyta, sąlyga bus teisinga ir vykdymas nebus tęsiamas šakoje else. Priešingu atveju, jei grąžinama kažkas kita nei nulis, o tai reikštų gedimą arba klaidingą rezultatą, komandos po to else.
Parašykime tokį scenarijų:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi
Jo egzekucija nukrito į kanalizaciją else.
Scenarijaus vykdymas naudojant „jei-tada-kita“ konstrukciją
Na, eikime toliau ir paklauskime savęs apie sudėtingesnes sąlygas. Ką daryti, jei reikia patikrinti ne vieną sąlygą, o kelias? Pavyzdžiui, jei norimas vartotojas randamas, turi būti rodomas vienas pranešimas, jei įvykdoma kokia nors kita sąlyga, – kitas pranešimas ir pan. Tokioje situacijoje mums padės įdėtos sąlygos. Tai atrodo taip:
if команда1
then
команды
elif команда2
then
команды
fi
Jei pirmoji komanda grąžina nulį, o tai rodo sėkmingą jos vykdymą, bus vykdomos pirmojo bloko komandos then, priešingu atveju, jei pirmoji sąlyga yra klaidinga, o antroji komanda grąžina nulį, bus vykdomas antrasis kodo blokas.
#!/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
Tokiame scenarijuje galite, pavyzdžiui, sukurti naują vartotoją naudodami komandą useradd, jei paieška nedavė rezultatų arba atlikite ką nors kito naudingo.
Skaičių palyginimas
Skriptuose galite palyginti skaitines reikšmes. Žemiau pateikiamas atitinkamų komandų sąrašas.
n1 -eq n2Grąžina tiesa, jei n1 lygus n2. n1 -ge n2 Grąžina tiesa, jei n1daugiau ar lygus n2. n1 -gt n2Grąžina tiesa, jei n1 daugiau nei n2. n1 -le n2Grąžina tiesa, jei n1mažesnis arba lygus n2. n1 -lt n2Grąžina tiesa, jei n1 yra mažesnis nei n2. n1 -ne n2Grąžina tiesa, jei n1ne lygus n2.
Kaip pavyzdį pabandykime vieną iš palyginimo operatorių. Atkreipkite dėmesį, kad išraiška yra laužtiniuose skliaustuose.
#!/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
Štai ką ši komanda išves.
Skaičių palyginimas raštuose
Kintamoji vertė val1didesnis nei 5, šaka baigiama vykdyti thenpalyginimo operatorius ir atitinkamas pranešimas rodomas konsolėje.
Stygų palyginimas
Scenarijai taip pat gali palyginti eilučių reikšmes. Palyginimo operatoriai atrodo gana paprasti, tačiau eilučių palyginimo operacijos turi tam tikrų savybių, kurias paliesime toliau. Čia yra operatorių sąrašas.
str1 = str2 Tikrina eilutes lygybei ir grąžina teisingą, jei eilutės yra identiškos.
str1 != str2Grąžina true, jei eilutės nėra identiškos. str1 < str2Grąžina tiesa, jei str1mažiau nei str2. str1 > str2 Grąžina tiesa, jei str1daugiau nei str2. -n str1 Grąžina tiesa, jei ilgis str1Virš nulio. -z str1Grąžina tiesa, jei ilgis str1lygus nuliui.
Štai scenarijaus eilučių palyginimo pavyzdys:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fi
Vykdydami scenarijų gauname taip.
Eilučių palyginimas scenarijuose
Štai viena stygų palyginimo funkcija, kurią verta paminėti. Būtent, operatoriai ">" ir "<" turi būti pažymėti pasviruoju brūkšniu, kitaip scenarijus neveiks tinkamai, nors klaidų pranešimų ir nepasirodys. Scenarijus ženklą ">" interpretuoja kaip išvesties peradresavimo komandą.
Štai kaip atrodo darbas su šiais operatoriais kode:
#!/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
Štai scenarijaus rezultatai.
Eilučių palyginimas, pateiktas įspėjimas
Atminkite, kad scenarijus, nors ir vykdomas, pateikia įspėjimą:
./myscript: line 5: [: too many arguments
Norėdami atsikratyti šio įspėjimo, darome išvadą $val2 dvigubose kabutėse:
#!/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
Dabar viskas veikia kaip priklauso.
Stygų palyginimas
Kita ">" ir "<" operatorių ypatybė yra tai, kaip jie veikia su didžiosiomis ir mažosiomis raidėmis. Norėdami suprasti šią funkciją, paruošime tekstinį failą su tokiu turiniu:
Likegeeks
likegeeks
Išsaugokime jį suteikdami pavadinimą myfile, tada terminale paleiskite šią komandą:
sort myfile
Jis surūšiuos eilutes iš failo taip:
likegeeks
Likegeeks
Komanda sort, pagal numatytuosius nustatymus rūšiuoja eilutes didėjančia tvarka, tai yra, mūsų pavyzdyje mažoji raidė yra mažesnė nei didžioji. Dabar paruošime scenarijų, kuris palygins tas pačias eilutes:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
Jei paleisite, paaiškės, kad viskas yra atvirkščiai – mažoji raidė dabar didesnė nei didžioji.
Rūšiavimo komanda ir eilučių palyginimas scenarijaus faile
Lyginamosiose komandose didžiosios raidės yra mažesnės nei mažosios. Eilučių palyginimas čia atliekamas lyginant simbolių ASCII kodus, todėl rūšiavimo tvarka priklauso nuo simbolių kodų.
Komanda sort, savo ruožtu, naudoja rūšiavimo tvarką, nurodytą sistemos kalbos nustatymuose.
Failų patikrinimai
Galbūt bash scenarijuose dažniausiai naudojamos šios komandos. Jie leidžia patikrinti įvairias failų sąlygas. Čia yra šių komandų sąrašas.
-d filePatikrina, ar failas egzistuoja ir ar yra katalogas. -e filePatikrina, ar failas egzistuoja. -f file Patikrina, ar failas egzistuoja ir yra failas. -r filePatikrina, ar failas egzistuoja ir ar jis skaitomas. -s file ПPatikrina, ar failas egzistuoja ir ar jis nėra tuščias. -w filePatikrina, ar failas egzistuoja ir ar jį galima įrašyti. -x filePatikrina, ar failas egzistuoja ir ar jis vykdomas. file1 -nt file2 Patikrina, ar jis naujesnis file1Kaip file2. file1 -ot file2Patikrina ar senesnis file1Kaip file2. -O file Patikrina, ar failas egzistuoja ir ar jis priklauso dabartiniam vartotojui. -G filePatikrina, ar failas egzistuoja ir ar jo grupės ID sutampa su dabartinio vartotojo grupės ID.
Šias komandas, kaip ir daugelį kitų šiandien aptartų, lengva įsiminti. Jų pavadinimai, būdami įvairių žodžių santrumpos, tiesiogiai nurodo jų atliekamus patikrinimus.
Išbandykime vieną iš komandų praktiškai:
#!/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
Šis scenarijus, skirtas esamam katalogui, parodys jo turinį.
Katalogo turinio sąrašas
Tikime, kad su likusiomis komandomis galite eksperimentuoti patys, jos visos naudojamos pagal tą patį principą.
rezultatai
Šiandien mes kalbėjome apie tai, kaip pradėti rašyti bash scenarijus, ir aptarėme keletą pagrindinių dalykų. Tiesą sakant, bash programavimo tema yra didžiulė. Šis straipsnis yra didelės 11 medžiagų serijos pirmosios dalies vertimas. Jei norite tęsti dabar, čia yra šių medžiagų originalų sąrašas. Patogumui čia įtrauktas vertimas, kurį ką tik perskaitėte.
Bash scenarijus žingsnis po žingsnio — čia kalbama apie tai, kaip pradėti kurti bash scenarijus, apmąstomas kintamųjų naudojimas, aprašomos sąlyginės struktūros, skaičiavimai, skaičių, eilučių palyginimai, informacijos apie failus išsiaiškinimas.
„Bash Scripting“ 3 dalis, parametrai ir parinktys — ši medžiaga skirta komandų eilutės parametrams ir raktams, kurie gali būti perduodami scenarijams, darbui su duomenimis, kuriuos vartotojas įveda ir kuriuos galima nuskaityti iš failų.
„Bash Scripting“ 11 dalis, laukite komandos — ši medžiaga skirta Expect įrankiui, su kuriuo galite automatizuoti sąveiką su interaktyviomis programomis. Visų pirma, mes kalbame apie laukiamus scenarijus ir jų sąveiką su bash scenarijais ir kitomis programomis.
Manome, kad viena iš vertingų šios straipsnių serijos savybių yra ta, kad pradedant nuo paprasčiausio, tinkančio bet kokio lygio vartotojams, palaipsniui pereinama prie gana rimtų temų, suteikiančių galimybę kiekvienam tobulėti kuriant Linux komandinės eilutės scenarijus. .
Mieli skaitytojai! Bash programavimo guru prašome pasikalbėti apie tai, kaip jie pasiekė savo meistriškumo aukštumas, pasidalinti savo paslaptimis, o įspūdžių laukiame ką tik parašiusių pirmąjį scenarijų.
Apklausoje gali dalyvauti tik registruoti vartotojai. Prisijungti, Prašau.