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.
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.
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.
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-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.
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.
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.
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.
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.
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)):
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Bash Scripting Part 6, Funksjes - hjir kinne jo leare oer it meitsjen en brûken fan funksjes yn skripts en it ûntwikkeljen fan bibleteken.
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.
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.
Allinnich registrearre brûkers kinne meidwaan oan 'e enkête. Ynlogge, asjebleaft.