Bash skripti: uvod

Bash skripti: uvod
Bash skripti, del 2: zanke
Bash skripti, del 3: parametri in ključi ukazne vrstice
Bash skripti, del 4: vhod in izhod
Bash skripti, del 5: signali, naloge v ozadju, upravljanje skriptami
Bash skripti, del 6: funkcije in razvoj knjižnic
Bash skripti, del 7: sed in obdelava besedil
Bash skripti, del 8: jezik obdelave podatkov awk
Bash skripti, del 9: regularni izrazi
Bash skripti, del 10: praktični primeri
Bash skripti, del 11: expect in avtomatizacija interaktivnih pripomočkov

Danes se bomo pogovarjali o bash skriptih. To so ukazne vrstice, napisane za lupino bash. Obstajajo tudi druge lupine, kot so zsh, tcsh, ksh, vendar se bomo osredotočili na bash. Ta material je namenjen vsem, ki želijo, edini pogoj je, da znate delati v ukazni vrstici Linux.

Bash skripti: uvod

Ukazne vrstice so nizi istih ukazov, ki jih je možno vnašati s tipkovnico, zbrane v datoteke in združene z nečim skupnim namenom. Pri tem rezultati izvajanja ukazov lahko predstavljajo bodisi samostojno vrednost bodisi služijo kot vhodni podatki za druge ukaze. Skripti so močan način avtomatizacije pogosto izvedenih dejanj.

Bash skripti: uvod

Torej, če govorimo o ukazni vrstici, omogoča izvedbo več ukazov naenkrat, če jih vnesete preko pike s podaljškom:

pwd ; whoami

Dejansko, če ste to preizkusili v svojem terminalu, je vaš prvi bash skript, v katerem sta bili vključeni dve ukazni, že napisan. Deluje tako. Najprej ukaz pwd izpiše informacije o trenutnem delovnem imeniku, nato ukaz whoamiprikazuje podatke o uporabniku, pod katerim ste se prijavili v sistem.

Z uporabo takšnega pristopa lahko kombinirate poljubno število ukazov v eni vrstici, omejitev je le maksimalno število argumentov, ki jih lahko posredujete programu. To omejitev možete določiti s pomočjo takšnega ukaza:

getconf ARG_MAX

Ukazna vrstica je odlično orodje, toda ukaze je potrebno vnašati vsakič, ko jih potrebujete. Kaj pa, če zapišete niz ukazov v datoteko in preprosto pokličete to datoteko za njihovo izvedbo? V bistvu, ta datoteka, o kateri govorimo, se imenuje skript ukazne vrstice.

Kako so struktura bash skripti

Ustvarite prazno datoteko s pomočjo ukaza touch. V prvi vrsti moramo navesti, katero ovojnico nameravamo uporabiti. Zanimajo nas bash, zato bo prva vrstica datoteke takšna:

#!/bin/bash

V drugih vrsticah te datoteke se simbol ostre kvadratne oznake uporablja za označevanje komentarjev, ki jih ovojnica ne obdeluje. Vendar je prva vrstica posebna in tukaj je ostre kvadratne oznake, za katero sledi klicaj (to zaporedje imenujemo shebang) in pot do bash, kar sistemu sporoči, da je skript ustvarjen natančno za bash.

Ukazi ovojnice so ločeni z znakom za prelome vrstic, komentarji pa so označeni s simbolom ostre kvadratne oznake. Tako to izgleda:

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

Tukaj, tako kot v ukazni vrstici, lahko v eni vrstici zapišete ukaze, ki jih ločite z vejico. Vendar je, če pišete ukaze v različnih vrsticah, datoteko lažje brati. V vsakem primeru jo bo ovojnica obdelala.

Nastavitev dovoljenja za datoteko skripte

Shranjevanje datoteke z imenom myscript, in delo na ustvarjanju bash skripte je skoraj končano. Sedaj je le še treba narediti to datoteko izvršno, sicer se boste ob poskusu njenega zagona srečali z napako Permission denied.

Bash skripti: uvod
Poskus zagon datoteke skripte z nepravilno nastavljenimi dovoljenji

Naredimo datoteko izvršno:

chmod +x .\/myscript

Zdaj poskusimo izvesti:

.\/myscript

Po nastavitvi dovoljenj vse deluje kot je treba.

Bash skripti: uvod
Uspešen zagon bash skripte

Izhod sporočil

Za izhod besedila v Linux konzolo uporabljamo ukaz echo. Izkoristimo to dejstvo in uredimo naš skript, da dodamo pojasnila podatkom, ki jih prikazujejo že obstoječi ukazi:

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

Tako bo videti po zagonu posodobljenega skripta.

Bash skripti: uvod
Izhod sporočil iz skripta

Zdaj lahko izpisujemo pojasnilna besedila z uporabo ukaza echo. Če ne veste, kako urediti datoteko, z orodji Linux ali prejšnja srečanja z ukazom echo, si poglejte ta gradivo.

Uporaba spremenljivk

Spremenljivke omogočajo shranjevanje informacij v datoteki skripte, na primer — rezultate izvajanja ukazov za uporabo z drugimi ukazi.

Ni nič slabega v izvajanju posameznih ukazov brez shranjevanja rezultatov njihovega dela, vendar so možnosti takšnega pristopa zelo omejene.

Obstajata dva tipa spremenljivk, ki jih lahko uporabite v bash skriptah:

  • Spremenljivke okolja
  • Uporabniške spremenljivke

Spremenljivke okolja

Včasih je potrebno delati s sistemskimi podatki v ukaznih vrsticah. Tukaj je primer, kako prikazati domačo imenik trenutnega uporabnika:

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

Upoštevajte, da lahko uporabimo sistemsko spremenljivko $DOM v dvojnicah, kar ne bo ovira, da jo sistem prepozna. Tukaj je, kaj se zgodi, če izvedete zgoraj navedeni skript.

Bash skripti: uvod
Uporaba okoljske spremenljivke v skriptu

Kaj pa, če želimo na zaslon izpisati znak dolarja? Poskusimo tako:

echo "I have $1 in my pocket"

Sistem bo prepoznal znak dolarja v nizu, omejenem z dvojnicami, in se bo odločil, da smo se sklicevali na spremenljivko. Skript bo poskusil prikazati vrednost nedoločene spremenljivke $1. To ni tisto, kar potrebujemo. Kaj storiti?

V takšni situaciji lahko pomaga uporaba kontrolnega znaka, obratne poševnice, pred znakom dolarja:

echo "I have $1 in my pocket"

Zdaj bo skript izpisal točno tisto, kar pričakujemo.

Bash skripti: uvod
Uporaba kontrolne sekvence za izpis znaka dolarja

Uporabniške spremenljivke

Poleg okoljskih spremenljivk, bash skripti omogočajo definiranje in uporabo lastnih spremenljivk v skriptu. Takšne spremenljivke hranijo vrednost do konca izvajanja skripta.

Kot pri sistemskih spremenljivkah, lahko tudi do uporabniških spremenljivk dostopamo z znakom dolarja:
TNW-CUS-FMP — promocijska koda za 10% popust na naše storitve, aktivna v 7 dneh

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

Tukaj je, kaj se zgodi po zagonu takega skripta.

Bash skripti: uvod
Uporabniške spremenljivke v skriptu

Vstavljanje ukazov

Ena najkoristnejših možnosti bash skriptov je, da lahko izvlečemo informacije iz izhoda ukazov in jih dodelimo spremenljivkam, kar nam omogoča, da te informacije uporabljamo kjerkoli v datoteki skripta.

To lahko storimo na dva načina.

  • Z uporabo obratenega apostrofa „`“
  • Z uporabo konstrukcije $()

Pri prvem pristopu pazite, da namesto obratenega apostrofa ne vnesete enojne pike. Ukaz mora biti zaprt v dveh takšnih znakih:

mydir=`pwd`

Pri drugem pristopu to zapišemo tako:

mydir=$(pwd)

Skripta bo na koncu izgledala takole:

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

Med izvajanjem se bo izhod ukaza pwdshranil v spremenljivki mydir, katere vsebina bo s pomočjo ukaza echo, prišla v konzolo.

Bash skripti: uvod
Skripta, ki shranjuje rezultate dela ukaza v spremenljivki

Matematične operacije

Za izvedbo matematičnih operacij v skriptnem datoteki lahko uporabite strukturo, kot je $((a+b)):

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

Bash skripti: uvod
Matematične operacije v scenariju

Upravna struktura if-then

V nekaterih scenarijih je potrebna kontrola toka izvajanja ukazov. Na primer, če je neka vrednost večja od pet, je treba izvesti eno dejanje, sicer drugo. To je uporabno v mnogih situacijah in tukaj nam bo pomagala upravna struktura. if-then. V najpreprostejši obliki izgleda tako:

if ukaz
then
ukazi
fi

Tukaj je delovni primer:

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

V tem primeru, če se izvajanje ukaza pwdzaključi uspešno, bo v konzoli izpisano besedilo 'it works'.

Izkoristimo svoje znanje in napišimo bolj zapleten scenarij. Recimo, da moramo najti nekega uporabnika v /etc/passwd, in če ga najdemo, sporočiti, da obstaja.

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

Tako izgleda po zagonu te skripte.

Bash skripti: uvod
Iskanje uporabnika

Tukaj smo uporabili ukaz grepza iskanje uporabnika v datoteki /etc/passwd. Če vam ukaz grepni znan, je opis na voljo ovde.

V tem primeru, če je uporabnik najden, bo skript izpisal ustrezno sporočilo. A kaj, če uporabnika ne najdemo? V tem primeru se skript preprosto konča, ne da bi nam sporočil kaj. Raje bi, da bi nam to sporočil, zato bomo izboljšali kodo.

Upravna struktura if-then-else

Da bi program lahko sporočil tako o uspešnem iskanju kot o neuspehu, bomo uporabili strukturo if-then-else. Tako deluje:

if ukaz
then
ukazi
else
ukazi
fi

Če prva ukaz vrne nič, kar pomeni, da je bila uspešna, bo pogoj pravilen in izvajanje ne bo šlo po veji else. V nasprotnem primeru, če se vrne kaj drugega kot nič, kar bi pomenilo neuspeh ali lažen rezultat, se izvajajo ukazi, ki so navedeni po else.

Napišimo tak 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

Njegovo izvajanje je šlo po veji else.

Bash skripti: uvod
Zagon skripte s strukturo if-then-else

No, nadaljujemo in se postavimo vprašanje o bolj zapletenih pogojih. Kaj pa, če je treba preveriti več pogojev? Na primer, če je želeni uporabnik najden, moramo prikazati eno sporočilo, če pa je izpolnjen še en pogoj — drugo sporočilo, in tako naprej. V takšni situaciji nam pomagajo notranji pogoji. Izgleda takole:

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

Če prva komanda vrne nič, kar pomeni, da je bila uspešno izvedena, se bodo izvedle komande v prvem bloku. then, sicer, če je prvi pogoj lažen, in če druga komanda vrne nič, se bo izvedel 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 takšnem skriptu lahko na primer ustvarite novega uporabnika s pomočjo komande useradd, če iskanje ni dalo rezultatov, ali pa naredite še kaj koristnega.

Primerjava števil

V skriptih lahko primerjate numerične vrednosti. Spodaj je seznam ustreznih komand.

n1 -eq n2Vrne resnično vrednost, če n1 je enako n2.
n1 -ge n2 Vrne resnično vrednost, če n1večje ali enako n2.
n1 -gt n2Vrne resnično vrednost, če n1 večje n2.
n1 -le n2Vrne resnično vrednost, če n1manjše ali enako n2.
n1 -lt n2Vrne resnično vrednost, če n1 je manjša n2.
n1 -ne n2Vrne resnično vrednost, če n1ni enako n2.

Kot primer preizkusimo enega od operatorjev primerjave. Upoštevajte, da je izraz v 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 je, kar bo ta komanda izpisala.

Bash skripti: uvod
Primerjava števil v skriptih

Vrednost spremenljivke val1je večja od 5, zato se izvede veja thenoperatorja primerjave in v konzoli se prikaže ustrezno sporočilo.

Primerjava nizov

V scenarijih lahko primerjate tudi nizovne vrednosti. Operatorji primerjave izgledajo precej preprosto, vendar imajo primerjalne operacije nizov določene posebnosti, na katere se bomo osredotočili spodaj. Tukaj je seznam operatorjev.

str1 = str2 Preveri enakost nizov, vrne resničnost, če sta niza identična.
str1 != str2Vrne resnično vrednost, če niza nista identična.
str1 < str2Vrne resnično vrednost, če str1je manjši kot str2.
str1 > str2 Vrne resnično vrednost, če str1večji kot str2.
-n str1 Vrne resnično vrednost, če je dolžina str1več kot nič.
-z str1Vrne resnično vrednost, če je dolžina str1je enaka nič.

Tukaj je primer primerjave nizov v scenariju:

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

Kot rezultat izvajanja skripta bomo prejeli naslednje.

Bash skripti: uvod
Primerjava nizov v skriptih

Tu je ena značilnost primerjave nizov, ki si zasluži omembo. Namreč, operatorje „>“ in „“ kot ukaz za preusmeritev izhoda.

Tako izgleda delo s temi operatorji 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

To so rezultati delovanja skripte.

Bash skripti: uvod
Primerjava nizov, opozorilo

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

./myscript: vrstica 5: [: preveč argumentov

Da bi se znebili tega opozorila, bomo obkrožili $val2 v dvojne narekovaje:

#!/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 bi moralo.

Bash skripti: uvod
Primerjava nizov

Še ena značilnost operatorjev „>“ in „<“ je v tem, kako delujejo z znaki v velikih in malih črkah. Da bi razumeli to značilnost, pripravimo besedilno datoteko z naslednjo vsebino:

Likegeeks
likegeeks

Shranjeno bo pod imenom myfile, nato pa bomo v terminalu izvedli to ukaz:

sort myfile

Razvrstilo bo vrstice iz datoteke tako:

likegeeks
Likegeeks

Komanda sort, privzeto razvršča vrstice naraščajoče, kar pomeni, da je v našem primeru mala črka manjša od velike. Zdaj 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ženemo, se izkaže, da je vse nasprotno — mala črka je zdaj večja od velike.

Bash skripti: uvod
Ukaz sort in primerjava nizov v skriptu

V ukazih za primerjavo so velike črke manjše od malih. Primerjava nizov se tukaj izvaja s primerjavo ASCII kod znakov, zato je red razvrščanja odvisen od kod znakov.

Komanda sort, ki pa uporablja vrstni red razvrščanja, določen v nastavitvah sistemskega jezika.

Preverjanje datotek

Verjetno so spodaj navedeni ukazi v bash skriptah najpogosteje uporabljeni. Omogočajo preverjanje različnih pogojev, ki zadevajo datoteke. Tukaj je seznam teh ukazov.

-d filePreverja, ali datoteka obstaja in ali je direktorij.
-e filePreverja, ali datoteka obstaja.
-f file Preverja, ali datoteka obstaja in ali je datoteka.
-r filePreverja, ali datoteka obstaja in ali je dostopna za branje.
-s filePreverja, ali datoteka obstaja in ali ni prazna.
-w filePreverja, ali datoteka obstaja in ali je dostopna za pisanje.
-x filePreverja, ali datoteka obstaja in ali je izvršljiva.
file1 -nt file2 Preverja, ali je novejši od file1, kot file2.
file1 -ot file2Preverja, ali je starejši od file1, kot file2.
-O file Preverja, ali datoteka obstaja in ali je njen lastnik trenutni uporabnik.
-G filePreverja, ali datoteka obstaja in ali se njen ID skupine ujema z ID-jem skupine trenutnega uporabnika.

Te ukaze, kot tudi mnoge druge, obravnavane danes, je enostavno zapomniti. Njihova imena, ki so okrajšave različnih besed, neposredno kažeta na preverjanja, ki jih izvajajo.

Preizkusimo 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 izpisal njegovo vsebino.

Bash skripti: uvod
Izhod vsebine imenika

Domnevamo, da boste ostale ukaze lahko preizkusili sami, vsi se uporabljajo na enak način.

Zaključki

Danes smo predstavili, kako začeti z pisanjem bash skriptov in obravnavali nekaj osnovnih stvari. V resnici je tema bash programiranja ogromna. Ta članek je prevod prvega dela velike serije 11 materialov. Če želite nadaljevanje takoj — tukaj je seznam izvirnikov teh materialov. Za udobje je vključena tudi tista, ki ste jo pravkar prebrali.

  1. Bash Skript Korak za Korakom — tukaj gre za to, kako začeti ustvarjati bash skripte, obravnavano je uporabo spremenljivk, opisane so pogojne konstrukcije, izračuni, primerjave števil, nizov in pridobivanje podatkov o datotekah.
  2. Bash Scripting Del 2, Bash the awesome — tukaj so razložene posebnosti dela s cikli for in while.
  3. Bash Scripting Del 3, Parametri & možnosti — ta material je namenjen parametrim ukazne vrstice in ključem, ki jih lahko posredujemo skriptom, delu s podatki, ki jih vnese uporabnik in ki jih lahko beremo iz datotek.
  4. Bash Scripting Del 4, Vhod & Izhod — tukaj gre za datotečne opisnike in njihovo uporabo, tokove vhodov, izhodov, napak in preusmerjanje izhoda.
  5. Bash Scripting Del 5, Signali & Naloge — ta material je namenjen signalom iz Linuxa, njihovemu obvladovanju v skriptih in izvajanju scenarijev po urniku.
  6. Bash Scripting Del 6, Funkcije — tukaj lahko izveste o ustvarjanju in uporabi funkcij v skriptih ter razvoju knjižnic.
  7. Bash Scripting Del 7, Uporaba sed — ta članek se osredotoča na delo s pretokovnim besedilnim urejevalnikom sed.
  8. Bash Scripting Del 8, Uporaba awk — ta material je namenjen programiranju v jeziku za obdelavo podatkov awk.
  9. Bash Scripting Del 9, Redni Izrazi — tuk lahko preberete o uporabi regularnih izrazov v bash skriptih.
  10. Bash skriptiranje, del 10, praktični primeri — tukaj so predstavljeni postopki dela s sporočili, ki jih lahko pošljemo uporabnikom, prav tako pa tudi metodologija nadzorovanja diska.
  11. Bash skriptiranje, del 11, ukaz Expect — ta material je posvečen orodju Expect, s katerim lahko avtomatiziramo interakcijo z interaktivnimi orodji. Tu se posebej govori o expect skriptih in njihovem sodelovanju z bash skripti ter drugimi programi.

Menimo, da je ena izmed dragocenih lastnosti te serije člankov ta, da se, začenši s samim preprostim, kar ustreza uporabnikom vseh ravni, postopoma preide v precej resne teme, kar daje priložnost vsem, ki želijo napredovati pri ustvarjanju skript v ukazni vrstici Linux.

Spoštovani bralci! Prosim guruje bash programiranja, da nam povedo, kako so prišli do vrhov mojstrstva, in delijo svoje skrivnosti, medtem ko od tistih, ki so pravkar napisali svoj prvi skript, pričakujemo vtise.

Bash skripti: uvod

Samo registrovani korisnici mogu učestvovati u anketi. Prijavite se, molim vas.

Ali prevesti preostale dele cikla člankov?

  • Da!

  • Ne, ni treba

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

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster