Bash-skriptid: algus

Bash-skriptid: algus
Bash-skriptid, 2. osa: tsüklid
Bash-skriptid, 3. osa: käsurea valikud ja lülitid
Bash-skriptid 4. osa: sisend ja väljund
Bash-skriptid, 5. osa: signaalid, taustaülesanded, skriptihaldus
Bash-skriptid, 6. osa: funktsioonid ja raamatukogu arendus
Bash-skriptid, 7. osa: sed ja tekstitöötlus
Bash-skriptid, 8. osa: awk andmetöötluskeel
Bash-skriptid 9. osa: Regulaaravaldised
Bash-skriptid, 10. osa: praktilised näited
Bash-skriptid, 11. osa: interaktiivsete utiliitide ootus ja automatiseerimine

Täna räägime bash-skriptidest. see - käsurea skriptid, kirjutatud bash-shelli jaoks. On ka teisi kestasid, nagu zsh, tcsh, ksh, kuid me keskendume bashile. See materjal on mõeldud kõigile, ainsaks tingimuseks on töövõime käsurida Linux.

Bash-skriptid: algus

Käsurea skriptid on samade käskude kogumid, mida saab sisestada klaviatuurilt, koguda failidesse ja ühendada mõne ühise eesmärgiga. Sel juhul võivad meeskondade töö tulemused olla iseseisva väärtusega või olla sisendandmeteks teistele meeskondadele. Skriptid on võimas viis sageli sooritatavate toimingute automatiseerimiseks.

Bash-skriptid: algus

Niisiis, kui me räägime käsurealt, siis see võimaldab teil täita mitu käsku korraga, sisestades need semikooloniga eraldatuna:

pwd ; whoami

Tegelikult, kui proovisite seda oma terminalis, on teie esimene kahte käsku sisaldav bash-skript juba kirjutatud. See toimib nii. Meeskond esimene pwd kuvab teavet praeguse töökataloogi ja seejärel käsu kohta whoaminäitab teavet selle kasutaja kohta, kellena olete sisse logitud.

Seda lähenemist kasutades saate ühele reale kombineerida nii palju käske kui soovite, ainsaks piiranguks on programmile edastatavate argumentide maksimaalne arv. Selle piirangu saate määrata järgmise käsuga:

getconf ARG_MAX

Käsurida on suurepärane tööriist, kuid käske tuleb sisestada iga kord, kui neid vaja läheb. Mis siis, kui kirjutaksime faili käsud ja kutsuksime selle faili lihtsalt nende täitmiseks? Tegelikult nimetatakse faili, millest me räägime, käsurea skriptiks.

Kuidas bash-skriptid töötavad

Looge käsuga tühi fail touch. Selle esimene rida peab näitama, millist kesta me kasutame. Oleme huvitatud bash, seega on faili esimene rida:

#!/bin/bash

Selle faili teised read kasutavad räsimärki, et näidata kommentaare, mida kest ei töötle. Esimene rida on aga erijuhtum, seal on räsi, millele järgneb hüüumärk (seda jada nimetatakse shebang) ja tee bash, osutage süsteemile, mille jaoks skript on spetsiaalselt loodud bash.

Shelli käsud on eraldatud reavahetusega, kommentaarid on eraldatud räsimärgiga. See näeb välja selline:

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

Siin saab sarnaselt käsureale kirjutada käsud ühele reale, eraldades need semikooloniga. Kui aga kirjutada käsud erinevatele ridadele, on faili lihtsam lugeda. Igal juhul töötleb kest neid.

Skriptifaili õiguste määramine

Salvestage fail, andes sellele nime myscriptja bash-skripti loomise töö on peaaegu lõppenud. Nüüd jääb üle vaid see fail käivitatavaks muuta, muidu kui proovite seda käivitada, tekib tõrge Permission denied.

Bash-skriptid: algus
Proovitakse käivitada skriptifaili valesti konfigureeritud õigustega

Teeme faili käivitatavaks:

chmod +x ./myscript

Nüüd proovime seda teostada:

./myscript

Pärast lubade seadistamist töötab kõik nii nagu peab.

Bash-skriptid: algus
Bash-skripti käivitamine õnnestus

Sõnumi väljund

Teksti väljastamiseks Linuxi konsooli kasutage käsku echo. Kasutame selle fakti teadmisi ja redigeerime oma skripti, lisades selgitused andmetele, mida selles juba olevad käsud väljastavad:

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

See juhtub pärast värskendatud skripti käivitamist.

Bash-skriptid: algus
Sõnumite väljastamine skriptist

Nüüd saame käsu abil kuvada selgitavad märkused echo. Kui te ei tea, kuidas faili Linuxi tööriistade abil redigeerida või te pole seda käsku varem näinud echo, viska pilk peale see materjali.

Muutujate kasutamine

Muutujad võimaldavad salvestada skriptifaili teavet, näiteks käskude tulemusi, et seda saaks kasutada teised käsud.

Üksikute käskude täitmisel ilma nende tulemusi salvestamata pole midagi halba, kuid selle lähenemisviisi võimalused on üsna piiratud.

Bash-skriptides saab kasutada kahte tüüpi muutujaid:

  • Keskkonnamuutujad
  • Kasutaja muutujad

Keskkonnamuutujad

Mõnikord peavad shellikäsud töötama teatud süsteemiandmetega. Siin on näide praeguse kasutaja kodukataloogi kuvamiseks:

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

Pange tähele, et saame kasutada süsteemimuutujat $HOME jutumärkides, ei takista see süsteemil seda ära tunda. See on see, mida saate ülaltoodud stsenaariumi käivitamisel.

Bash-skriptid: algus
Keskkonnamuutuja kasutamine skriptis

Mida teha, kui teil on vaja ekraanile kuvada dollarimärk? Proovime seda:

echo "I have $1 in my pocket"

Süsteem tuvastab tsiteeritud stringis dollarimärgi ja eeldab, et oleme viidanud muutujale. Skript püüab kuvada määratlemata muutuja väärtust $1. See pole see, mida me vajame. Mida teha?

Sellises olukorras aitab paomärk, kaldkriips enne dollarimärki:

echo "I have $1 in my pocket"

Skript väljastab nüüd täpselt seda, mida oodatakse.

Bash-skriptid: algus
Põgenemisjärjestuse kasutamine dollarimärgi printimiseks

Kasutaja muutujad

Lisaks keskkonnamuutujatele võimaldavad bash-skriptid määratleda ja kasutada skriptis oma muutujaid. Sellised muutujad hoiavad väärtust kuni skripti täitmise lõpuni.

Nagu süsteemimuutujate puhul, pääseb kasutaja muutujatele juurde dollarimärgi abil:
TNW-CUS-FMP - sooduskood meie teenustelt 10% allahindluseks, aktiveerimiseks saadaval 7 päeva jooksul

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

See juhtub pärast sellise skripti käivitamist.

Bash-skriptid: algus
Kohandatud muutujad skriptis

Käskude asendamine

Bash-skriptide üks kõige kasulikumaid funktsioone on võime eraldada käsuväljundist teavet ja määrata see muutujatele, võimaldades teil seda teavet kasutada skriptifailis kõikjal.

Seda saab teha kahel viisil.

  • Kasutades märki "`"
  • Disaini järgi $()

Kui kasutate esimest lähenemist, olge ettevaatlik, et mitte lisada seljamärgi asemel ühte jutumärki. Käsk peab olema ümbritsetud kahe sellise ikooniga:

mydir=`pwd`

Teises lähenemises kirjutatakse sama asi järgmiselt:

mydir=$(pwd)

Ja skript võib lõpuks välja näha selline:

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

Selle töö ajal käsu väljund pwdsalvestatakse muutujasse mydir, mille sisu, kasutades käsku echo, läheb konsooli.

Bash-skriptid: algus
Skript, mis salvestab käsu tulemused muutujasse

Matemaatilised tehted

Skriptifailis matemaatiliste toimingute tegemiseks võite kasutada konstruktsiooni nagu $((a+b)):

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

Bash-skriptid: algus
Matemaatilised tehted skriptis

kui-siis juhtkonstruktsioon

Mõne stsenaariumi korral peate juhtima käsu täitmise voogu. Näiteks kui teatud väärtus on suurem kui viis, peate tegema ühe toimingu, vastasel juhul teise. See on rakendatav paljudes olukordades ja siin aitab meid juhtimisstruktuur if-then. Kõige lihtsamal kujul näeb see välja järgmine:

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

Siin on toimiv näide:

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

Sel juhul, kui käsk täidetakse pwdedukalt lõpule viidud, kuvatakse konsoolis tekst "see töötab".

Kasutame oma teadmisi ja kirjutame keerulisema stsenaariumi. Oletame, et peame leidma kindla kasutaja /etc/passwdja kui teil õnnestus see leida, andke teada, et see on olemas.

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

See juhtub pärast selle skripti käivitamist.

Bash-skriptid: algus
Kasutaja otsing

Siin kasutasime käsku grepfailist kasutaja otsimiseks /etc/passwd. Kui meeskond grepteile võõras, selle kirjelduse leiate siin.

Selles näites, kui kasutaja leitakse, kuvab skript vastava teate. Mis siis, kui kasutajat ei leitud? Sel juhul lõpetab skript lihtsalt täitmise ilma meile midagi ütlemata. Soovime, et ta meile ka sellest räägiks, nii et me parandame koodi.

kui-siis-muidu juhtkonstruktsioon

Selleks, et programm saaks aru anda nii eduka otsingu kui ka ebaõnnestumise tulemustest, kasutame konstruktsiooni if-then-else. See toimib järgmiselt.

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

Kui esimene käsk tagastab nulli, mis tähendab, et see täideti edukalt, on tingimus tõene ja täitmine ei jätku haru kaudu else. Vastasel juhul, kui tagastatakse midagi muud kui null, mis viitaks ebaõnnestumisele või valele tulemusele, käsud pärast else.

Kirjutame järgmise 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 hukkamine läks tühjaks else.

Bash-skriptid: algus
Skripti käitamine if-then-else konstruktsiooniga

Noh, lähme edasi ja küsime endalt keerulisemate tingimuste kohta. Mis siis, kui peate kontrollima mitte ühte, vaid mitut tingimust? Näiteks kui soovitud kasutaja leitakse, tuleb kuvada üks teade, kui mõni muu tingimus on täidetud, siis teine ​​teade jne. Sellises olukorras aitavad meid pesastatud tingimused. See näeb välja selline:

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

Kui esimene käsk tagastab nulli, mis näitab selle edukat täitmist, täidetakse esimese ploki käsud then, vastasel juhul, kui esimene tingimus on väär ja kui teine ​​käsk tagastab nulli, käivitatakse teine ​​koodiplokk.

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

Sellises skriptis saab näiteks käsu abil luua uue kasutaja useradd, kui otsing ei andnud tulemusi või tehke midagi muud kasulikku.

Numbrite võrdlus

Skriptides saate võrrelda arvväärtusi. Allpool on asjakohaste käskude loend.

n1 -eq n2Tagastab tõesuse, kui n1 võrdub n2.
n1 -ge n2 Tagastab tõesuse, kui n1rohkem või võrdne n2.
n1 -gt n2Tagastab tõesuse, kui n1 parem n2.
n1 -le n2Tagastab tõesuse, kui n1väiksem või võrdne n2.
n1 -lt n2Tagastab tõene, kui n1 on väiksem kui n2.
n1 -ne n2Tagastab tõesuse, kui n1mitte võrdne n2.

Näitena proovime üht võrdlusoperaatorit. Pange tähele, et väljend on nurksulgudes.

#!/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 see, mida see käsk väljastab.

Bash-skriptid: algus
Numbrite võrdlus skriptides

Muutuv väärtus val1suurem kui 5, siis haru täidetakse thenvõrdlusoperaator ja konsoolis kuvatakse vastav teade.

Stringide võrdlus

Skriptid võivad võrrelda ka stringi väärtusi. Võrdlusoperaatorid näevad välja üsna lihtsad, kuid stringide võrdlusoperatsioonidel on teatud funktsioonid, mida me allpool käsitleme. Siin on operaatorite loend.

str1 = str2 Testib stringide võrdsust, tagastades tõene, kui stringid on identsed.
str1 != str2Tagastab tõene, kui stringid ei ole identsed.
str1 < str2Tagastab tõesuse, kui str1vähem kui str2.
str1 > str2 Tagastab tõesuse, kui str1rohkem kui str2.
-n str1 Tagastab tõene, kui pikkus str1Üle nulli.
-z str1Tagastab tõene, kui pikkus str1võrdne nulliga.

Siin on näide stringide võrdlemisest skriptis:

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

Skripti täitmise tulemusena saame järgmise.

Bash-skriptid: algus
Stringide võrdlemine skriptides

Siin on üks stringide võrdlemise funktsioon, mida tasub mainida. Nimelt tuleb operaatorid ">" ja "<" paotada kaldkriipsuga, vastasel juhul ei tööta skript õigesti, kuigi veateateid ei ilmu. Skript tõlgendab märki ">" väljundi ümbersuunamise käsuna.

Nende operaatoritega töötamine koodis näeb välja järgmine:

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

Bash-skriptid: algus
Stringide võrdlus, hoiatus antud

Pange tähele, et kuigi skript on käivitatud, annab see hoiatuse:

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

Sellest hoiatusest vabanemiseks järeldame $val2 jutumärkides:

#!/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 nii nagu peab.

Bash-skriptid: algus
Stringide võrdlus

Operaatorite ">" ja "<" teine ​​omadus on see, kuidas nad töötavad suur- ja väiketähtedega. Selle funktsiooni mõistmiseks valmistame ette järgmise sisuga tekstifaili:

Likegeeks
likegeeks

Salvestame selle nime andes myfile, seejärel käivitage terminalis järgmine käsk:

sort myfile

See sorteerib faili read järgmiselt:

likegeeks
Likegeeks

Meeskond sort, vaikimisi sorteerib stringid kasvavas järjekorras, see tähendab, et meie näite väiketäht on väiksem kui suur. 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äiketäht on nüüd suurem kui suur.

Bash-skriptid: algus
Skriptifaili sortimiskäsk ja stringide võrdlemine

Võrdluskäskudes on suurtähed väiksemad kui väikesed tähed. Stringide võrdlemine toimub siin märkide ASCII koodide võrdlemise teel, sortimisjärjekord sõltub seega märgikoodidest.

Meeskond sortkasutab omakorda süsteemi keeleseadetes määratud sortimisjärjekorda.

Failide kontrollid

Võib-olla kasutatakse bash-skriptides kõige sagedamini järgmisi käske. Need võimaldavad teil kontrollida failide erinevaid tingimusi. Siin on nende käskude loend.

-d fileKontrollib, kas fail on olemas ja kas see on kataloog.
-e fileKontrollib, kas fail on olemas.
-f file Kontrollib, kas fail on olemas ja kas see on fail.
-r fileKontrollib, kas fail on olemas ja loetav.
-s file ПKontrollib, kas fail on olemas ja kas see pole tühi.
-w fileKontrollib, kas fail on olemas ja kirjutatav.
-x fileKontrollib, kas fail on olemas ja käivitatav.
file1 -nt file2 Kontrollib, kas see on uuem file1kui file2.
file1 -ot file2Kontrollib, kas vanem file1kui file2.
-O file Kontrollib, kas fail on olemas ja kuulub praegusele kasutajale.
-G fileKontrollib, kas fail on olemas ja kas selle grupi ID ühtib praeguse kasutaja grupi ID-ga.

Neid käske, nagu ka paljusid teisi täna käsitletavaid, on lihtne meeles pidada. Nende nimed, mis on lühendid erinevatest sõnadest, näitavad otseselt nende teostatavaid kontrolle.

Proovime ühte käskudest 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 olemasoleva kataloogi skript kuvab selle sisu.

Bash-skriptid: algus
Kataloogi sisu loetlemine

Usume, et ülejäänud käskudega saate ise katsetada, neid kõiki kasutatakse samal põhimõttel.

Tulemused

Täna rääkisime bash-skriptide kirjutamise alustamisest ja käsitlesime mõningaid põhiteadmisi. Tegelikult on bashi programmeerimise teema tohutu. See artikkel on suure 11 materjalist koosneva sarja esimese osa tõlge. Kui soovite praegu jätkata, siis siin on nende materjalide originaalide loend. Mugavuse huvides on siin lisatud tõlge, mille just lugesite.

  1. Bashi skript samm-sammult — siin räägitakse sellest, kuidas alustada bash-skriptide loomist, käsitletakse muutujate kasutamist, kirjeldatakse tinglikke struktuure, arvutusi, arvude, stringide võrdlemist ning failide kohta info väljaselgitamist.
  2. Bash skripti 2. osa, Bash the awesome — siin paljastatakse for- ja while-silmustega töötamise omadused.
  3. Bashi skriptimise osa 3, parameetrid ja valikud — see materjal on pühendatud käsurea parameetritele ja võtmetele, mida saab skriptidele edastada ning mis töötavad andmetega, mida kasutaja sisestab ja mida saab lugeda failidest.
  4. Bashi skriptimine, 4. osa, sisend ja väljund - siin räägime failideskriptoritest ja nendega töötamisest, sisendist, väljundist, veavoogudest ja väljundi ümbersuunamisest.
  5. Bashi skriptimine, 5. osa, Sighals & Jobs — see materjal on pühendatud Linuxi signaalidele, nende skriptides töötlemisele ja skriptide ajakavale käivitamisele.
  6. Bashi skriptimine 6. osa, funktsioonid — siit saate teada skriptides funktsioonide loomise ja kasutamise ning teekide arendamise kohta.
  7. Bashi skriptimine 7. osa, sed kasutamine — see artikkel on pühendatud sed voogesituse tekstiredaktoriga töötamisele.
  8. Bashi skriptimine 8. osa, awk kasutamine — see materjal on pühendatud programmeerimisele awk andmetöötluskeeles.
  9. Bashi skriptimine, 9. osa, regulaaravaldised — siit saate lugeda regulaaravaldiste kasutamise kohta bash-skriptides.
  10. Bashi skriptimise 10. osa, praktilised näited — siin on tehnikad kasutajatele saadetavate sõnumitega töötamiseks, samuti ketta jälgimise meetod.
  11. Bashi skriptimise osa 11, oodake käsku — see materjal on pühendatud tööriistale Expect, mille abil saate interaktiivsete utiliitidega suhtlemist automatiseerida. Eelkõige räägime oodatavatest skriptidest ja nende koostoimest bash-skriptide ja muude programmidega.

Usume, et selle artiklisarja üks väärtuslikke omadusi on see, et alustades kõige lihtsamast, mis sobib iga taseme kasutajatele, viib see järk-järgult üsna tõsiste teemadeni, andes kõigile võimaluse Linuxi käsurea skriptide loomisel edasi liikuda. .

Head lugejad! Palume bash-programmeerimisgurudel rääkida, kuidas nad oma meisterlikkuse kõrgustele jõudsid, oma saladusi jagada ning ootame muljeid neilt, kes just oma esimese stsenaariumi kirjutasid.

Bash-skriptid: algus

Küsitluses saavad osaleda ainult registreerunud kasutajad. Logi sissepalun.

Kas ma peaksin tõlkima ülejäänud artiklite sarja?

  • Jah!

  • Pole vaja

1030 kasutajat hääletas. 106 kasutajat jäi erapooletuks.

Allikas: www.habr.com

Lisa kommentaar