Bash skripte: začetek

Bash skripte: začetek
Bash skripte 2. del: Zanke
Skripti Bash, 3. del: Možnosti in stikala ukazne vrstice
Skripti Bash, 4. del: Vnos in izhod
Skripti Bash, 5. del: Signali, opravila v ozadju, upravljanje skriptov
Skripti Bash, 6. del: Funkcije in razvoj knjižnice
Bash skripti, 7. del: sed in obdelava besedila
Skripti bash, 8. del: jezik za obdelavo podatkov awk
Skripti Bash, 9. del: Regularni izrazi
Skripti Bash, 10. del: Praktični primeri
Bash skripti, 11. del: pričakovati in avtomatizirati interaktivne pripomočke

Danes bomo govorili o bash skriptih. to - skripti ukazne vrstice, napisano za lupino bash. Obstajajo še druge lupine, kot so zsh, tcsh, ksh, vendar se bomo osredotočili na bash. To gradivo je namenjeno vsakomur, edini pogoj je sposobnost dela v ukazna vrstica Linux.

Bash skripte: začetek

Skripti ukazne vrstice so zbirke istih ukazov, ki jih je mogoče vnesti s tipkovnice, zbrati v datoteke in jih združiti z nekim skupnim namenom. V tem primeru so lahko rezultati dela timov samostojne vrednosti ali pa služijo kot vhodni podatki za druge time. Skripti so zmogljiv način za avtomatizacijo pogosto izvajanih dejanj.

Bash skripte: začetek

Torej, če govorimo o ukazni vrstici, vam omogoča, da izvedete več ukazov hkrati, tako da jih vnesete ločene s podpičjem:

pwd ; whoami

Pravzaprav, če ste to poskusili v svojem terminalu, je bil vaš prvi bash skript, ki vključuje dva ukaza, že napisan. Deluje takole. Najprej ekipa pwd prikaže informacije o trenutnem delovnem imeniku, nato ukaz whoamiprikazuje informacije o uporabniku, kot ste prijavljeni.

S tem pristopom lahko kombinirate poljubno število ukazov v eni vrstici, edina omejitev je največje število argumentov, ki jih lahko posredujete programu. To omejitev lahko določite z naslednjim ukazom:

getconf ARG_MAX

Ukazna vrstica je odlično orodje, vendar morate vanjo vnesti ukaze vsakič, ko jih potrebujete. Kaj pa, če bi zapisali niz ukazov v datoteko in preprosto poklicali to datoteko, da jih izvrši? Pravzaprav se datoteka, o kateri govorimo, imenuje skript ukazne vrstice.

Kako delujejo bash skripti

Z ukazom ustvarite prazno datoteko touch. Njegova prva vrstica mora navesti, katero lupino bomo uporabili. Zanima nas bash, zato bo prva vrstica datoteke:

#!/bin/bash

Druge vrstice v tej datoteki uporabljajo simbol za označevanje komentarjev, ki jih lupina ne obdela. Vendar je prva vrstica poseben primer, tam je zgoščena vrednost, ki ji sledi klicaj (to zaporedje se imenuje shebang) in pot do bash, nakazujejo sistemu, za katerega je bil skript ustvarjen posebej bash.

Ukazi ukazne lupine so ločeni s premikom v vrstico, komentarji so ločeni z znakom zrnca. Takole izgleda:

#!/bin/bash
# This is a comment
pwd
whoami

Tukaj lahko, tako kot v ukazni vrstici, pišete ukaze v eno vrstico, ločene s podpičji. Če pa ukaze zapišete v različne vrstice, je datoteka lažje berljiva. V vsakem primeru jih bo lupina obdelala.

Nastavitev dovoljenj skriptne datoteke

Shranite datoteko in ji dajte ime myscript, in delo pri ustvarjanju skripta bash je skoraj končano. Zdaj ostane le še, da naredite to datoteko izvršljivo, sicer boste, če jo poskusite zagnati, naleteli na napako Permission denied.

Bash skripte: začetek
Poskus zagona skriptne datoteke z nepravilno konfiguriranimi dovoljenji

Naredimo datoteko izvršljivo:

