Hodiaŭ ni parolos pri bash-skriptoj. Ĉi tio - komandliniaj skriptoj, skribita por la bash-ŝelo. Estas aliaj ŝeloj kiel zsh, tcsh, ksh, sed ni koncentriĝos pri bash. Ĉi tiu materialo estas destinita por ĉiuj, la sola kondiĉo estas la kapablo labori komandlinio Linukso
Komandliniaj skriptoj estas kolektoj de la samaj komandoj, kiuj povas esti enireblaj de la klavaro, kolektitaj en dosierojn kaj kunigitaj per iu komuna celo. En ĉi tiu kazo, la rezultoj de la laboro de la teamoj povas aŭ esti de sendependa valoro aŭ servi kiel enirdatenoj por aliaj teamoj. Skriptoj estas potenca maniero aŭtomatigi ofte faritajn agojn.
Do, se ni parolas pri la komandlinio, ĝi permesas al vi ekzekuti plurajn ordonojn samtempe enigante ilin apartigitaj per punktokomo:
pwd ; whoami
Fakte, se vi provis ĉi tion en via terminalo, via unua bash-skripto kun du komandoj jam estas skribita. Ĝi funkcias tiel. Teamo unue pwd montras informojn pri la nuna labordosierujo, poste la komandon whoamimontras informojn pri la uzanto, kiel vi ensalutis.
Uzante ĉi tiun aliron, vi povas kombini tiom da komandoj kiom vi volas sur unu linio, la nura limo estas la maksimuma nombro da argumentoj, kiuj povas esti pasitaj al la programo. Vi povas difini ĉi tiun limon per la sekva komando:
getconf ARG_MAX
La komandlinio estas bonega ilo, sed vi devas enigi komandojn en ĝi ĉiufoje kiam vi bezonas ilin. Kio se ni skribus aron da komandoj en dosieron kaj simple vokus tiun dosieron por ekzekuti ilin? Fakte, la dosiero, pri kiu ni parolas, nomiĝas komandlinia skripto.
Kiel bash-skriptoj funkcias
Kreu malplenan dosieron per la komando touch. Ĝia unua linio devas indiki kiun ŝelon ni uzos. Ni interesiĝas bash, do la unua linio de la dosiero estos:
#!/bin/bash
Aliaj linioj en ĉi tiu dosiero uzas la hash-simbolon por indiki komentojn, kiujn la ŝelo ne prilaboras. Tamen, la unua linio estas speciala kazo, estas hash sekvita de ekkrio (ĉi tiu sekvenco nomiĝas shebang) kaj la vojo al bash, indiku al la sistemo, por kiu la skripto estis kreita specife bash.
Ŝelkomandoj estas apartigitaj per liniofluo, komentoj estas apartigitaj per hash-signo. Jen kiel ĝi aspektas:
#!/bin/bash
# This is a comment
pwd
whoami
Ĉi tie, same kiel ĉe la komandlinio, vi povas skribi ordonojn sur unu linio, apartigitaj per punktokomoj. Tamen, se vi skribas la ordonojn sur malsamaj linioj, la dosiero estas pli facile legebla. Ĉiukaze, la ŝelo prilaboros ilin.
Agordi permesojn pri skriptodosiero
Konservu la dosieron donante al ĝi nomon myscript, kaj la laboro de kreado de la bash-skripto estas preskaŭ finita. Nun restas nur fari ĉi tiun dosieron efektivigebla, alie, se vi provos ruli ĝin, vi renkontos eraron. Permission denied.
Provante ruli skriptodosieron kun malĝuste agorditaj permesoj
Ni faru la dosieron plenumebla:
chmod +x ./myscript
Nun ni provu efektivigi ĝin:
./myscript
Post agordo de la permesoj ĉio funkcias kiel ĝi devus.
Sukcese ruli bash-skripton
Mesaĝa eligo
Por eligi tekston al la Linukso-konzolo, uzu la komandon echo. Ni uzu la scion pri ĉi tiu fakto kaj redaktu nian skripton, aldonante klarigojn al la datumoj eligitaj de la komandoj jam en ĝi:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
Jen kio okazas post rulado de la ĝisdatigita skripto.
Eligi mesaĝojn el skripto
Nun ni povas montri klarigajn notojn uzante la komandon echo. Se vi ne scias kiel redakti dosieron per Linuksaj iloj, aŭ vi ne vidis la komandon antaŭe echo, rigardu ĉi tio la aĵoj.
Uzante Variablojn
Variabloj permesas stoki informojn en skriptodosiero, kiel la rezultoj de komandoj, por uzo de aliaj komandoj.
Estas nenio malbona en ekzekuti individuajn komandojn sen konservi iliajn rezultojn, sed ĉi tiu aliro estas sufiĉe limigita en siaj kapabloj.
Estas du specoj de variabloj kiuj povas esti uzataj en bash-skriptoj:
Mediaj Variabloj
Uzantaj Variabloj
Mediaj Variabloj
Kelkfoje ŝelkomandoj bezonas labori kun iuj sistemaj datumoj. Jen ekzemplo de kiel montri la hejman dosierujon de la nuna uzanto:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
Bonvolu noti, ke ni povas uzi sisteman variablon $HOME inter citiloj, tio ne malhelpos la sistemon rekoni ĝin. Jen kion vi ricevas se vi kuras la supran scenaron.
Uzante mediovariablon en skripto
Kio se vi bezonas montri dolaran signon sur la ekrano? Ni provu ĉi tion:
echo "I have $1 in my pocket"
La sistemo detektos dolaran signon en citita ĉeno kaj supozos, ke ni referencis variablon. La skripto provos montri la valoron de nedifinita variablo $1. Ĉi tio ne estas kion ni bezonas. Kion fari?
En ĉi tiu situacio, uzante la eskapan karakteron, malantaŭa oblikvo, antaŭ la dolara signo helpos:
echo "I have $1 in my pocket"
La skripto nun eligos ĝuste tion, kion oni atendas.
Uzante eskapan sekvencon por presi dolarsignon
Uzantaj Variabloj
Krom mediaj variabloj, bash-skriptoj permesas vin difini kaj uzi viajn proprajn variablojn en la skripto. Tiaj variabloj tenas valoron ĝis la skripto finas ekzekuton.
Kiel ĉe sistemaj variabloj, uzantvariabloj estas alireblaj per la dolaro:
TNW-CUS-FMP - reklama kodo por 10% rabato pri niaj servoj, disponebla por aktivigo ene de 7 tagoj
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"
Jen kio okazas post rulado de tia skripto.
Propraj Variabloj en Skripto
Komando Anstataŭigo
Unu el la plej utilaj trajtoj de bash-skriptoj estas la kapablo ĉerpi informojn el komanda eligo kaj asigni ĝin al variabloj, permesante al vi uzi ĉi tiujn informojn ie ajn en la skriptodosiero.
Estas du manieroj fari ĉi tion.
Uzante la retromarkon "`"
Laŭ dezajno $()
Kiam vi uzas la unuan aliron, zorgu ne inkluzivi ununuran citilon anstataŭ la retromarko. La komando devas esti enfermita en du tiaj ikonoj:
mydir=`pwd`
En la dua aliro, la sama afero estas skribita jene:
mydir=$(pwd)
Kaj la skripto povus fini aspekti jene:
#!/bin/bash
mydir=$(pwd)
echo $mydir
Dum ĝia funkciado, la eligo de la komando pwdestos konservita en variablo mydir, kies enhavo, uzante la komandon echo, iros al la konzolo.
Skripto, kiu konservas la rezultojn de komando en variablo
Matematikaj operacioj
Por fari matematikajn operaciojn en skriptodosiero, vi povas uzi konstruaĵon kiel $((a+b)):
En iuj scenaroj, vi devas kontroli la fluon de komanda ekzekuto. Ekzemple, se certa valoro estas pli granda ol kvin, vi devas fari unu agon, alie, alian. Ĉi tio aplikeblas en multaj situacioj, kaj ĉi tie la kontrolstrukturo helpos nin if-then. En ĝia plej simpla formo ĝi aspektas jene:
if команда
then
команды
fi
Jen laborekzemplo:
#!/bin/bash
if pwd
then
echo "It works"
fi
En ĉi tiu kazo, se la komando estas ekzekutita pwdkompletiĝos sukcese, la teksto "ĝi funkcias" aperos en la konzolo.
Ni uzu la sciojn, kiujn ni havas kaj skribu pli kompleksan skripton. Ni diru, ke ni devas trovi certan uzanton en /etc/passwd, kaj se vi sukcesis trovi ĝin, raportu ke ĝi ekzistas.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
Jen kio okazas post rulado de ĉi tiu skripto.
Serĉo de uzantoj
Ĉi tie ni uzis la komandon greppor serĉi uzanton en dosiero /etc/passwd. Se la teamo grepnekonata al vi, ĝia priskribo troveblas tie.
En ĉi tiu ekzemplo, se la uzanto estas trovita, la skripto montros respondan mesaĝon. Kio se la uzanto ne povus esti trovita? En ĉi tiu kazo, la skripto simple kompletigos ekzekuton sen diri ion ajn al ni. Ni ŝatus, ke li ankaŭ rakontu al ni pri ĉi tio, do ni plibonigos la kodon.
se-tiam-alie kontrolkonstruaĵo
Por ke la programo povu raporti kaj la rezultojn de sukcesa serĉo kaj malsukceso, ni uzos la konstruon if-then-else. Jen kiel ĝi funkcias:
if команда
then
команды
else
команды
fi
Se la unua komando resendas nulon, kio signifas, ke ĝi estis efektivigita sukcese, la kondiĉo estos vera kaj ekzekuto ne daŭrigos laŭ la branĉo. else. Alie, se io alia ol nulo estas resendita, kio indikus malsukceson, aŭ malveran rezulton, la komandoj post else.
Ni skribu la sekvan skripton:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi
Lia ekzekuto iris laŭ la drenilo else.
Ruli skripton kun se-tiam-alia konstruo
Nu, ni pluiru kaj demandu nin pri pli kompleksaj kondiĉoj. Kio se vi bezonas kontroli ne unu kondiĉon, sed plurajn? Ekzemple, se la dezirata uzanto estas trovita, unu mesaĝo devus esti montrita, se iu alia kondiĉo estas plenumita, alia mesaĝo devus esti montrita, ktp. En tia situacio, nestitaj kondiĉoj helpos nin. Ĝi aspektas jene:
if команда1
then
команды
elif команда2
then
команды
fi
Se la unua komando resendas nulon, kio indikas ĝian sukcesan ekzekuton, la komandoj en la unua bloko estos ekzekutitaj then, alie, se la unua kondiĉo estas falsa kaj se la dua komando resendas nulon, la dua bloko de kodo estos ekzekutita.
#!/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
En tia skripto, vi povas, ekzemple, krei novan uzanton uzante la komandon useradd, se la serĉo ne produktis rezultojn, aŭ fari ion alian utilan.
Komparo de nombroj
En skriptoj vi povas kompari nombrajn valorojn. Malsupre estas listo de koncernaj komandoj.
n1 -eq n2Revenas vera se n1 egalas n2. n1 -ge n2 Revenas vera se n1pli aŭ egala n2. n1 -gt n2Revenas vera se n1 pli ol n2. n1 -le n2Revenas vera se n1malpli aŭ egala n2. n1 -lt n2Liveras vera se n1 estas malpli ol n2. n1 -ne n2Revenas vera se n1ne egala n2.
Ekzemple, ni provu unu el la komparaj operatoroj. Notu ke la esprimo estas enfermita en kvadrataj krampoj.
#!/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
Jen kion ĉi tiu komando eligos.
Komparo de nombroj en skriptoj
Varia valoro val1pli granda ol 5, la branĉo finas esti ekzekutita thenkompara operatoro kaj responda mesaĝo estas montrata en la konzolo.
Komparo de kordoj
Skriptoj ankaŭ povas kompari kordvalorojn. Komparaj operatoroj aspektas sufiĉe simplaj, sed komparoperacioj de kordoj havas iujn funkciojn, kiujn ni tuŝos malsupre. Jen listo de operatoroj.
str1 = str2 Testas ĉenojn por egaleco, revenante vera se la ĉenoj estas identaj.
str1 != str2Liveras vera se la ŝnuroj ne estas identaj. str1 < str2Revenas vera se str1malpli ol str2. str1 > str2 Revenas vera se str1pli ol str2. -n str1 Liveras vera se longo str1Super nulo. -z str1Liveras vera se longo str1egala al nulo.
Jen ekzemplo de komparado de ŝnuroj en skripto:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fi
Kiel rezulto de ekzekuto de la skripto, ni ricevas la jenon.
Komparante ŝnurojn en skriptoj
Jen unu trajto de korda komparo, kiu estas menciinda. Nome, la operatoroj ">" kaj "<" devas esti eskapataj per malantaŭa oblikvo, alie la skripto ne funkcios ĝuste, kvankam neniuj erarmesaĝoj aperos. La skripto interpretas la signon ">" kiel produktaĵan redirektan komandon.
Jen kiel aspektas labori kun ĉi tiuj operatoroj en kodo:
#!/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
Jen la rezultoj de la skripto.
Ŝnuro komparo, averto donita
Bonvolu noti, ke la skripto, kvankam efektivigita, eligas averton:
./myscript: line 5: [: too many arguments
Por forigi ĉi tiun averton, ni konkludas $val2 inter citiloj:
#!/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
Nun ĉio funkcias kiel ĝi devus.
Komparo de kordoj
Alia trajto de la ">" kaj "<" operatoroj estas kiel ili funkcias kun majusklaj kaj minuskloj. Por kompreni ĉi tiun funkcion, ni preparu tekstdosieron kun la sekva enhavo:
Likegeeks
likegeeks
Ni konservu ĝin donante al ĝi nomon myfile, tiam rulu la sekvan komandon en la terminalo:
sort myfile
Ĝi ordigos la liniojn de la dosiero tiel:
likegeeks
Likegeeks
teamo sort, defaŭlte, ordigas ŝnurojn en suprena ordo, tio estas, la minuskla litero en nia ekzemplo estas pli malgranda ol la majuskla. Nun ni preparu skripton, kiu komparos la samajn ŝnurojn:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
Se vi rulas ĝin, montriĝas ke ĉio estas inverse - la minuskla litero nun estas pli granda ol la majuskla.
La ordiga komando kaj komparado de ŝnuroj en skriptodosiero
En komparkomandoj, majusklaj literoj estas pli malgrandaj ol minusklaj literoj. Komparo de ŝnuroj ĉi tie estas farita komparante la ASCII-kodojn de la signoj, la ordigo tiel dependas de la signokodoj.
teamo sort, siavice, uzas la ordigon specifitan en la sistemlingvaj agordoj.
Dosierkontroloj
Eble la sekvaj komandoj estas uzataj plej ofte en bash-skriptoj. Ili permesas vin kontroli diversajn kondiĉojn pri dosieroj. Jen listo de ĉi tiuj komandoj.
-d fileKontrolas ĉu dosiero ekzistas kaj estas dosierujo. -e fileKontrolas ĉu la dosiero ekzistas. -f file Kontrolas ĉu dosiero ekzistas kaj estas dosiero. -r fileKontrolas ĉu la dosiero ekzistas kaj estas legebla. -s file ПKontrolas ĉu la dosiero ekzistas kaj ne estas malplena. -w fileKontrolas ĉu la dosiero ekzistas kaj estas skribebla. -x fileKontrolas ĉu la dosiero ekzistas kaj estas plenumebla. file1 -nt file2 Kontrolas ĉu ĝi estas pli nova file1ol file2. file1 -ot file2Kontrolas se pli malnova file1ol file2. -O file Kontrolas ĉu la dosiero ekzistas kaj estas posedata de la nuna uzanto. -G fileKontrolas ĉu la dosiero ekzistas kaj ĉu ĝia grupidentigilo kongruas kun la grupidentigilo de la nuna uzanto.
Ĉi tiuj komandoj, same kiel multaj aliaj diskutitaj hodiaŭ, estas facile memoreblaj. Iliaj nomoj, estante mallongigoj de diversaj vortoj, rekte indikas la kontrolojn kiujn ili faras.
Ni provu unu el la komandoj praktike:
#!/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
Ĉi tiu skripto, por ekzistanta dosierujo, montros ĝian enhavon.
Listo de la enhavo de dosierujo
Ni kredas, ke vi mem povas eksperimenti kun la ceteraj ordonoj; ili ĉiuj estas uzataj laŭ la sama principo.
Rezultoj
Hodiaŭ ni parolis pri kiel komenci verki bash-skriptojn kaj kovris kelkajn bazajn aferojn. Fakte, la temo de bash-programado estas grandega. Ĉi tiu artikolo estas traduko de la unua parto de granda serio de 11 materialoj. Se vi volas daŭrigi nun, jen listo de la originaloj de ĉi tiuj materialoj. Por komforto, kies traduko vi ĵus legis estas inkluzivita ĉi tie.
Bash Skripto Paŝo Post Paŝo — ĉi tie ni parolas pri kiel komenci krei bash-skriptojn, la uzo de variabloj estas konsiderata, kondiĉaj strukturoj, kalkuloj, komparoj de nombroj, ĉenoj, kaj eltrovo de informoj pri dosieroj estas priskribitaj.
Bash Scripting Parto 3, Parametroj kaj opcioj — ĉi tiu materialo estas dediĉita al komandliniaj parametroj kaj ŝlosiloj, kiuj povas esti pasitaj al skriptoj, laborante kun datumoj, kiujn la uzanto enigas kaj kiuj povas esti legitaj el dosieroj.
Bash Scripting Parto 4, Enigo & Eligo - ĉi tie ni parolas pri dosierpriskribiloj kaj prilaboro kun ili, pri enigo, eligo, erarfluoj, kaj pri eligo-redirekto.
Bash Scripting Parto 5, Sighals & Jobs — ĉi tiu materialo estas dediĉita al Linuksaj signaloj, ilia prilaborado en skriptoj, kaj lanĉado de skriptoj laŭ horaro.
Bash Scripting Parto 6, Funkcioj — ĉi tie vi povas lerni pri kreado kaj uzado de funkcioj en skriptoj kaj evoluado de bibliotekoj.
Bash Scripting Parto 11, Atendu Komandon — ĉi tiu materialo estas dediĉita al la ilo Atendi, per kiu vi povas aŭtomatigi interagadon kun interagaj utilecoj. Aparte, ni parolas pri expect-skriptoj kaj ilia interago kun bash-skriptoj kaj aliaj programoj.
Ni kredas, ke unu el la valoraj trajtoj de ĉi tiu serio de artikoloj estas, ke, komencante de la plej simplaj, taŭgaj por uzantoj de ajna nivelo, ĝi iom post iom kondukas al sufiĉe seriozaj temoj, donante al ĉiuj ŝancon progresi en la kreado de Linuksaj komandliniaj skriptoj. .
Karaj legantoj! Ni petas al bash-programadaj guruoj paroli pri kiel ili atingis la altaĵojn de sia majstrado, konigi siajn sekretojn, kaj ni antaŭĝojas ricevi impresojn de tiuj, kiuj ĵus skribis sian unuan skripton.
Nur registritaj uzantoj povas partopreni la enketon. Ensaluti, bonvolu.