Danes se bomo pogovarjali o bash skriptih. To so , 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 Linux.
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.
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_MAXUkazna 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 ) 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
whoamiTukaj, 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.

Poskus zagon datoteke skripte z nepravilno nastavljenimi dovoljenji
Naredimo datoteko izvršno:
chmod +x .\/myscriptZdaj poskusimo izvesti:
.\/myscriptPo nastavitvi dovoljenj vse deluje kot je treba.

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:"
whoamiTako bo videti po zagonu posodobljenega skripta.

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

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.

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.

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.

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 
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
fiTukaj 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"
fiTako izgleda po zagonu te skripte.

Iskanje uporabnika
Tukaj smo uporabili ukaz grepza iskanje uporabnika v datoteki /etc/passwd. Če vam ukaz grepni znan, je opis na voljo .
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.

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, čen1je enakon2.
n1 -ge n2Vrne resnično vrednost, čen1večje ali enakon2.
n1 -gt n2Vrne resnično vrednost, čen1večjen2.
n1 -le n2Vrne resnično vrednost, čen1manjše ali enakon2.
n1 -lt n2Vrne resnično vrednost, če n1 je manjšan2.
n1 -ne n2Vrne resnično vrednost, čen1ni enakon2.
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"
fiTo je, kar bo ta komanda izpisala.

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 = str2Preveri 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, čestr1je manjši kotstr2.
str1 > str2Vrne resnično vrednost, čestr1večji kotstr2.
-n str1Vrne resnično vrednost, če je dolžinastr1več kot nič.
-z str1Vrne resnično vrednost, če je dolžinastr1je 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"
fiKot rezultat izvajanja skripta bomo prejeli naslednje.

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"
fiTo so rezultati delovanja skripte.

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"
fiZdaj vse deluje, kot bi moralo.

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

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 filePreverja, 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 file2Preverja, ali je novejši odfile1, kotfile2.
file1 -ot file2Preverja, ali je starejši odfile1, kotfile2.
-O filePreverja, 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"
fiTa skript bo za obstoječi imenik izpisal njegovo vsebino.

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.
- — 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.
- — tukaj so razložene posebnosti dela s cikli for in while.
- — 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.
- — tukaj gre za datotečne opisnike in njihovo uporabo, tokove vhodov, izhodov, napak in preusmerjanje izhoda.
- — ta material je namenjen signalom iz Linuxa, njihovemu obvladovanju v skriptih in izvajanju scenarijev po urniku.
- — tukaj lahko izveste o ustvarjanju in uporabi funkcij v skriptih ter razvoju knjižnic.
- — ta članek se osredotoča na delo s pretokovnim besedilnim urejevalnikom sed.
- — ta material je namenjen programiranju v jeziku za obdelavo podatkov awk.
- — tuk lahko preberete o uporabi regularnih izrazov v bash skriptih.
- — tukaj so predstavljeni postopki dela s sporočili, ki jih lahko pošljemo uporabnikom, prav tako pa tudi metodologija nadzorovanja diska.
- — 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.
Samo registrovani korisnici mogu učestvovati u anketi. , 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