chmod +x ./myscript

Zdaj pa ga poskusimo izvesti:

./myscript

Po nastavitvi dovoljenj vse deluje kot mora.

Bash skripte: začetek
Skript bash se uspešno izvaja

Izhod sporočila

Za izpis besedila v konzolo Linux uporabite ukaz echo. Uporabimo znanje o tem dejstvu in uredimo naš skript ter dodamo pojasnila podatkom, ki jih izpišejo ukazi, ki so že v njem:

#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami

To se zgodi po zagonu posodobljenega skripta.

Bash skripte: začetek
Izpisovanje sporočil iz skripta

Zdaj lahko z ukazom prikažemo pojasnila echo. Če ne znate urejati datoteke z orodji Linux ali ukaza še niste videli echo, Poglej ta material.

Uporaba spremenljivk

Spremenljivke vam omogočajo shranjevanje informacij v datoteko skripta, kot so rezultati ukazov, za uporabo z drugimi ukazi.

Nič ni narobe z izvajanjem posameznih ukazov brez shranjevanja njihovih rezultatov, vendar je ta pristop precej omejen v svojih zmožnostih.

V skriptih bash lahko uporabite dve vrsti spremenljivk:

  • Spremenljivke okolja
  • Uporabniške spremenljivke

Spremenljivke okolja

Včasih morajo lupinski ukazi delovati z nekaterimi sistemskimi podatki. Tukaj je primer, kako prikazati domači imenik trenutnega uporabnika:

#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"

Upoštevajte, da lahko uporabimo sistemsko spremenljivko $HOME v dvojnih narekovajih, to sistemu ne bo preprečilo, da bi ga prepoznal. To dobite, če zaženete zgornji scenarij.

Bash skripte: začetek
Uporaba spremenljivke okolja v skriptu

Kaj pa, če morate na zaslonu prikazati znak za dolar? Poskusimo tole:

echo "I have $1 in my pocket"

Sistem bo zaznal znak za dolar v narekovanem nizu in domneval, da smo se sklicevali na spremenljivko. Skript bo poskušal prikazati vrednost nedefinirane spremenljivke $1. To ni tisto, kar potrebujemo. Kaj storiti?

V tej situaciji vam bo pomagala uporaba ubežnega znaka, poševnice nazaj, pred znakom za dolar:

echo "I have $1 in my pocket"

Skript bo zdaj izpisal točno tisto, kar se pričakuje.

Bash skripte: začetek
Uporaba ubežnega zaporedja za tiskanje znaka za dolar

Uporabniške spremenljivke

Poleg spremenljivk okolja vam skripti bash omogočajo definiranje in uporabo lastnih spremenljivk v skriptu. Takšne spremenljivke imajo vrednost, dokler skript ne zaključi izvajanja.

Tako kot pri sistemskih spremenljivkah lahko tudi do uporabniških spremenljivk dostopate z znakom za dolar:
TNW-CUS-FMP - promocijska koda za 10% popust na naše storitve, na voljo za aktivacijo v 7 dneh

#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"

To se zgodi po zagonu takega skripta.

Bash skripte: začetek
Spremenljivke po meri v skriptu

Zamenjava ukaza

Ena najbolj uporabnih funkcij skriptov bash je zmožnost ekstrahiranja informacij iz izhoda ukaza in njihove dodelitve spremenljivkam, kar vam omogoča uporabo teh informacij kjer koli v datoteki skripta.

To lahko naredimo na dva načina.

  • Uporaba povratne kljukice "`"
  • Po zasnovi $()

Pri uporabi prvega pristopa bodite previdni, da ne vključite enega samega narekovaja namesto povratne kljukice. Ukaz mora biti obdan z dvema takšnima ikonama:

mydir=`pwd`

Pri drugem pristopu je ista stvar zapisana takole:

mydir=$(pwd)

In skript bi lahko na koncu izgledal takole:

#!/bin/bash
mydir=$(pwd)
echo $mydir

Med njegovim delovanjem izhod ukaza pwdbo shranjen v spremenljivki mydir, katerega vsebino z ukazom echo, bo šel na konzolo.

Bash skripte: začetek
Skript, ki shrani rezultate ukaza v spremenljivko

Matematične operacije

Za izvajanje matematičnih operacij v skriptni datoteki lahko uporabite konstrukt, kot je $((a+b)):

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

Bash skripte: začetek
Matematične operacije v skriptu

če-potem kontrolni konstrukt

V nekaterih scenarijih morate nadzorovati potek izvajanja ukazov. Na primer, če je določena vrednost večja od pet, morate izvesti eno dejanje, sicer drugo. To je uporabno v številnih situacijah in tukaj nam bo pomagala nadzorna struktura if-then. V najpreprostejši obliki je videti takole:

if команда
then
команды
fi

Tukaj je delujoč primer:

#!/bin/bash
if pwd
then
echo "It works"
fi

V tem primeru, če se ukaz izvede pwdse uspešno zaključi, bo na konzoli prikazano besedilo »deluje«.

Uporabimo znanje, ki ga imamo, in napišimo bolj zapleten scenarij. Recimo, da moramo najti določenega uporabnika v /etc/passwd, in če vam ga je uspelo najti, sporočite, da obstaja.

#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi

To se zgodi po zagonu tega skripta.

Bash skripte: začetek
Iskanje uporabnikov

Tukaj smo uporabili ukaz grepza iskanje uporabnika v datoteki /etc/passwd. Če ekipa grepne poznate, lahko najdete njegov opis tukaj.

V tem primeru, če je uporabnik najden, bo skript prikazal ustrezno sporočilo. Kaj pa, če uporabnika ni bilo mogoče najti? V tem primeru bo skript preprosto dokončal izvedbo, ne da bi nam kaj povedal. Želeli bi, da nam pove tudi o tem, zato bomo izboljšali kodo.

kontrolni konstrukt if-then-else

Da bo program lahko poročal tako o rezultatih uspešnega iskanja kot o neuspehu, bomo uporabili konstrukcijo if-then-else. Takole deluje:

if команда
then
команды
else
команды
fi

Če prvi ukaz vrne nič, kar pomeni, da je bil uspešno izveden, bo pogoj resničen in izvajanje se ne bo nadaljevalo po veji else. V nasprotnem primeru, če je vrnjeno nekaj drugega kot nič, kar bi pomenilo napako ali napačen rezultat, se ukazi za else.

Napišimo naslednji skript:

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi

Njegova usmrtitev je šla v vodo else.

Bash skripte: začetek
Izvajanje skripta s konstrukcijo if-then-else

No, pojdimo naprej in se vprašajmo o kompleksnejših pogojih. Kaj pa, če morate preveriti ne en pogoj, ampak več? Na primer, če je želeni uporabnik najden, se mora prikazati eno sporočilo, če je izpolnjen kakšen drug pogoj, se mora prikazati drugo sporočilo itd. V takšni situaciji nam bodo pomagali ugnezdeni pogoji. Videti je takole:

if команда1
then
команды
elif команда2
then
команды
fi

Če prvi ukaz vrne nič, kar pomeni njegovo uspešno izvedbo, bodo ukazi v prvem bloku izvedeni then, sicer, če je prvi pogoj napačen in če drugi ukaz vrne nič, bo izveden drugi blok kode.

#!/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

V takem skriptu lahko na primer z ukazom ustvarite novega uporabnika useradd, če iskanje ni prineslo rezultatov, ali naredite kaj drugega koristnega.

Primerjava števil

V skriptih lahko primerjate številske vrednosti. Spodaj je seznam ustreznih ukazov.

n1 -eq n2Vrne true if n1 enako n2.
n1 -ge n2 Vrne true if n1več ali enako n2.
n1 -gt n2Vrne true if n1 več kot n2.
n1 -le n2Vrne true if n1manj ali enako n2.
n1 -lt n2Vrne true, če je n1 manjši od n2.
n1 -ne n2Vrne true if n1ni enako n2.

Kot primer poskusimo enega od primerjalnih operatorjev. Upoštevajte, da je izraz v oglatih oklepajih.

#!/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

To bo izpisal ta ukaz.

Bash skripte: začetek
Primerjava števil v pisavah

Spremenljiva vrednost val1večje od 5, se veja na koncu izvrši thenprimerjalni operator in na konzoli se prikaže ustrezno sporočilo.

Primerjava nizov

Skripti lahko tudi primerjajo vrednosti nizov. Operatorji primerjave so videti precej preprosti, vendar imajo operacije primerjave nizov določene lastnosti, ki se jih bomo dotaknili v nadaljevanju. Tukaj je seznam operaterjev.

str1 = str2 Preveri enakost nizov in vrne true, če so nizi enaki.
str1 != str2Vrne true, če nizi niso enaki.
str1 < str2Vrne true if str1manj kot str2.
str1 > str2 Vrne true if str1več kot str2.
-n str1 Vrne true, če je dolžina str1Nad ničlo.
-z str1Vrne true, če je dolžina str1je nič.

Tukaj je primer primerjave nizov v skriptu:

#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fi

Kot rezultat izvajanja skripta dobimo naslednje.

Bash skripte: začetek
Primerjava nizov v skriptih

Tukaj je ena lastnost primerjave nizov, ki jo je vredno omeniti. Operaterja ">" in "<" namreč morata biti ubežna s poševnico nazaj, sicer skript ne bo deloval pravilno, čeprav se ne bodo pojavila sporočila o napakah. Skript interpretira znak ">" kot ukaz za preusmeritev izhoda.

Tukaj je videti delo s temi operaterji v kodi:

#!/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

Tukaj so rezultati scenarija.

Bash skripte: začetek
Primerjava nizov, podano opozorilo

Upoštevajte, da skript, čeprav se izvaja, izda opozorilo:

./myscript: line 5: [: too many arguments

Da se znebimo tega opozorila, zaključimo $val2 v dvojnih narekovajih:

#!/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

Zdaj vse deluje kot mora.

Bash skripte: začetek
Primerjava nizov

Druga značilnost operatorjev ">" in "<" je, kako delujejo z velikimi in malimi črkami. Da bi razumeli to funkcijo, pripravimo besedilno datoteko z naslednjo vsebino:

Likegeeks
likegeeks

Shranimo ga tako, da mu damo ime myfile, nato zaženite naslednji ukaz v terminalu:

sort myfile

Vrstice iz datoteke bo razvrstil takole:

likegeeks
Likegeeks

Ekipa sort, privzeto razvršča nize v naraščajočem vrstnem redu, kar pomeni, da je mala črka v našem primeru manjša od velike. Zdaj pa pripravimo skript, ki bo primerjal iste nize:

#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Če ga zaženete, se izkaže, da je vse obratno - mala črka je zdaj večja od velike.

Bash skripte: začetek
Ukaz za razvrščanje in primerjava nizov v datoteki skripta

V ukazih za primerjavo so velike črke manjše od malih črk. Primerjava nizov tukaj poteka s primerjavo ASCII kod znakov, vrstni red je torej odvisen od znakovnih kod.

Ekipa sort, pa uporablja vrstni red razvrščanja, določen v sistemskih jezikovnih nastavitvah.

Preverjanje datotek

Morda se v skriptih bash najpogosteje uporabljajo naslednji ukazi. Omogočajo preverjanje različnih pogojev glede datotek. Tukaj je seznam teh ukazov.

-d filePreveri, ali datoteka obstaja in ali je imenik.
-e filePreveri, ali datoteka obstaja.
-f file Preveri, ali datoteka obstaja in je datoteka.
-r filePreveri, ali datoteka obstaja in ali je berljiva.
-s file ПPreveri, ali datoteka obstaja in ni prazna.
-w filePreveri, ali datoteka obstaja in ali je zapisljiva.
-x filePreveri, ali datoteka obstaja in je izvršljiva.
file1 -nt file2 Preveri, če je novejši file1Kot file2.
file1 -ot file2Preveri, če je starejši file1Kot file2.
-O file Preveri, ali datoteka obstaja in je v lasti trenutnega uporabnika.
-G filePreveri, ali datoteka obstaja in ali se njen ID skupine ujema z ID-jem skupine trenutnega uporabnika.

Te ukaze, kot tudi številne druge, o katerih danes razpravljamo, si je enostavno zapomniti. Njihova imena, ki so okrajšave različnih besed, neposredno nakazujejo preglede, ki jih izvajajo.

Poskusimo enega od ukazov v praksi:

#!/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

Ta skript bo za obstoječi imenik prikazal njegovo vsebino.

Bash skripte: začetek
Izpisovanje vsebine imenika

Verjamemo, da lahko s preostalimi ukazi eksperimentirate sami, vsi se uporabljajo po istem principu.

Rezultati

Danes smo se pogovarjali o tem, kako začeti pisati bash skripte in obravnavali nekaj osnovnih stvari. Pravzaprav je tema bash programiranja ogromna. Ta članek je prevod prvega dela velike serije 11 gradiv. Če želite nadaljevati zdaj, je tukaj seznam izvirnikov teh materialov. Zaradi priročnosti je tukaj vključen prevod, ki ste ga pravkar prebrali.

  1. Bash skript korak za korakom — tukaj govorimo o tem, kako se lotiti ustvarjanja bash skriptov, obravnavana je uporaba spremenljivk, opisane so pogojne strukture, izračuni, primerjave števil, nizov in iskanje informacij o datotekah.
  2. Bash Scripting Part 2, Bash the awesome — tukaj so razkrite značilnosti dela z zankami for in while.
  3. Bash Scripting Del 3, Parametri in možnosti — to gradivo je posvečeno parametrom in ključem ukazne vrstice, ki jih je mogoče posredovati skriptom, ki delajo s podatki, ki jih uporabnik vnese in jih je mogoče prebrati iz datotek.
  4. Bash skriptiranje, 4. del, vnos in izhod - tukaj govorimo o deskriptorjih datotek in delu z njimi, o vhodu, izhodu, tokovih napak in o preusmeritvi izhoda.
  5. Bash Scripting Part 5, Sighals & Jobs — to gradivo je posvečeno signalom Linuxa, njihovi obdelavi v skriptih in zagonu skriptov po urniku.
  6. Bash Scripting 6. del, Funkcije — tukaj se lahko naučite o ustvarjanju in uporabi funkcij v skriptih in razvijanju knjižnic.
  7. Bash Scripting Del 7, Uporaba sed — ta članek je posvečen delu z urejevalnikom pretočnega besedila sed.
  8. Bash Scripting Del 8, Uporaba awk — to gradivo je posvečeno programiranju v jeziku za obdelavo podatkov awk.
  9. Bash skriptiranje, 9. del, Regularni izrazi — tukaj lahko preberete o uporabi regularnih izrazov v bash skriptih.
  10. Bash skriptiranje, 10. del, praktični primeri — tukaj so tehnike za delo s sporočili, ki jih je mogoče poslati uporabnikom, kot tudi metoda za nadzor diska.
  11. Bash Scripting Part 11, Expect Command — to gradivo je namenjeno orodju Expect, s katerim lahko avtomatizirate interakcijo z interaktivnimi pripomočki. Predvsem govorimo o pričakovanih skriptih in njihovi interakciji s skripti bash in drugimi programi.

Menimo, da je ena od dragocenih lastnosti te serije člankov ta, da začenši od najpreprostejšega, primernega za uporabnike katere koli ravni, postopoma vodi do zelo resnih tem, kar vsakomur daje možnost napredovanja pri ustvarjanju skriptov ukazne vrstice Linux .

Dragi bralci! Guruje bash programiranja prosimo, da spregovorijo o tem, kako so dosegli vrhunec mojstrstva, delijo svoje skrivnosti in veselimo se vtisov tistih, ki so pravkar napisali svoj prvi scenarij.

Bash skripte: začetek

V anketi lahko sodelujejo samo registrirani uporabniki. Prijaviti se, prosim.

Ali naj prevedem preostalo serijo člankov?

  • Ja!

  • Ne, ni potrebe

Glasovalo je 1030 uporabnikov. 106 uporabnikov se je vzdržalo.

Vir: www.habr.com

Dodaj komentar