Bash-skripti: algus

Bash-skripti: algus
Bash-skriptid, osa 2: tsüklid
Bash-skriptid, osa 3: parameetrid ja käsurea võtmed
Bash-skriptid, osa 4: sisend ja väljund
Bash-skriptid, osa 5: signaalid, taustategevused, skriptide haldamine
Bash-skriptid, osa 6: funktsioonid ja raamatukogude arendamine
Bash-skriptid, osa 7: sed ja tekstitöötlus
Bash-skriptid, osa 8: andmetöötluse keel awk
Bash-skriptid, osa 9: regulaaravaldised
Bash-skriptid, osa 10: praktilised näited
Bash-skriptid, osa 11: expect ja interaktiivsete utiliitide automatiseerimine

Täna räägime bash-skriptidest. See on — käskude read, mis on kirjutatud bash-keskkonnas. On ka teisi keskkondi, näiteks — zsh, tcsh, ksh, kuid keskendume bashile. See materjal on mõeldud kõigile, kes soovivad, ainus tingimus on oskus töötada käskude real Linuxis.

Bash-skripti: algus

Käsuread on käskude kogumid, mida saab klaviatuurilt sisestada, kogutud failidesse ja ühendatud mingi ühise eesmärgiga. Samas võivad käskude töötamise tulemused olla kas iseseisev väärtus või teenida sisendina teistele käskudele. Skriptid on võimas viis sageli korduvate toimingute automatiseerimiseks.

Bash-skripti: algus

Nii et, kui rääkida käsurealt, võib käske täita mitu korraga, sisestades need läbi semikooloni:

pwd ; whoami

Tegelikult, kui olete seda oma terminaalis proovinud, on teie esimene bash-skript, millel on kaks käsku, juba kirjutatud. See töötab nii. Esiteks, käsk pwd väljastab ekraanile teavet praeguse töökausta kohta, seejärel käsk whoamikannab süsteemi alloleva kasutaja andmed.

Sarnase lähenemisega saate ühendada samaaegselt nii palju käsklusi, kui soovite, piirang on vaid maksimaalne argumentide arv, mida programmile edastada saab. Selle piirangu määramine on võimalik järgmise käsu abil:

getconf ARG_MAX

Käskude rida on suurepärane tööriist, kuid käske tuleb sisestada iga kord, kui need on vajalikud. Mis oleks, kui salvestada käskude kogum faili ja lihtsalt kutsuda see fail nende täitmiseks? Tegelikult on see fail, millest räägime, käskude rida.

Kuidas on bash-skriptid üles ehitatud

Looge tühi fail, kasutades käsku touch. Esimese reana tuleb näidata, millist lõpetust me soovime kasutada. Meid huvitab bash, seega on faili esimene rida järgmine:

#!/bin/bash

Selle faili teistes ridades tähistab ristikujuline märk kommentaare, mida lõpetus ei töötle. Siiski on esimene rida erand, siin on ristikujuline märk, millele järgneb hüüdemärk (seda järjestust nimetatakse shebang) ja tee bash, näitavad süsteemile, et skript on loodud just bash.

Käskude lõpetus eraldatakse reavahetuse märgiga, kommentaarid eristatakse ristikujulise märgiga. Nii see välja näeb:

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

Siin, nagu ka käsureal, on võimalik kirjutada käske ühel real, eraldades need semikooloniga. Siiski, kui kirjutada käske erinevatesse ridadesse, on faili mõista kergem. Igal juhul töötleb lõpetus neid.

Faili skripti õiguste seadmine

Salvesta fail, andes sellele nime myscript, ja töö bash-skripti loomise kallal on peaaegu valmis. Praegu on jäänud vaid muuta see fail täidetavaks, vastasel juhul, kui proovite seda käivitada, leiate endale vea Permission denied.

Bash-skripti: algus
Skripti faili käivitamise katse valede õiguste seadistamisega

Teeme failist täidetava:

chmod +x .\/myscript

Nüüd proovime seda käivitada:

.\/myscript

Pärast õiguste seadmist töötab kõik nagu peab.

Bash-skripti: algus
Bash-skripti edukas käivitamine

Sõnumite väljund

Teksti väljastamiseks Linuxi konsoolis kasutatakse käsku echo. Kasutame seda teadmist ja redigeerime meie skripti, lisades selgitusi andmetele, mida juba olemasolevad käsklused väljastavad:

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

Nii näeb välja käivitamisejärgne uuendatud skript.

Bash-skripti: algus
Sõnumite väljund skriptist

Nüüd saame väljastada selgitavaid pealkirju, kasutades käsku echo. Kui te ei tea, kuidas faili redigeerida, kasutades Linuxi, või ei ole varem kohtunud käsuga echo, vaadake see materjali.

Muude muutujate kasutamine

Muutujad võimaldavad salvestada skriptifailis teavet, näiteks — käskude tulemusi, et kasutada neid teiste käskude juures.

Ei ole midagi halba, kui täita üksikuid käske ilman nende tulemuste salvestamiseta, kuid sellise lähenemise võimalused on üsna piiratud.

On kaks tüüpi muutujaid, mida saab kasutada bash-skriptides:

  • Keskkonnamuutujad
  • Kasutaja määratud muutujad

Keskkonnamuutujad

Mõnikord tuleb shelli käskudes töötada teatud süsteemsete andmetega. Näiteks, kuidas trükkida praeguse kasutaja kodukausta:

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

Pange tähele, et me saame kasutada süsteemset muutujat $HOME kaksikutejutistes, see ei takista süsteemi selle tuvastamast. Siin on, mis juhtub, kui käivitada ülaltoodud skript.

Bash-skripti: algus
Keskkonnamuutuja kasutamine skriptis

Ent mis siis, kui soovime ekraanile trükkida dollarimärki? Proovime nii:

echo "I have $1 in my pocket"

Süsteem tuvastab dollarimärgi tsiteeritud reas ja arvab, et viidame muutuja väärtusele. Skript püüab ekraanile trükkida määramata muutuja väärtuse $1. See ei ole see, mida me vajame. Mida teha?

Sellises olukorras aitab kasutada juhtmärk, tagurpidi kaldkriips, dollarimärgi ees:

echo "I have $1 in my pocket"

Nüüd trükib skript täpselt seda, mida ootasime.

Bash-skripti: algus
Juhtmärkide kasutamine dollarimärgi trükkimiseks

Kasutaja määratud muutujad

Lisaks keskkonnamuutujatele võimaldavad bash-skriptid määrata ja kasutada skriptis ka kasutaja muutujaid. Need muutujad säilitavad oma väärtuse kuni skripti täitmine on lõpetatud.

Nagu süsteemsete muutujate puhul, saab kasutaja muutujatele viidata dollarimärgiga:
TNW-CUS-FMP — 10% sooduskupon meie teenustele, mis on saadaval aktiveerimiseks 7 päeva jooksul

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

Siin on, mis juhtub pärast sellise skripti käivitamist.

Bash-skripti: algus
Kasutaja muutujad skriptis

Käskude asendamine

Üks bash-skriptide kasulikumaid omadusi on võimalus väljundist teavet välja tõmmata ja määrata see muutujatele, mis võimaldab selle teabe kasutamist kõikjal skriptifailis.

Seda saab teha kahel viisil.

  • Tagurpidi jutumärgi «`» abil
  • Konstruktsiooni abil $()

Esimese lähenemisega veenduge, et ei sisestata tagurpidi jutumärgi asemel ühtegi tavalist jutumärki. Käsk tuleb sulguda kahe sellise märgiga:

mydir=`pwd`

Teise lähenemisega kirjutatakse sama nii:

mydir=$(pwd)

Ja skript võib lõppenud kujul välja näha nii:

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

Selle käigus salvestatakse käsu väljund pwdmuutujasse mydir, mille sisu, kasutades käsku echo, jõuab konsooli.

Bash-skripti: algus
Skript, mis salvestab käsu tulemused muutuja sisse

Matemaatilised toimingud

Matemaatiliste operatsioonide tegemiseks skriptifailis saab kasutada konstruktsiooni nagu $((a+b)):

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

Bash-skripti: algus
Matemaatilised operatsioonid skriptis

Kontrollstruktuur if-then

Mõnes skriptis on vajalik juhtida käskude juhtimist. Näiteks, kui mingisugune väärtus on suurem kui viis, tuleb teostada üks tegevus, vastasel juhul – teine. See on rakendatav paljude olukordade puhul, ning siin aitab meid kontrollstruktuur if-then. Lihtsaim versioon näeb välja nii:

if käsk
then
käskud
fi

Siin on töötav näide:

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

Antud juhul, kui käsk pwdtäitmine õnnestub, kuvatakse konsoolis tekst "it works".

Kasutan olemasolevaid teadmisi ja kirjutan keerukama skripti. Oletame, et peame leidma mingi kasutaja /etc/passwd, ja kui seda õnnestub leida, teavitame, et ta eksisteerib.

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

Nii näeb see välja pärast skripti käivitamist.

Bash-skripti: algus
Kasutaja otsimine

Siin kasutasime käsku grepkasutaja leidmiseks failis /etc/passwd. Kui käsk grepon teile tundmatu, siis selle kirjeldus on saadaval siin.

Selles näites, kui kasutaja leitakse, kuvab skript vastava teate. Aga kui kasutaja leidmine ei õnnestu? Sellisel juhul lõpetab skript lihtsalt täitmise, teatamata meile sellest. Soovime, et ta meile ka sellest räägiks, seega täiustame koodi.

Kontrollstruktuur if-then-else

Et programm saaks teavitada nii edukatest leidmistest kui ka ebaõnnestumisest, kasutame konstruktsiooni if-then-else. Nii see toimib:

if käsk
then
käskud
else
käskud
fi

Kui esimene käsk tagastab nulli, mis tähistab selle eduka täitmist, osutub tingimus tõeseks ja täitmine ei lähe haru muul juhul. Vastupidisel juhul, kui tagastatakse midagi, mis erineb nullist, mis tähistab ebaõnnestumist või vale tulemust, täidetakse käskud, mis on pärast muul juhul.

Kirjutame sellise skripti:

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

Tema täitmine läks haru muul juhul.

Bash-skripti: algus
Skripti käivitamine konstruktsiooniga if-then-else

Nii, jätkame edasi ja küsime keerulisemate tingimuste kohta. Mida teha, kui on vaja kontrollida mitte ühte, vaid mitut tingimust? Näiteks, kui vajalik kasutaja on leitud, peaksime kuvama ühe sõnumi, kui lisatingimus on täidetud — teise sõnumi jne. Sarnases olukorras aitavad meid sissetallatud tingimused. See näeb välja selline:

if käsk1
then
käsklused
elif käsk2
then
käsklused
fi

Kui esimene käsk tagastab nulli, mis näitab selle eduka täitmise, täidetakse käsklused esimeses plokis. siis, vastasel juhul, kui esimene tingimus osutub vale olevaks, ja kui teine käsk tagastab nulli, täidetakse teise ploki kood.

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

Sarnases skriptis võib näiteks luua uue kasutaja käsklusega useradd, kui otsing ei too tulemusi, või teha midagi muud kasulikku.

Numbrite võrdlemine

Skriptides saab võrrelda arvulisi väärtusi. Allpool on loetelu vastavatest käsklustest.

n1 -eq n2Tagastab tõese väärtuse, kui n1 size / bs n2.
n1 -ge n2 Tagastab tõese väärtuse, kui n1suurem või võrdne n2.
n1 -gt n2Tagastab tõese väärtuse, kui n1 ei nõuta enam n2.
n1 -le n2Tagastab tõese väärtuse, kui n1väiksem või võrdne n2.
n1 -lt n2Tagastab tõese väärtuse, kui n1 on väiksem n2.
n1 -ne n2Tagastab tõese väärtuse, kui n1ei ole võrdne n2.

Näiteks proovime ühte võrdlusoperaatorit. Pange tähele, et väljend on sulgudes.

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

See on, mida see käsk kuvab.

Bash-skripti: algus
Numbrite võrdlemine skriptides

Muu muutuja väärtus val1suurem kui 5, mille tulemusena täidetakse võrdlusoperaatori haru ja konsooli kuvatakse vastav sõnum. siisStringide võrdlemine

Skeemides saab võrrelda ka stringiväärtusi. Võrdlusoperaatorid näevad üsna lihtsad välja, kuid stringide võrdlemisel on teatud eripärad, millega me allpool tutvume. Siin on loetelu operaatoritest.

str1 = str2

Kontrollib, kas stringid on võrdsed, tagastab tõeteate, kui stringid on identsed. tr1 != str2
sTagastab tõeteate, kui stringid ei ole identsed.str1 < str2
Tagastab tõeteate, kuistr1 on väiksem kuistr2 str1 > str2.
suurem kui str1 on väiksem kui-n str1 str1 > str2.
Tagastab tõeteate, kui pikkus on suurem nullist. on väiksem kui-z str1
on võrdne nulliga.on suurem nullist. on väiksem kuiSiin on näide stringide võrdlemisest skriptis:

Skripti täitmise tulemus on järgmine.

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

Stringide võrdlemine skriptides

Bash-skripti: algus
Skripti stringide võrdlemine

Siin on üks stringide võrdlemise eripära, millest tasub rääkida. Nimelt tuleb operaatorid „>” ja „” kui väljundi suunamise käsku.

Nii näeb nende operaatoritega töötamine välja koodis:

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

Siin on skripti töö tulemused.

Bash-skripti: algus
Stringide võrdlemine, väljastatud hoiatus

Pange tähele, et skript, kuigi see täidetakse, väljastab hoiatuse:

./myscript: line 5: [: liiga palju argumente

Kuna sellest hoiatust lahti saada, paneme $val2 kahe jutumargi vahele:

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

Nüüd töötab kõik nagu peab.

Bash-skripti: algus
Skeemides saab võrrelda ka stringiväärtusi. Võrdlusoperaatorid näevad üsna lihtsad välja, kuid stringide võrdlemisel on teatud eripärad, millega me allpool tutvume. Siin on loetelu operaatoritest.

Veel üks operaatorite „>” ja „<” eripära seisneb selles, kuidas nad töötavad suur- ja väiketähtedega. Selle eripära mõistmiseks valmistan ette tekstifaili sellise sisuga:

Likegeeks
likegeeks

Salvestame selle nimega myfile, seejärel täidame terminalis sellise käsu:

sort myfile

See sorteerib faili read järgmiselt:

likegeeks
Likegeeks

Meeskond sort, vaikimisi sorteerib read kasvavat. See tähendab, et väike täht meie näites on väiksem kui suur täht. Nüüd valmistame ette skripti, mis võrdleb samu stringe:

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

Kui seda käivitada, selgub, et kõik on vastupidi - väike täht on nüüd suurest tähtest suurem.

Bash-skripti: algus
Käsk sort ja stringide võrdlemine skripti failis

Võrdluskaaludes on suured tähed väikestest väiksemad. Stringide võrdlemine toimub ASCII koodide võrdlemise kaudu, seega sõltub sortimisjärjekord sümbolite koodidest.

Meeskond sort, omakorda kasutab järjestus, mille määrab süsteemi keele seaded.

Failide kontrollid

Võib-olla, allpool toodud käsud on bash-skriptides kõige sagedamini kasutatavad. Need võimaldavad kontrollida erinevaid tingimusi, mis puudutavad faile. Siin on nende käskude loetelu.

-d fileKontrollib, kas fail eksisteerib ja kas see on kaust.
-e fileKontrollib, kas fail eksisteerib.
-f file Kontrollib, kas fail eksisteerib ja kas see on fail.
-r fileKontrollib, kas fail eksisteerib ja kas sellele on juurdepääs lugemiseks.
-s fileKontrollib, kas fail eksisteerib ja kas see ei ole tühi.
-w fileKontrollib, kas fail eksisteerib ja kas sellele on juurdepääs kirjutamiseks.
-x fileKontrollib, kas fail eksisteerib ja kas see on täidetav.
file1 -nt file2 Kontrollib, kas on uuem file1, kui file2.
file1 -ot file2Kontrollib, kas on vanem file1, kui file2.
-O file Kontrollib, kas fail eksisteerib ja kas selle omanik on praegune kasutaja.
-G fileKontrollib, kas fail eksisteerib ja kas selle grupi identifikaator vastab praeguse kasutaja grupi identifikaatorile.

Need käsud, nagu paljusid teisi, mida täna käsitlesime, on lihtne meeles pidada. Nende nimed, olles lühendatud erinevatest sõnadest, näitavad otseselt, milliseid kontrollimisi nad teevad.

Proovi üks käsk praktikas:

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

See skript, olemasoleva katalooge jaoks, kuvab selle sisu.

Bash-skripti: algus
Katalooge sisu väljastamine

Oletame, et teiste käskudega suudate ise katsetada, kõik need toimivad sama põhimõtte järgi.

Summary

Täna rääkisime sellest, kuidas alustada bash-skriptide kirjutamist ja käsitlesime mõningaid põhilisi teemasid. Tegelikult on bash-programmeerimise teema tohutu. See artikkel on tõlge mahuka seeria esimese osa 11 materjalist. Kui soovite jätku kohe - siin on nende materjalide originaallinkide nimekiri. Mugavuse huvides on siia ka lisatud see, mille tõlge on just loetud.

  1. Bash Script Step By Step — selles räägitakse, kuidas alustada bash-skriptide loomist, käsitletakse muutujate kasutamist, kirjeldatakse tingimuslikke konstruktsioone, arvutusi, numbrite ja stringide võrdlemist, küsimist failide kohta.
  2. Bash Scripting Part 2, Bash the awesome — siin käsitletakse for ja while tsüklite töö eripära.
  3. Bash Scripting Part 3, Parameters & options — see materjal käsitleb käsurea parameetreid ja võtmeid, mis võivad skripti edasi minna, samuti andmeid, mida sisestab kasutaja ja mida on võimalik lugeda failidest.
  4. Bash Scripting Part 4, Input & Output — siin räägitakse failide descriptoritest ja nende kasutamisest, sisendi, väljundi ja vigade voogudest, väljundi suunamisest.
  5. Bash Scripting Part 5, Sighals & Jobs — see materjal käsitleb Linuxi signaale, nende töötlemist skriptides ja skriptide käivitamist ajakava järgi.
  6. Bash Scripting Part 6, Functions — siin saab teada, kuidas funktsioonide loomine ja kasutamine skriptides, raamatukogude arendamine.
  7. Bash Scripting Part 7, Using sed — see artikkel käsitleb voolava tekstiredaktori sed kasutamist.
  8. Bash Scripting Part 8, Using awk — see materjal käsitleb andmetöötluse keele awk programmeerimist.
  9. Bash Scripting Part 9, Regular Expressions — siin saab lugeda, kuidas kasutada regulaaravaldusi bash-skriptides.
  10. Bash Scripting Osa 10, Praktilised Näited — siin on toodud meetodeid sõnumite töötlemiseks, mida saab kasutajatele saata, samuti meetodeid ketta jälgimiseks.
  11. Bash Scripting Osa 11, Expect Käsk — see materjal käsitleb Expect'i tööriista, millega saab automatiseerida interaktiivsete utiliitidega suhtlemist. Eelkõige räägitakse siin expect-skriptidest ja nende koostööst bash-skriptide ja teiste programmide kanssa.

Peame oluliseks, et selle artiklite sarja üks väärtuslikimaid omadusi on see, et see alustab kõige lihtsamast, mis sobib igasuguse tasemega kasutajatele, ja suunab järk-järgult tõsistele teemadele, andes võimaluse kõigile, kes soovivad, edusammude saavutamiseks Linuxi käsurea skriptide loomises.

Austatud lugejad! Palume bash-programmeerimise eksperte jagada, kuidas nad saavutasid oma oskustes tipptaseme, jagada saladusi, ja ootame muljeid nendelt, kes just kirjutasid oma esimese skripti.

Bash-skripti: algus

Ainult registreeritud kasutajad saavad küsitluses osaleda. Logige sisse, palun.

Kas tõlkida teiste artiklite osad?

  • Jah!

  • Ei, ei ole vajalik

Hääletas 1030 kasutajat. Erakuks jäi 106 kasutajat.

Allikas: habr.com

Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid 🔥 Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster