Bash skripti: sākums

Bash skripti: sākums
Bash skripti, 2. daļa: cikli
Bash skripti, 3. daļa: parametri un komandrindas atslēgas
Bash skripti, 4. daļa: ievade un izvade
Bash skripti, 5. daļa: signāli, foniskās uzdevumi, skriptu pārvaldība
Bash skripti, 6. daļa: funkcijas un bibliotēku izstrāde
Bash skripti, 7. daļa: sed un tekstu apstrāde
Bash skripti, 8. daļa: datu apstrādes valoda awk
Bash skripti, 9. daļa: regulārie izteicieni
Bash skripti, 10. daļa: praktiski piemēri
Bash skripti, 11. daļa: expect un interaktīvo utilītu automatizācija

Šodien runāsim par bash skriptiem. Tie ir komandrindas skripti, kas rakstīti bash apvalkam. Ir arī citi apvalki, piemēram, zsh, tcsh, ksh, bet mēs koncentrēsimies uz bash. Šis materiāls ir paredzēts visiem interesentiem, vienīgais nosacījums — spēja strādāt komandrindā Linux.

Bash skripti: sākums

Komandrindas skripti ir komandu kopas, kuras var ievadīt ar tastatūru, apvienotas failos un saliktas kopējā mērķī. Šajā procesā komandu rezultāti var būt vai nu patstāvīga vērtība, vai kalpot kā ievade citām komandām. Skripti ir spēcīgs veids, kā automatizēt bieži veiktas darbības.

Bash skripti: sākums

Tātad, runājot par komandrindu, tā ļauj izpildīt vairākas komandas vienlaicīgi, ievadot tās ar semikolu:

pwd ; whoami

Patiesībā, ja jūs to izmēģinājāt savā terminālī, jūsu pirmais bash skripts, kurā iesaistītas divas komandas, jau ir uzrakstīts. Tas darbojas šādi. Pirmkārt, komanda pwd izvada uz ekrāna informāciju par pašreizējo darba direktoriju, pēc tam komanda whoamiparāda datus par lietotāju, zem kura jūs esat pieteicies sistēmā.

Izmantojot līdzīgu pieeju, jūs varat apvienot tik daudz komandu, cik vēlaties, vienā rindā, ierobežojums ir tikai maksimālais argumentu skaits, ko var nodot programmai. Šo ierobežojumu var noteikt, izmantojot šādu komandu:

getconf ARG_MAX

Komandrinda ir lielisks rīks, taču komandas tajā ir jāievada katru reizi, kad tās nepieciešamas. Ko darīt, ja ierakstāt komandu kopu failā un vienkārši izsaucat šo failu to izpildei? Patiesībā, šis fails, par kuru runājam, tiek dēvēts par komandrindas skriptu.

Kā ir veidoti bash skripti

Izveidojiet tukšu failu, izmantojot komandu touch. Pirmajā rindā jānorāda, kuru interpretāciju izmantosim. Mūs interesē bash, tāpēc pirmā faila rinda izskatīsies šādi:

#!/bin/bash

Pārējās šī faila rindas simbols krustenisko grāmatu tiek izmantots, lai apzīmētu komentārus, kurus interpretācija neapstrādā. Tomēr pirmā rinda ir īpašs gadījums, šeit krusteniskā grāmata, aiz kuras seko izsaukuma zīme (šo secību sauc par shebang) un ceļu uz bash, norāda sistēmai, ka skripts ir izveidots tieši bash.

Komandas tiek atdalītas ar jaunu rindu, bet komentāri tiek atzīmēti ar krustenisko grāmatu. Lūk, kā tas izskatās:

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

Šeit, tāpat kā komandu rindā, var ierakstīt komandas vienā rindā, atdalot ar semikolu. Tomēr, ja komandas raksta dažādās rindās, failu ir vieglāk lasīt. Neatkarīgi no tā, interpretācija tās apstrādās.

Aizsardzības iestatīšana skripta failam

Saglabājiet failu, nosaucot to par myscript, un darbs pie bash skripta ir gandrīz pabeigts. Tagad joprojām jādara šis fails izpildāms, citādi, mēģinot to palaišanas, jūs sastapsieties ar kļūdu Permission denied.

Bash skripti: sākums
Mēģinot palaiž skripta failu ar nepareizi iestatītām atļaujām

Padarīsim fails izpildāms:

chmod +x .\/myscript

Tagad mēģināsim to izpildīt:

.\/myscript

Pēc atļauju iestatīšanas viss darbojas labi.

Bash skripti: sākums
Veiksmīga bash skripta palaišana

Ziņojumu izvadīšana

Lai izvadītu tekstu Linux konsolē, tiek izmantota komanda echo. Izmantosim šī fakta zināšanas un rediģēsim savu skriptu, pievienojot paskaidrojumus datiem, kurus izvada jau esošās komandas:

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

Lūk, kā izskatīsies atjaunotā skripta izpildes rezultāts.

Bash skripti: sākums
Ziņojumu izvadīšana no skripta

Tagad mēs varam izvadīt paskaidrojumus, izmantojot komandu echo. Ja jūs nezināt, kā rediģēt failu, izmantojot Linux rīkus, vai iepriekš neesat sastapušies ar komandu echo, lūdzu, pievērsieties šis materiālam.

Mainīgo izmantošana

Mainīgie ļauj saglabāt informāciju skripta failā, piemēram — komandu izpildes rezultātus, lai tos izmantotu citās komandās.

Nekas slikts nav, ja izpildāt atsevišķas komandas, nesaglabājot to izpildes rezultātus, bet šādā pieejā iespējas ir ļoti ierobežotas.

Ir divi mainīgo veidi, kurus var izmantot bash skriptos:

  • Vides mainīgie
  • Lietotāja mainīgie

Vides mainīgie

Dažreiz shell komandās jāstrādā ar noteiktiem sistēmas datiem. Piemēram, kā izvadīt pašreizējā lietotāja mājas direktoriju:

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

Lūdzu, ņemiet vērā, ka mēs varam izmantot sistēmas mainīgo $HOME divos pēdiņās, tas netraucēs sistēmai to atpazīt. Lūk, ko mēs iegūsim, izpildot iepriekš minēto skriptu.

Bash skripti: sākums
Vides mainīgā izmantošana skriptā

Un ko darīt, ja mums jāpārceļ dolāra simbols uz ekrāna? Pamēģināsim tā:

echo "I have $1 in my pocket"

Sistēma atklās dolāra zīmi rindā, kas ir ierobežota ar pēdiņām, un domās, ka mēs atsaucamies uz mainīgo. Skripts mēģinās izvadīt nenoteikta mainīgā vērtību $1. Tas nav tas, ko mēs vēlamies. Ko darīt?

Šādā situācijā palīdzēs kontrolsimbola izmantošana, atpakaļejošās slīpsvītras, pirms dolāra zīmes:

echo "I have $1 in my pocket"

Tagad skripts izvadīs tieši to, ko mēs sagaidām.

Bash skripti: sākums
Kontroles secības izmantošana dolāra zīmes izvadīšanai

Lietotāja mainīgie

Papildus vides mainīgajiem, bash skripti ļauj definēt un izmantot savus mainīgos skriptā. Šādi mainīgie saglabā vērtību līdz skripta izpildei.

Tāpat kā sistēmas mainīgajiem, pie lietotāja mainīgajiem var piekļūt, izmantojot dolāra zīmi:
TNW-CUS-FMP — promo kods 10% atlaidei mūsu pakalpojumiem, pieejams aktivizācijai 7 dienas

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

Tā izskatīsies pēc šāda skripta palaišanas.

Bash skripti: sākums
Lietotāju mainīgie skriptā

Komandu aizvietošana

Viens no noderīgākajiem bash skriptu ļautajiem iespēju ir iespēja iegūt informāciju no komandu izvades un piešķirt to mainīgajiem, kas ļauj izmanto šo informāciju visur skriptu failā.

To var izdarīt divos veidos.

  • Ar atpakaļejošā apostrofa simbolu «`»
  • Izmantojot konstrukciju $()

Izmantojot pirmo pieeju, pārliecinieties, ka neievadāt vienu pēdiņu vietā, kur vajadzētu būt atpakaļejošajam apostrofam. Komanda jāsastāda divos tādos simbolos:

mydir=`pwd`

Otrajā pieejā tas izskatās šādi:

mydir=$(pwd)

Un skripts, beidzot, var izskatīties šādi:

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

Tā izpildes gaitā komandas izvade pwdtiks saglabāta mainīgajā mydir, kuras saturs, izmantojot komandu echo, nonāks konsolē.

Bash skripti: sākums
Skripts, kas saglabā komandas rezultātus mainīgajā

Matemātiskās operācijas

Lai veiktu matemātiskās operācijas skriptu failā, var izmantot konstrukciju veida $((a+b)):

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

Bash skripti: sākums
Matemātiskās operācijas scenārijā

Kontroles konstrukcija if-then

Dažos scenārijos ir nepieciešams pārvaldīt izpildes plūsmu. Piemēram, ja kāda vērtība ir lielāka par pieciem, jāveic viena darbība; pretējā gadījumā — cita. Šāda pieeja ir piemērojama daudzās situācijās, un šeit mums palīdzēs kontroles konstrukcija if-then. Visvienkāršākajā formā tā izskatās šādi:

if komanda
then
komandas
fi

Bet šeit ir darba piemērs:

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

Šajā gadījumā, ja komandas izpilde pwdpabeigsies sekmīgi, konsolē tiks izvadīts teksts «it works».

Izmantosim mūsu iegūtās zināšanas un uzrakstīsim sarežģītāku scenāriju. Pieņemsim, ka jāatrod kāds lietotājs /etc/passwd, un, ja tas izdosies, jāpaziņo, ka šis lietotājs pastāv.

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

Tā izskatās pēc šī skripta palaišanas.

Bash skripti: sākums
Lietotāja meklēšana

Šeit mēs izmantojām komandu greplietošanai lietotāja meklēšanai failā /etc/passwd. Ja komanda grepjums nav pazīstama, tās aprakstu var atrast šeit.

Šajā piemērā, ja lietotājs tiek atrasts, skripts izvadīs attiecīgu ziņojumu. Bet, ja lietotāju neizdosies atrast? Šajā gadījumā skripts pabeigs izpildi, neko mums nesakot. Mēs vēlētos, lai tas paziņotu par to, tādēļ uzlabosim kodu.

Kontroles konstrukcija if-then-else

Lai programma varētu ziņot gan par sekmīgu meklēšanu, gan par neveiksmi, izmantosim konstrukciju if-then-else. Lūk, kā tā darbojas:

if komanda
then
komandas
else
komandas
fi

Ja pirmā komanda atgriež nulli, kas nozīmē tās sekmīgu izpildi, nosacījums būs paties un izpilde nesākas pēc else. Pretējā gadījumā, ja tiks atgriezts kaut kas, kas atšķiras no nulles, kas nozīmēs neveiksmi vai nepatiesu rezultātu, tiks izpildītas komandas, kas atrodas pēc else.

Uzrakstīsim tādu skriptu:

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

Tā izpilde devās pa ceļu else.

Bash skripti: sākums
Skripta palaišana ar konstrukciju if-then-else

Nu ko, turpināsim doties tālāk un uzdosim jautājumu par sarežģītākiem nosacījumiem. Ko darīt, ja jā pārbauda ne viens nosacījums, bet vairāki? Piemēram, ja ir atrasts vajadzīgais lietotājs, ir jāpaziņo viens ziņojums, ja izpildās vēl kāds nosacījums — vēl viens ziņojums, un tā tālāk. Šādā situācijā mums palīdzēs ieliktie nosacījumi. Tas izskatās šādi:

if komanda1
then
komandas
elif komanda2
then
komandas
fi

Ja pirmā komanda atgriezīs nulli, kas norāda uz tās veiksmīgu izpildi, izpildīsies komandas pirmajā blokā then, savukārt, ja pirmais nosacījums izrādīsies nepaties, un ja otrā komanda atgriezīs nulli, izpildīsies otrais koda bloks.

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

Šādā skriptā varētu, piemēram, izveidot jaunu lietotāju, izmantojot komandu useradd, ja meklēšana nesniedza rezultātus, vai veikt vēl kaut ko noderīgu.

Salīdzinājums skaitļiem

Skriptu iekšienē var salīdzināt skaitliskās vērtības. Zemāk ir iekļauts atbilstošo komandu saraksts.

n1 -eq n2Atgriež patiesu vērtību, ja n1 vienāds ar n2.
n1 -ge n2 Atgriež patiesu vērtību, ja n1lielāks vai vienāds n2.
n1 -gt n2Atgriež patiesu vērtību, ja n1 vairāk n2.
n1 -le n2Atgriež patiesu vērtību, ja n1mazāks vai vienāds n2.
n1 -lt n2Atgriež patiesu vērtību, ja n1 ir mazāks par n2.
n1 -ne n2Atgriež patiesu vērtību, ja n1nav vienāds n2.

Kā piemēru izmēģināsim vienu no salīdzināšanas operātoriem. Ņemiet vērā, ka izteiksme ir ietverta kvadrātiekavās.

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

Šo komandu izvadīs.

Bash skripti: sākums
Salīdzinājums skaitļiem skriptos

Mainīgā vērtība val1ir lielāka par 5, līdz ar to izpildās salīdzinājuma operātora zarojums un konsolē tiek izvadīts atbilstošs ziņojums. thenSalīdzinājums virknes

Skriptos var salīdzināt arī virknes vērtības. Salīdzināšanas operatori izskatās vienkārši, tomēr virkņu salīdzināšanas operācijām ir noteiktas iezīmes, par kurām mēs runāsim tālāk. Šeit ir operatoru saraksts.

str1 = str2

Pārbauda virknes uz vienādību, atgriež patiesu, ja virknes ir identiskas. tr1 != str2
sAtgriež patiesu, ja virknes nav identiskas.str1 < str2
Atgriež patiesu, jastr1 ir mazāks parstr2 str1 > str2.
ir lielāks par str1 ir mazāks par-n str1 str1 > str2.
Atgriež patiesu, ja garums ir lielāks par nulli. ir mazāks par-z str1
ir vienāds ar nulli.ir lielāks par nulli. ir mazāks parLūk, piemērs par virkņu salīdzinājumu skriptā:

Kā rezultātā skripta izpildes laikā mēs iegūsim sekojošo.

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

Salīdzinājums virkņu skriptos

Bash skripti: sākums
Salīdzinājums virkņu skriptos

Šeit ir viena iezīme, ar ko salīdzināt virknes, par kuru noteikti jāpiebilst. Proti, operatori „>” un „<” ir jāizvairās, izmantojot atpakaļvērsto slīpo līniju, citādi skripts darbosies nepareizi, lai gan kļūdu ziņojumi izrādīsies. Skripts interpretē simbolu „>” kā izvades novirzīšanas komandu.

Šeit parādās, kā darbs ar šiem operatoriem izskatās kodā:

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

Šeit ir skripta izpildes rezultāti.

Bash skripti: sākums
Virkņu salīdzināšana, brīdinājuma izsniegšana

Lūdzu, ņemiet vērā, ka skripts, lai arī tiek izpildīts, izvada brīdinājumu:

.\/myscript: rindiņa 5: [: pārāk daudz argumentu

Lai atbrīvotos no šī brīdinājuma, iesaiņosim $val2 dubultās pēdiņās:

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

Tagad viss darbojas, kā vajadzīgs.

Bash skripti: sākums
Skriptos var salīdzināt arī virknes vērtības. Salīdzināšanas operatori izskatās vienkārši, tomēr virkņu salīdzināšanas operācijām ir noteiktas iezīmes, par kurām mēs runāsim tālāk. Šeit ir operatoru saraksts.

Vēl viena operatoru „>” un „<” iezīme ir tā, kā tie darbojas ar simboliem lielajā un mazajā burtā. Lai saprastu šo iezīmi, sagatavosim teksta failu ar šādu saturu:

Likegeeks
likegeeks

Saglabāsim to, nosaucot par myfile, pēc tam terminālī izpildīsim šādu komandu:

sort myfile

Tā sakārtos rindiņas no faila šādi:

likegeeks
Likegeeks

Komanda kārtošana, pēc noklusējuma sakārtošanai rindiņas tiek kārtotas pieaugšanas secībā, proti, mazie burti mūsu piemērā ir mazāki nekā lielie. Tagad sagatavosim skriptu, kas salīdzinās tās pašas rindiņas:

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

Ja to palaidīsim, izrādīsies, ka viss ir pretēji — mazais burts tagad ir lielāks par lielo.

Bash skripti: sākums
Komanda sort un virkņu salīdzināšana skripta failā

Salīdzināšanas komandās lielie burti ir mazāki par maziem. Šeit virkņu salīdzināšana tiek veikta, salīdzinot rakstzīmju ASCII kodus, kārtības secība, līdz ar to, ir atkarīga no rakstzīmju kodiem.

Komanda kārtošana, savukārt, izmanto kārtību, kas noteikta sistēmas valodas iestatījumos.

Failu pārbaudes

Domāju, ka zemāk minētās komandas visbiežāk izmanto bash skriptos. Tās ļauj pārbaudīt dažādas nosacījumus, kas attiecas uz failiem. Šeit ir šo komandu saraksts.

-d filePārbauda, vai fails pastāv un vai tas ir direktorija.
-e filePārbauda, vai fails pastāv.
-f file Pārbauda, vai fails pastāv un vai tas ir fails.
-r filePārbauda, vai fails pastāv un vai tam var piekļūt lasīšanai.
-s file Pārbauda, vai fails pastāv un vai tas nav tukšs.
-w filePārbauda, vai fails pastāv un vai tam var piekļūt rakstīšanai.
-x filePārbauda, vai fails pastāv un vai tas ir izpildāms.
file1 -nt file2 Pārbauda, vai ir jaunāks par file1, nekā file2.
file1 -ot file2Pārbauda, vai ir vecāks par file1, nekā file2.
-O file Pārbauda, vai fails pastāv un vai tā īpašnieks ir pašreizējais lietotājs.
-G filePārbauda, vai fails pastāv un vai tā grupas identifikators atbilst pašreizējā lietotāja grupas identifikatoram.

Šīs komandas, tāpat kā daudzas citas, kas šodien tika aplūkotas, nav grūti iegaumēt. To nosaukumi, būdami saīsnes no dažādām vārdnīcām, tieši norāda uz veicamajām pārbaudēm.

Pamēģināsim vienu no komandām praksē:

#!/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 skripts, eksistējošai direktorijai, parādīs tās saturu.

Bash skripti: sākums
Direktorijas satura izvadīšana

Pieņemam, ka ar pārējām komandām jūs varēsiet eksperimentēt paši, tās visas tiek lietotas pēc tāda paša principa.

Secinājumi

Šodien mēs runājām par to, kā sākt rakstīt bash skriptus un apskatījām dažas pamata lietas. Patiesībā, tēma par bash programmēšanu ir milzīga. Šis raksts ir tulkojums pirmajai daļai lielas sērijas no 11 materiāliem. Ja vēlaties turpinājumu tūlīt — šeit ir šo materiālu oriģinālu saraksts. Lai būtu ērtāk, šeit iekļauts arī tas, kuru jums tikko iztulkojām.

  1. Bash Script Soli pa Solim — šeit runa ir par to, kā uzsākt bash skriptu izveidi, aplūkota mainīgo izmantošana, aprakstītas nosacījumu konstrukcijas, aprēķini, skaitļu un virkņu salīdzināšana, informācijas iegūšana par failiem.
  2. Bash Skriptinga 2. daļa, Bash pārsteidzošais — šeit tiek atklātas iezīmes darbā ar for un while cikliem.
  3. Bash Skriptinga 3. daļa, Parametri & opcijas — šis materiāls veltīts komandu rindas parametriem un atslēgām, kuras var nodot skriptiem, darbam ar datiem, kurus ievada lietotājs un kurus var lasīt no failiem.
  4. Bash Skriptinga 4. daļa, Ievadi & Izeja — šeit runa ir par failu aprakstītājiem un darbu ar tiem, par ievades, izejas plūsmām, kļūdu plūsmām, izejas pāradresāciju.
  5. Bash Skriptinga 5. daļa, Signāli & Darbi — šis materiāls veltīts Linux signāliem, to apstrādei skriptos, scenāriju palaišanai pēc grafika.
  6. Bash Skriptinga 6. daļa, Funkcijas — šeit var uzzināt par funkciju izveidi un izmantošanu skriptos, par bibliotēku izstrādi.
  7. Bash Skriptinga 7. daļa, Lietojot sed — šis raksts veltīts darbam ar plūstošo teksta redaktoru sed.
  8. Bash Skriptinga 8. daļa, Lietojot awk — šis materiāls veltīts programmēšanai datu apstrādes valodā awk.
  9. Bash Skriptinga 9. daļa, Regulārās izteiksmes — šeit var izlasīt par regulāro izteiksmju izmantošanu bash skriptu izstrādē.
  10. Bash skriptēšana 10. daļa, praktiski piemēri — šeit tiek izklāstītas metodes, kā strādāt ar ziņojumiem, kurus var nosūtīt lietotājiem, kā arī disk tipa monitoringa metodika.
  11. Bash skriptēšana 11. daļa, Expect komanda — šis materiāls veltīts Expect rīkam, ar kura palīdzību ir iespējams automātizēt mijiedarbību ar interaktīvām utilītēm. Konkrēti, šeit runa ir par expect skriptiem un to saistību ar bash skriptiem un citām programmām.

Domājam, ka viens no šīs rakstu sērijas vērtīgākajiem aspektiem ir tas, ka tā, sākot no visvienkāršākā, kas ir piemērots lietotājiem ar jebkādu pieredzi, pakāpeniski noved pie diezgan nopietnām tēmām, dodot iespēju visiem interesentiem progresēt komandrindas skriptu izstrādē Linux.

Cienījamie lasītāji! Lūdzam bash programmēšanas guru pastāstīt par to, kā viņi sasnieguši meistarības virsotnes, dalīties ar noslēpumiem, bet no tiem, kuri tikko uzrakstījuši savu pirmo skriptu, gaidām iespaidus.

Bash skripti: sākums

Tikai reģistrētie lietotāji var piedalīties aptaujā. Pieteikties, lūdzu.

Vai tulkot pārējās rakstu cikla daļas?

  • Jā!

  • Nē, nav nepieciešams

Nobalsojuši 1030 lietotāji. Atturējušies 106 lietotāji.

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster