Bash skripts: it begjin

Bash skripts: it begjin
Bash Scripts Diel 2: Loops
Bash-skripts, diel 3: Kommandorigelopsjes en skeakels
Bash Scripts Part 4: Ynput en útfier
Bash-skripts, diel 5: sinjalen, eftergrûntaken, skriptbehear
Bash Scripts, diel 6: Funksjes en biblioteekûntwikkeling
Bash-skripts, diel 7: sed en wurdferwurking
Bash-skripts, diel 8: awk dataferwurkingstaal
Bash Scripts Part 9: Reguliere ekspresjes
Bash Scripts Part 10: Praktyske foarbylden
Bash-skripts, diel 11: ferwachtsje en automatisearring fan ynteraktive nutsbedriuwen

Hjoed sille wy prate oer bash-skripts. Dit - kommandorigelskripts, skreaun foar de bash shell. D'r binne oare skelpen lykas zsh, tcsh, ksh, mar wy sille rjochtsje op bash. Dit materiaal is bedoeld foar elkenien, de ienige betingst is de mooglikheid om yn te wurkjen kommandorigel Linux.

Bash skripts: it begjin

Kommandorigelskripts binne kolleksjes fan deselde kommando's dy't kinne wurde ynfierd fan it toetseboerd, sammele yn bestannen en ferienige troch wat mienskiplik doel. Yn dit gefal kinne de resultaten fan it wurk fan 'e teams fan ûnôfhinklike wearde wêze of as ynputgegevens foar oare teams tsjinje. Skripten binne in krêftige manier om faak útfierde aksjes te automatisearjen.

Bash skripts: it begjin

Dus, as wy prate oer de kommandorigel, kinne jo ferskate kommando's tagelyk útfiere troch se yn te fieren skieden troch in puntkomma:

pwd ; whoami

Yn feite, as jo dit besocht hawwe yn jo terminal, is jo earste bash-skript mei twa kommando's al skreaun. It wurket sa. Team earst pwd toant ynformaasje oer de aktuele wurkmap, dan it kommando whoamitoant ynformaasje oer de brûker as jo binne oanmeld.

Mei dizze oanpak kinne jo safolle kommando's kombinearje as jo wolle op ien rigel, de ienige limyt is it maksimum oantal arguminten dat kin wurde trochjûn oan it programma. Jo kinne dizze limyt definiearje mei it folgjende kommando:

getconf ARG_MAX

De kommandorigel is in geweldich ark, mar jo moatte elke kear kommando's ynfiere as jo se nedich binne. Wat as wy in set kommando's yn in bestân skriuwe en dat bestân gewoan neamden om se út te fieren? Yn feite wurdt it bestân wêr't wy it oer hawwe, in kommandorigelskript neamd.

Hoe bash-skripts wurkje

Meitsje in lege triem mei it kommando touch. De earste rigel moat oanjaan hokker shell wy sille brûke. Wy binne ynteressearre yn bash, dus de earste rigel fan it bestân sil wêze:

#!/bin/bash

Oare rigels yn dit bestân brûke it hash-symboal om opmerkings oan te jaan dy't de shell net ferwurket. De earste rigel is lykwols in spesjaal gefal, d'r is in hash folge troch in útropteken (dizze folchoarder wurdt neamd shebang) en it paad nei bash, oanjaan foar it systeem dat it skript spesifyk foar makke is bash.

Shell kommando's wurde skieden troch in line feed, opmerkings wurde skieden troch in hash teken. Dit is hoe't it derút sjocht:

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

Hjir, krekt as op 'e kommandorigel, kinne jo kommando's skriuwe op ien rigel, skieden troch puntkomma's. As jo ​​​​de kommando's lykwols op ferskate rigels skriuwe, is it bestân makliker te lêzen. Yn alle gefallen sil de shell se ferwurkje.

It ynstellen fan skripttriemmooglikheden

Bewarje it bestân dat it in namme jout myscript, en it wurk fan it meitsjen fan it bash-skript is hast klear. No bliuwt it allinich om dit bestân útfierber te meitsjen, oars, as jo besykje it út te fieren, sille jo in flater tsjinkomme Permission denied.

Bash skripts: it begjin
Besiket in skripttriem út te fieren mei ferkeard ynstelde tagongsrjochten

Litte wy it bestân útfierber meitsje:

chmod +x ./myscript

Litte wy no besykje it út te fieren:

./myscript

Nei it ynstellen fan de tagongsrjochten wurket alles sa't it moat.

Bash skripts: it begjin
Bash-skript mei súkses útfiere

Berjochtútfier

Om tekst út te fieren nei de Linux-konsole, brûk it kommando echo. Litte wy de kennis fan dit feit brûke en ús skript bewurkje, taljochtingen tafoegje oan 'e gegevens dy't wurde útfierd troch de kommando's dy't der al yn binne:

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

Dit is wat bart nei it útfieren fan it bywurke skript.

Bash skripts: it begjin
It útfieren fan berjochten fan in skript

No kinne wy ​​​​ferklearjende notysjes werjaan mei it kommando echo. As jo ​​​​net witte hoe't jo in bestân kinne bewurkje mei Linux-ark, of jo hawwe it kommando net earder sjoen echo, Sjoch ris nei dit it materiaal.

It brûken fan fariabelen

Fariabelen kinne jo ynformaasje opslaan yn in skripttriem, lykas de resultaten fan kommando's, foar gebrûk troch oare kommando's.

D'r is neat mis mei it útfieren fan yndividuele kommando's sûnder har resultaten op te slaan, mar dizze oanpak is frij beheind yn har mooglikheden.

D'r binne twa soarten fariabelen dy't kinne wurde brûkt yn bash-skripts:

  • Miljeu Fariabelen
  • Brûker Fariabelen

Miljeu Fariabelen

Soms moatte shell-kommando's wurkje mei guon systeemgegevens. Hjir is in foarbyld fan hoe't jo de thúsmap fan 'e aktuele brûker werjaan:

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

Tink derom dat wy in systeemfariabele kinne brûke $HOME yn dûbele oanhalingstekens sil dit net foarkomme dat it systeem it herkent. Dit is wat jo krije as jo it boppesteande senario útfiere.

Bash skripts: it begjin
It brûken fan in omjouwingsfariabele yn in skript

Wat as jo in dollarteken op it skerm moatte werjaan? Litte wy dit besykje:

echo "I have $1 in my pocket"

It systeem sil detect in dollar teken yn in sitearre tekenrige en oannimme dat wy hawwe ferwiisd in fariabele. It skript sil besykje de wearde fan in net definieare fariabele wer te jaan $1. Dit is net wat wy nedich binne. Wat te dwaan?

Yn dizze situaasje sil it brûken fan it ûntsnappingskarakter, in backslash, foardat it dollarteken helpe:

echo "I have $1 in my pocket"

It skript sil no presys útfiere wat ferwachte wurdt.

Bash skripts: it begjin
In ûntsnappingsekwinsje brûke om in dollarteken te printsjen

Brûker Fariabelen

Neist omjouwingsfariabelen kinne bash-skripts jo eigen fariabelen definiearje en brûke yn it skript. Sokke fariabelen hâlde in wearde oant it skript de útfiering foltôget.

Lykas by systeemfariabelen kinne brûkersfariabelen tagonklik wurde mei it dollarteken:
TNW-CUS-FMP - promoasjekoade foar in koarting fan 10% op ús tsjinsten, beskikber foar aktivearring binnen 7 dagen

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

Dit is wat der bart nei it útfieren fan sa'n skript.

Bash skripts: it begjin
Oanpaste fariabelen yn in skript

Kommando Ferfanging

Ien fan 'e nuttichste funksjes fan bash-skripts is de mooglikheid om ynformaasje út kommando-útfier te ekstrahearjen en ta te jaan oan fariabelen, wêrtroch jo dizze ynformaasje oeral yn it skriptbestân kinne brûke.

D'r binne twa manieren om dit te dwaan.

  • Mei de backtick "`"
  • By ûntwerp $()

As jo ​​​​de earste oanpak brûke, wês foarsichtich dat jo gjin inkelde oanhalingsteken opnimme yn plak fan 'e backtick. It kommando moat wurde ynsletten yn twa sokke ikoanen:

mydir=`pwd`

Yn 'e twadde oanpak is itselde ding sa skreaun:

mydir=$(pwd)

En it skript kin der sa útsjen:

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

Tidens syn operaasje, de útfier fan it kommando pwdsil wurde bewarre yn in fariabele mydir, wêrfan de ynhâld, mei it kommando echo, sil gean nei de konsole.

Bash skripts: it begjin
In skript dat de resultaten fan in kommando bewarret yn in fariabele

Wiskundige operaasjes

Om wiskundige operaasjes út te fieren yn in skripttriem, kinne jo in konstruksje brûke lykas $((a+b)):

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

Bash skripts: it begjin
Wiskundige operaasjes yn in skript

as-dan kontrôle konstruksje

Yn guon senario's moatte jo de stream fan kommando-útfiering kontrolearje. Bygelyks, as in bepaalde wearde grutter is as fiif, moatte jo ien aksje útfiere, oars in oare. Dit is fan tapassing yn in protte situaasjes, en hjir sil de kontrôlestruktuer ús helpe if-then. Yn syn ienfâldichste foarm sjocht it der sa út:

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

Hjir is in wurkjend foarbyld:

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

Yn dit gefal, as it kommando wurdt útfierd pwdsil suksesfol foltôgje, sil de tekst "it wurket" wurde werjûn yn 'e konsole.

Litte wy de kennis brûke dy't wy hawwe en in komplekser skript skriuwe. Litte wy sizze dat wy in bepaalde brûker moatte fine yn /etc/passwd, En as jo slagge om te finen it, rapportearje dat it bestiet.

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

Dit is wat bart nei it útfieren fan dit skript.

Bash skripts: it begjin
Meidogger sykje

Hjir hawwe wy it kommando brûkt grepom in brûker te sykjen yn in bestân /etc/passwd. As it team grepûnbekend foar jo, syn beskriuwing kin fûn wurde hjir.

Yn dit foarbyld, as de brûker wurdt fûn, sil it skript in oerienkommende berjocht werjaan. Wat as de brûker net fûn wurde koe? Yn dit gefal sil it skript gewoan de útfiering foltôgje sûnder ús wat te fertellen. Wy wolle graach dat hy ús hjir ek oer fertelt, sadat wy de koade ferbetterje.

as-dan-oars kontrôle konstruksje

Om it programma sawol de resultaten fan in suksesfolle sykaksje as mislearring te rapportearjen, sille wy de konstruksje brûke if-then-else. Hjir is hoe't it wurket:

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

As it earste kommando nul weromjout, wat betsjut dat it mei súkses útfierd is, sil de betingst wier wêze en sil de útfiering net trochgean by de tûke else. Oars, as wat oars dan nul wurdt weromjûn, wat soe oanjaan op mislearring, of in falsk resultaat, de kommando's nei else.

Litte wy it folgjende skript skriuwe:

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

Syn eksekúsje gie yn 'e rin else.

Bash skripts: it begjin
In skript útfiere mei in as-dan-oars-konstruksje

No, lit ús fierder gean en ússels ôffreegje oer mear komplekse betingsten. Wat as jo net ien betingst moatte kontrolearje, mar ferskate? Bygelyks, as de winske brûker fûn wurdt, moat ien berjocht werjûn wurde, as oan in oare betingst foldien is, moat in oar berjocht werjûn wurde, ensfh. Yn sa'n situaasje sille geneste betingsten ús helpe. It sjocht der sa út:

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

As it earste kommando nul jout, wat de suksesfolle útfiering oanjout, wurde de kommando's yn it earste blok útfierd then, oars, as de earste betingst falsk is en as it twadde kommando nul jout, sil it twadde blok koade wurde útfierd.

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

Yn sa'n skript kinne jo bygelyks in nije brûker meitsje mei it kommando useradd, as it sykjen gjin resultaten produsearre, of dwaan wat oars nuttich.

Ferliking fan nûmers

Yn skripts kinne jo numerike wearden fergelykje. Hjirûnder is in list mei relevante kommando's.

n1 -eq n2Jout wier as n1 lykweardich n2.
n1 -ge n2 Jout wier as n1mear of gelyk n2.
n1 -gt n2Jout wier as n1 mear as n2.
n1 -le n2Jout wier as n1minder of gelyk n2.
n1 -lt n2Jout wier as n1 minder is as n2.
n1 -ne n2Jout wier as n1net gelyk n2.

Litte wy as foarbyld ien fan 'e fergelikingsoperators besykje. Tink derom dat de útdrukking ynsletten is yn fjouwerkante heakjes.

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

Dit is wat dit kommando sil útfiere.

Bash skripts: it begjin
Fergeliking fan nûmers yn skripts

Fariabele wearde val1grutter as 5, de tûke einiget mei wurdt útfierd thenferliking operator en in oerienkommende berjocht wurdt werjûn yn de konsole.

String ferliking

Skripten kinne ek tekenrige wearden fergelykje. Fergelikingsoperators sjogge frij ienfâldich, mar stringfergelikingsoperaasjes hawwe bepaalde funksjes, dy't wy hjirûnder sille oanreitsje. Hjir is in list fan operators.

str1 = str2 Testet snaren foar gelikensens, en jout wier as de snaren identyk binne.
str1 != str2Jout wier werom as de snaren net identyk binne.
str1 < str2Jout wier as str1minder as str2.
str1 > str2 Jout wier as str1mear as str2.
-n str1 Jout wier as lingte str1Boppe nul.
-z str1Jout wier as lingte str1gelyk oan nul.

Hjir is in foarbyld fan it fergelykjen fan snaren yn in skript:

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

As gefolch fan it útfieren fan it skript krije wy it folgjende.

Bash skripts: it begjin
Fergelykje snaren yn skripts

Hjir is ien skaaimerk fan snaarfergeliking dy't it neamen wurdich is. De operators ">" en "<" moatte nammentlik ûntkommen wurde mei in backslash, oars sil it skript net goed wurkje, hoewol't der gjin flaterberjochten ferskine. It skript ynterpretearret it ">" teken as in útfier-omliedingskommando.

Hjir is hoe wurkjen mei dizze operators derút sjocht yn koade:

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

Hjir binne de resultaten fan it skript.

Bash skripts: it begjin
String ferliking, warskôging jûn

Tink derom dat it skript, hoewol útfierd, in warskôging jout:

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

Om fan dizze warskôging ôf te kommen, konkludearje wy $val2 yn dûbele oanhalingstekens:

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

No wurket alles sa't it moat.

Bash skripts: it begjin
String ferliking

In oar skaaimerk fan de operators ">" en "<" is hoe't se wurkje mei haadletters en lytse letters. Om dizze funksje te begripen, litte wy in tekstbestân tariede mei de folgjende ynhâld:

Likegeeks
likegeeks

Litte wy it bewarje troch it in namme te jaan myfile, fier dan it folgjende kommando yn 'e terminal:

sort myfile

It sil de rigels fan it bestân sortearje as dit:

likegeeks
Likegeeks

team sort, standert, sortearret stringen yn oprinnende folchoarder, dat is, de lytse letter yn ús foarbyld is lytser as de haadletter. Litte wy no in skript tariede dat deselde snaren fergelykje sil:

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

As jo ​​it útfiere, docht bliken dat alles oarsom is - de lytse letter is no grutter as de haadletter.

Bash skripts: it begjin
It kommando sortearje en stringen te fergelykjen yn in skripttriem

Yn fergelikingskommando's binne haadletters lytser as lytse letters. String ferliking hjir wurdt dien troch it fergelykjen fan de ASCII koades fan de karakters, de sortearring folchoarder is dus ôfhinklik fan de karakter koades.

team sort, op syn beurt, brûkt de sortearring folchoarder spesifisearre yn de systeem taal ynstellings.

Bestânskontrôles

Miskien wurde de folgjende kommando's it meast brûkt yn bash-skripts. Se kinne jo ferskate betingsten kontrolearje oangeande bestannen. Hjir is in list fan dizze kommando's.

-d fileKontrolearret oft in triem bestiet en is in map.
-e fileKontrolearret oft de triem bestiet.
-f file Kontrolearret oft in bestân bestiet en in bestân is.
-r fileKontrolearret oft de triem bestiet en lêsber is.
-s file ПKontrolearret oft de triem bestiet en net leech is.
-w fileKontrolearret oft it bestân bestiet en skriuwber is.
-x fileKontrolearret oft it bestân bestiet en útfierber is.
file1 -nt file2 Kontrolearret as it nijer is file1as file2.
file1 -ot file2Kontrolearret as âlder file1as file2.
-O file Kontrolearret oft de triem bestiet en is eigendom fan de hjoeddeiske brûker.
-G fileKontrolearret oft der in triem bestiet en oft de groeps-ID oerienkomt mei de groep-ID fan de aktuele brûker.

Dizze kommando's, lykas in protte oaren dy't hjoed besprutsen binne, binne maklik te ûnthâlden. Har nammen, dy't ôfkoartings binne fan ferskate wurden, jouwe direkt de kontrôles oan dy't se útfiere.

Litte wy ien fan 'e kommando's yn 'e praktyk besykje:

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

Dit skript, foar in besteande map, sil de ynhâld werjaan.

Bash skripts: it begjin
List fan de ynhâld fan in map

Wy leauwe dat jo sels eksperimintearje kinne mei de oerbleaune kommando's; se wurde allegear brûkt neffens itselde prinsipe.

Resultaten

Hjoed hawwe wy praat oer hoe't jo kinne begjinne mei it skriuwen fan bash-skripts en hawwe wat basis dingen behannele. Yn feite is it ûnderwerp fan bash-programmearring enoarm. Dit artikel is in oersetting fan it earste diel fan in grutte searje fan 11 materialen. As jo ​​​​no direkt trochgean wolle, is hjir in list mei de orizjinelen fan dizze materialen. Foar it gemak is de oersetting wêrfan jo krekt lêzen hawwe hjir opnommen.

  1. Bash Script stap foar stap - hjir prate wy oer hoe't jo begjinne mei it meitsjen fan bash-skripts, it brûken fan fariabelen wurdt beskôge, betingsten struktueren, berekkeningen, fergeliking fan sifers, stringen, en it finen fan ynformaasje oer bestannen wurde beskreaun.
  2. Bash Scripting Part 2, Bash the awesome - hjir wurde de skaaimerken fan wurkjen mei foar- en wylst-lussen iepenbiere.
  3. Bash Scripting Part 3, Parameters & opsjes - dit materiaal is wijd oan kommandorigelparameters en kaaien dy't kinne wurde trochjûn oan skripts, wurkje mei gegevens dy't de brûker ynfiert en dy't kinne wurde lêzen fan bestannen.
  4. Bash Scripting Part 4, Ynput en útfier - hjir hawwe wy it oer triembeskriuwers en it wurkjen mei har, oer ynfier, útfier, flaterstreamen, en oer útfieromlieding.
  5. Bash Scripting Part 5, Sighals & Jobs - dit materiaal is wijd oan Linux-sinjalen, har ferwurking yn skripts, en it lansearjen fan skripts op in skema.
  6. Bash Scripting Part 6, Funksjes - hjir kinne jo leare oer it meitsjen en brûken fan funksjes yn skripts en it ûntwikkeljen fan bibleteken.
  7. Bash Scripting Part 7, Sed - dit artikel is wijd oan it wurkjen mei de sed streaming tekstbewurker.
  8. Bash Scripting Diel 8, Mei awk - dit materiaal is wijd oan programmearring yn 'e awk gegevensferwurkingstaal.
  9. Bash Scripting diel 9, Reguliere ekspresjes - hjir kinne jo lêze oer it brûken fan reguliere útdrukkingen yn bash-skripts.
  10. Bash Scripting Part 10, Praktyske foarbylden - hjir binne techniken foar it wurkjen mei berjochten dy't kinne wurde stjoerd nei brûkers, lykas ek in metoade foar skyfmonitoring.
  11. Bash Scripting Part 11, Ferwachtsje kommando - dit materiaal is wijd oan it Expect-ark, wêrmei jo ynteraksje mei ynteraktive nutsbedriuwen kinne automatisearje. Yn it bysûnder, wy prate oer ferwachtsje skripts en harren ynteraksje mei bash skripts en oare programma.

Wy leauwe dat ien fan 'e weardefolle skaaimerken fan dizze searje artikels is dat, begjinnend fan' e ienfâldichste, geskikt foar brûkers fan elk nivo, it stadichoan liedt ta heul serieuze ûnderwerpen, wêrtroch elkenien in kâns jout om foarút te gean yn it meitsjen fan Linux kommandorigelskripts .

Beste lêzers! Wy freegje bash-programmearring-guru's om te praten oer hoe't se de hichten fan har behearsking berikten, har geheimen te dielen, en wy sjogge út nei yndrukken te ûntfangen fan dyjingen dy't krekt har earste skript hawwe skreaun.

Bash skripts: it begjin

Allinnich registrearre brûkers kinne meidwaan oan 'e enkête. Ynlogge, asjebleaft.

Moat ik de rest fan 'e searje artikels oersette?

  • Ja!

  • Nee gjin need

1030 brûkers stimden. 106 brûkers ûntholden har.

Boarne: www.habr.com

Add a comment