Bash-skriptoj: la komenco

Bash-skriptoj: la komenco
Bash Skriptoj Parto 2: Bukloj
Bash-Skriptoj, Parto 3: Komandliniaj Opcioj kaj Ŝaltiloj
Bash-Skriptoj Parto 4: Enigo kaj Eligo
Bash-Skriptoj, Parto 5: Signaloj, Fonaj Taskoj, Skripto-Administrado
Bash-Skriptoj, Parto 6: Funkcioj kaj Biblioteko-Evoluo
Bash-Skriptoj, Parto 7: sed kaj Vorttraktado
Bash-skriptoj, parto 8: awk datumtraktadlingvo
Bash-Skriptoj Parto 9: Regulaj Esprimoj
Bash Skriptoj Parto 10: Praktikaj Ekzemploj
Bash-skriptoj, parto 11: atendi kaj aŭtomatigo de interagaj utilecoj

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

Bash-skriptoj: la komenco

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.

Bash-skriptoj: la komenco

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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
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)):

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

Bash-skriptoj: la komenco
Matematikaj Operacioj en Skripto

se-tiam kontrola konstruo

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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
Ŝ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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
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.

Bash-skriptoj: la komenco
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.

  1. 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.
  2. Bash Scripting Parto 2, Batu la awesome — ĉi tie la funkcioj de labori kun por kaj dum bukloj estas malkaŝitaj.
  3. 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.
  4. Bash Scripting Parto 4, Enigo & Eligo - ĉi tie ni parolas pri dosierpriskribiloj kaj prilaboro kun ili, pri enigo, eligo, erarfluoj, kaj pri eligo-redirekto.
  5. 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.
  6. Bash Scripting Parto 6, Funkcioj — ĉi tie vi povas lerni pri kreado kaj uzado de funkcioj en skriptoj kaj evoluado de bibliotekoj.
  7. Bash Scripting Parto 7, Uzante sed — ĉi tiu artikolo estas dediĉita al laboro kun la sed-flua tekstredaktilo.
  8. Bash Scripting Parto 8, Uzante awk — ĉi tiu materialo estas dediĉita al programado en la awk datumtrakta lingvo.
  9. Bash Scripting Parto 9, Regulaj Esprimoj — ĉi tie vi povas legi pri uzado de regulaj esprimoj en bash-skriptoj.
  10. Bash Scripting Parto 10, Praktikaj Ekzemploj — jen teknikoj por labori kun mesaĝoj, kiuj povas esti senditaj al uzantoj, kaj ankaŭ metodo por disko-monitorado.
  11. 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.

Bash-skriptoj: la komenco

Nur registritaj uzantoj povas partopreni la enketon. Ensaluti, bonvolu.

Ĉu mi traduku la reston de la serio de artikoloj?

  • Jes!

  • Ne ne necesas

1030 uzantoj voĉdonis. 106 uzantoj sindetenis.

fonto: www.habr.com

Aldoni komenton