Bash scenarijai: pradžia

Bash scenarijai: pradžia
„Bash“ scenarijai 2 dalis: kilpos
„Bash“ scenarijai, 3 dalis: komandų eilutės parinktys ir jungikliai
„Bash“ scenarijai 4 dalis: įvestis ir išvestis
„Bash“ scenarijai, 5 dalis: signalai, fono užduotys, scenarijų valdymas
„Bash Scripts“, 6 dalis: funkcijos ir bibliotekos kūrimas
„Bash“ scenarijai, 7 dalis: sed ir tekstų apdorojimas
Bash scenarijai, 8 dalis: awk duomenų apdorojimo kalba
„Bash“ scenarijai 9 dalis: reguliarieji reiškiniai
„Bash“ scenarijai 10 dalis: praktiniai pavyzdžiai
Bash scenarijai, 11 dalis: interaktyvių paslaugų laukimas ir automatizavimas

Š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.

Bash scenarijai: pradžia

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.

Bash scenarijai: pradžia

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.

Bash scenarijai: pradžia
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ų.

Bash scenarijai: pradžia
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ų.

Bash scenarijai: pradžia
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ų.

Bash scenarijai: pradžia
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:

echo "I have $1 in my pocket"

Dabar scenarijus išves tiksliai tai, ko tikimasi.

Bash scenarijai: pradžia
Pabėgimo sekos naudojimas dolerio ženklui spausdinti

Vartotojo kintamieji

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ų.

Bash scenarijai: pradžia
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ę.

Bash scenarijai: pradžia
Scenarijus, kuris išsaugo komandos rezultatus kintamajame

Matematinės operacijos

Norėdami atlikti matematines operacijas scenarijaus faile, galite naudoti tokią konstrukciją kaip $((a+b)):

#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2

Bash scenarijai: pradžia
Matematinės operacijos scenarijuje

jei-tai valdymo konstrukcija

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ų.

Bash scenarijai: pradžia
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.

Bash scenarijai: pradžia
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.

Bash scenarijai: pradžia
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.

Bash scenarijai: pradžia
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.

Bash scenarijai: pradžia
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.

Bash scenarijai: pradžia
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.

Bash scenarijai: pradžia
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į.

Bash scenarijai: pradžia
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.

  1. 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.
  2. Bash scenarijaus 2 dalis, Bash the awesome — čia atskleidžiamos darbo su for ir while ypatybės.
  3. „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ų.
  4. Bash Scripting 4 dalis, įvestis ir išvestis - Čia mes kalbame apie failų aprašus ir darbą su jais, apie įvestį, išvestį, klaidų srautus ir apie išvesties peradresavimą.
  5. Bash scenarijaus 5 dalis, Sighals & Jobs — ši medžiaga skirta Linux signalams, jų apdorojimui scenarijuose ir scenarijų paleidimui pagal grafiką.
  6. Bash Scripting 6 dalis, funkcijos — čia galite sužinoti apie scenarijų funkcijų kūrimą ir naudojimą bei bibliotekų kūrimą.
  7. Bash scenarijaus 7 dalis, naudojant sed — šis straipsnis skirtas darbui su sed srautinio perdavimo teksto rengyklėmis.
  8. Bash scenarijaus 8 dalis, awk naudojimas — ši medžiaga skirta programavimui awk duomenų apdorojimo kalba.
  9. Bash Scripting 9 dalis, reguliarūs reiškiniai - čia galite perskaityti apie reguliariųjų išraiškų naudojimą bash scenarijuose.
  10. „Bash Scripting“ 10 dalis, praktiniai pavyzdžiai - čia yra darbo su pranešimais, kurie gali būti siunčiami vartotojams, metodai, taip pat disko stebėjimo metodas.
  11. „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ų.

Bash scenarijai: pradžia

Apklausoje gali dalyvauti tik registruoti vartotojai. Prisijungti, Prašau.

Ar turėčiau išversti likusią straipsnių seriją?

  • Taip!

  • Nereikia

Balsavo 1030 vartotojų. 106 vartotojai susilaikė.

Šaltinis: www.habr.com

Добавить комментарий