Ngayon ay pag-uusapan natin ang tungkol sa mga script ng bash. ito - mga script ng command line, na isinulat para sa bash shell. Mayroong iba pang mga shell tulad ng zsh, tcsh, ksh, ngunit kami ay tumutok sa bash. Ang materyal na ito ay inilaan para sa lahat, ang tanging kondisyon ay ang kakayahang magtrabaho command line Linux.
Ang mga script ng command line ay mga koleksyon ng parehong mga command na maaaring ipasok mula sa keyboard, na nakolekta sa mga file at pinagsama ng ilang karaniwang layunin. Sa kasong ito, ang mga resulta ng trabaho ng mga koponan ay maaaring maging independiyenteng halaga o magsilbi bilang input data para sa iba pang mga koponan. Ang mga script ay isang mahusay na paraan upang i-automate ang mga madalas na ginagawang pagkilos.
Kaya, kung pinag-uusapan natin ang linya ng command, pinapayagan ka nitong magsagawa ng ilang mga utos nang sabay-sabay sa pamamagitan ng paglalagay ng mga ito na pinaghihiwalay ng isang semicolon:
pwd ; whoami
Sa katunayan, kung sinubukan mo ito sa iyong terminal, ang iyong unang bash script na kinasasangkutan ng dalawang command ay naisulat na. Ito ay gumagana tulad nito. Team muna pwd nagpapakita ng impormasyon tungkol sa kasalukuyang gumaganang direktoryo, pagkatapos ay ang command whoaminagpapakita ng impormasyon tungkol sa user kung saan ka naka-log in.
Gamit ang diskarteng ito, maaari mong pagsamahin ang maraming mga utos hangga't gusto mo sa isang linya, ang tanging limitasyon ay ang maximum na bilang ng mga argumento na maaaring maipasa sa programa. Maaari mong tukuyin ang limitasyong ito gamit ang sumusunod na command:
getconf ARG_MAX
Ang command line ay isang mahusay na tool, ngunit kailangan mong magpasok ng mga command dito sa tuwing kailangan mo ang mga ito. Paano kung sumulat kami ng isang hanay ng mga utos sa isang file at tinawag lang ang file na iyon upang maisagawa ang mga ito? Sa katunayan, ang file na pinag-uusapan natin ay tinatawag na command line script.
Paano gumagana ang mga script ng bash
Lumikha ng isang walang laman na file gamit ang command touch. Kailangang ipahiwatig ng unang linya nito kung aling shell ang gagamitin natin. Kami ay interesado sa bash, kaya ang unang linya ng file ay:
#!/bin/bash
Ang ibang mga linya sa file na ito ay gumagamit ng simbolo ng hash upang ipahiwatig ang mga komento na hindi pinoproseso ng shell. Gayunpaman, ang unang linya ay isang espesyal na kaso, mayroong isang hash na sinusundan ng isang tandang padamdam (ang sequence na ito ay tinatawag na shebang) at ang daan patungo sa bash, ipahiwatig sa system na partikular na nilikha ang script bash.
Ang mga shell command ay pinaghihiwalay ng isang line feed, ang mga komento ay pinaghihiwalay ng isang hash sign. Ito ang hitsura nito:
#!/bin/bash
# This is a comment
pwd
whoami
Dito, tulad ng sa command line, maaari kang magsulat ng mga command sa isang linya, na pinaghihiwalay ng mga semicolon. Gayunpaman, kung isusulat mo ang mga utos sa iba't ibang linya, mas madaling basahin ang file. Sa anumang kaso, ipoproseso ng shell ang mga ito.
Pagtatakda ng mga pahintulot ng script file
I-save ang file na binibigyan ito ng pangalan myscript, at ang gawain ng paglikha ng bash script ay halos tapos na. Ngayon ang natitira na lang ay gawing executable ang file na ito, kung hindi, kung susubukan mong patakbuhin ito, makakatagpo ka ng isang error Permission denied.
Sinusubukang magpatakbo ng isang script file na may mga maling na-configure na pahintulot
Gawin nating executable ang file:
chmod +x ./myscript
Ngayon subukan nating isagawa ito:
./myscript
Matapos itakda ang mga pahintulot, gumagana ang lahat ayon sa nararapat.
Matagumpay na nagpapatakbo ng script ng bash
Output ng mensahe
Upang mag-output ng text sa Linux console, gamitin ang command echo. Gamitin natin ang kaalaman sa katotohanang ito at i-edit ang ating script, pagdaragdag ng mga paliwanag sa data na na-output ng mga command na nasa loob na:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
Ito ang mangyayari pagkatapos patakbuhin ang na-update na script.
Pag-output ng mga mensahe mula sa isang script
Ngayon ay maaari na tayong magpakita ng mga paliwanag na tala gamit ang command echo. Kung hindi mo alam kung paano mag-edit ng file gamit ang mga tool sa Linux, o hindi mo pa nakikita ang command dati echo, tingnan mo ito materyal.
Paggamit ng mga Variable
Binibigyang-daan ka ng mga variable na mag-imbak ng impormasyon sa isang script file, tulad ng mga resulta ng mga command, para magamit ng iba pang mga command.
Walang mali sa pagpapatupad ng mga indibidwal na utos nang hindi iniimbak ang kanilang mga resulta, ngunit ang diskarte na ito ay medyo limitado sa mga kakayahan nito.
Mayroong dalawang uri ng mga variable na maaaring magamit sa mga script ng bash:
Mga variable ng kapaligiran
Mga Variable ng User
Mga variable ng kapaligiran
Minsan ang mga shell command ay kailangang gumana sa ilang data ng system. Narito ang isang halimbawa kung paano ipakita ang home directory ng kasalukuyang user:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
Pakitandaan na maaari kaming gumamit ng variable ng system $HOME sa double quotes, hindi nito pipigilan ang system na makilala ito. Ito ang makukuha mo kung patakbuhin mo ang senaryo sa itaas.
Paggamit ng environment variable sa isang script
Paano kung kailangan mong magpakita ng dollar sign sa screen? Subukan natin ito:
echo "I have $1 in my pocket"
Matutukoy ng system ang isang dollar sign sa isang naka-quote na string at ipagpalagay na nag-refer kami ng isang variable. Susubukan ng script na ipakita ang halaga ng isang hindi natukoy na variable $1. Hindi ito ang kailangan natin. Anong gagawin?
Sa sitwasyong ito, ang paggamit ng escape character, isang backslash, bago ang dollar sign ay makakatulong:
echo "I have $1 in my pocket"
Ilalabas na ngayon ng script ang eksaktong inaasahan.
Paggamit ng escape sequence para mag-print ng dollar sign
Mga Variable ng User
Bilang karagdagan sa mga variable ng kapaligiran, pinapayagan ka ng mga script ng bash na tukuyin at gamitin ang iyong sariling mga variable sa script. Ang mga naturang variable ay nagtataglay ng isang halaga hanggang sa makumpleto ng script ang pagpapatupad.
Tulad ng sa mga variable ng system, maaaring ma-access ang mga variable ng user gamit ang dollar sign:
TNW-CUS-FMP - promo code para sa 10% na diskwento sa aming mga serbisyo, magagamit para sa pag-activate sa loob ng 7 araw
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"
Ito ang nangyayari pagkatapos magpatakbo ng naturang script.
Mga Custom na Variable sa isang Script
Pagpapalit ng Utos
Ang isa sa mga pinaka-kapaki-pakinabang na tampok ng mga script ng bash ay ang kakayahang kunin ang impormasyon mula sa output ng command at italaga ito sa mga variable, na nagbibigay-daan sa iyong gamitin ang impormasyong ito saanman sa script file.
Magagawa ito sa dalawang paraan.
Gamit ang backtick na "`"
Sa pamamagitan ng disenyo $()
Kapag ginagamit ang unang diskarte, mag-ingat na huwag magsama ng isang solong panipi sa halip ng backtick. Ang utos ay dapat na nakapaloob sa dalawang ganoong mga icon:
mydir=`pwd`
Sa pangalawang diskarte, ang parehong bagay ay nakasulat tulad nito:
mydir=$(pwd)
At ang script ay maaaring magmukhang ganito:
#!/bin/bash
mydir=$(pwd)
echo $mydir
Sa panahon ng operasyon nito, ang output ng command pwday ise-save sa isang variable mydir, ang mga nilalaman nito, gamit ang command echo, ay pupunta sa console.
Isang script na nagse-save ng mga resulta ng isang command sa isang variable
Mga operasyon sa matematika
Upang magsagawa ng mga pagpapatakbo ng matematika sa isang script file, maaari kang gumamit ng isang construct tulad ng $((a+b)):
Sa ilang mga sitwasyon, kailangan mong kontrolin ang daloy ng pagpapatupad ng command. Halimbawa, kung ang isang partikular na halaga ay mas malaki sa lima, kailangan mong magsagawa ng isang aksyon, kung hindi, isa pa. Naaangkop ito sa maraming sitwasyon, at dito matutulungan tayo ng istruktura ng kontrol if-then. Sa pinakasimpleng anyo nito ay ganito ang hitsura:
if ΠΊΠΎΠΌΠ°Π½Π΄Π°
then
ΠΊΠΎΠΌΠ°Π½Π΄Ρ
fi
Narito ang isang gumaganang halimbawa:
#!/bin/bash
if pwd
then
echo "It works"
fi
Sa kasong ito, kung ang utos ay naisakatuparan pwday matagumpay na makumpleto, ang tekstong "ito ay gumagana" ay ipapakita sa console.
Gamitin natin ang kaalaman na mayroon tayo at magsulat ng mas kumplikadong script. Sabihin nating kailangan nating maghanap ng partikular na user /etc/passwd, at kung nahanap mo ito, iulat na mayroon ito.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
Ito ang mangyayari pagkatapos patakbuhin ang script na ito.
Paghahanap ng gumagamit
Dito ginamit namin ang utos greppara maghanap ng user sa isang file /etc/passwd. Kung ang pangkat grephindi pamilyar sa iyo, ang paglalarawan nito ay matatagpuan dito.
Sa halimbawang ito, kung natagpuan ang user, magpapakita ang script ng kaukulang mensahe. Paano kung hindi mahanap ang gumagamit? Sa kasong ito, kukumpletuhin lang ng script ang pagpapatupad nang hindi nagsasabi sa amin ng anuman. Gusto naming sabihin din niya sa amin ang tungkol dito, kaya pagbutihin namin ang code.
if-then-else control construct
Upang maiulat ng programa ang parehong mga resulta ng isang matagumpay na paghahanap at pagkabigo, gagamitin namin ang pagtatayo if-then-else. Narito kung paano ito gumagana:
if ΠΊΠΎΠΌΠ°Π½Π΄Π°
then
ΠΊΠΎΠΌΠ°Π½Π΄Ρ
else
ΠΊΠΎΠΌΠ°Π½Π΄Ρ
fi
Kung ang unang command ay nagbabalik ng zero, na nangangahulugan na ito ay matagumpay na naisakatuparan, ang kundisyon ay magiging totoo at ang pagpapatupad ay hindi magpapatuloy sa kahabaan ng sangay else. Kung hindi, kung ang isang bagay maliban sa zero ay ibinalik, na magsasaad ng pagkabigo, o isang maling resulta, ang mga utos pagkatapos else.
Isulat natin ang sumusunod na script:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesnβt exist"
fi
Ang kanyang pagbitay ay nahulog sa alisan ng tubig else.
Pagpapatakbo ng isang script na may isang kung-pagkatapos-ibang konstruksyon
Buweno, magpatuloy tayo at tanungin ang ating sarili tungkol sa mas kumplikadong mga kondisyon. Paano kung kailangan mong suriin hindi isang kundisyon, ngunit marami? Halimbawa, kung ang nais na user ay natagpuan, isang mensahe ang dapat ipakita, kung ang ilang iba pang kundisyon ay natugunan, isa pang mensahe ang dapat na ipakita, at iba pa. Sa ganoong sitwasyon, ang mga nested na kondisyon ay makakatulong sa atin. Mukhang ganito:
if ΠΊΠΎΠΌΠ°Π½Π΄Π°1
then
ΠΊΠΎΠΌΠ°Π½Π΄Ρ
elif ΠΊΠΎΠΌΠ°Π½Π΄Π°2
then
ΠΊΠΎΠΌΠ°Π½Π΄Ρ
fi
Kung ang unang command ay nagbabalik ng zero, na nagpapahiwatig ng matagumpay na pagpapatupad nito, ang mga utos sa unang bloke ay isasagawa then, kung hindi, kung mali ang unang kundisyon at kung magbabalik ng zero ang pangalawang utos, isasagawa ang pangalawang bloke ng code.
#!/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
Sa ganoong script, maaari kang, halimbawa, lumikha ng bagong user gamit ang command useradd, kung ang paghahanap ay hindi nagdulot ng mga resulta, o gumawa ng ibang bagay na kapaki-pakinabang.
Paghahambing ng mga numero
Sa mga script maaari mong ihambing ang mga numerong halaga. Nasa ibaba ang isang listahan ng mga nauugnay na utos.
n1 -eq n2Nagbabalik ng totoo kung n1 katumbas ng n2. n1 -ge n2 Nagbabalik ng totoo kung n1higit pa o katumbas n2. n1 -gt n2Nagbabalik ng totoo kung n1 higit sa n2. n1 -le n2Nagbabalik ng totoo kung n1mas mababa o katumbas n2. n1 -lt n2Nagbabalik ng true kung ang n1 ay mas mababa sa n2. n1 -ne n2Nagbabalik ng totoo kung n1hindi pantay n2.
Bilang halimbawa, subukan natin ang isa sa mga operator ng paghahambing. Tandaan na ang expression ay nakapaloob sa mga square bracket.
#!/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
Ito ang ilalabas ng command na ito.
Paghahambing ng mga numero sa mga script
Variable value val1higit sa 5, ang sangay ay natatapos sa pag-execute thenoperator ng paghahambing at isang kaukulang mensahe ay ipinapakita sa console.
Paghahambing ng string
Ang mga script ay maaari ding maghambing ng mga halaga ng string. Ang mga operator ng paghahambing ay mukhang medyo simple, ngunit ang mga operasyon ng paghahambing ng string ay may ilang mga tampok, na tatalakayin natin sa ibaba. Narito ang isang listahan ng mga operator.
str1 = str2 Sinusuri ang mga string para sa pagkakapantay-pantay, nagbabalik ng totoo kung ang mga string ay magkapareho.
str1 != str2Nagbabalik ng true kung ang mga string ay hindi magkapareho. str1 < str2Nagbabalik ng totoo kung str1mas mababa sa str2. str1 > str2 Nagbabalik ng totoo kung str1higit pa sa str2. -n str1 Nagbabalik ng true kung haba str1Higit sa zero. -z str1Nagbabalik ng true kung haba str1katumbas ng zero.
Narito ang isang halimbawa ng paghahambing ng mga string sa isang script:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fi
Bilang resulta ng pagpapatupad ng script, nakukuha namin ang sumusunod.
Paghahambing ng mga string sa mga script
Narito ang isang tampok ng paghahambing ng string na nagkakahalaga ng pagbanggit. Ibig sabihin, ang mga operator na ">" at "<" ay dapat na makatakas gamit ang isang backslash, kung hindi, ang script ay hindi gagana nang tama, kahit na walang mga mensahe ng error na lalabas. Ang script ay binibigyang kahulugan ang ">" sign bilang isang output redirection command.
Narito kung ano ang hitsura ng pagtatrabaho sa mga operator na ito sa code:
#!/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
Narito ang mga resulta ng script.
Paghahambing ng string, ibinigay ang babala
Pakitandaan na ang script, bagama't naisakatuparan, ay nagbibigay ng babala:
./myscript: line 5: [: too many arguments
Upang maalis ang babalang ito, nagtatapos kami $val2 sa dobleng panipi:
#!/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
Ngayon ang lahat ay gumagana ayon sa nararapat.
Paghahambing ng string
Ang isa pang tampok ng mga operator na ">" at "<" ay kung paano gumagana ang mga ito sa mga uppercase at lowercase na character. Upang maunawaan ang tampok na ito, maghanda tayo ng isang text file na may sumusunod na nilalaman:
Likegeeks
likegeeks
Iligtas natin ito sa pamamagitan ng pagbibigay ng pangalan myfile, pagkatapos ay patakbuhin ang sumusunod na command sa terminal:
sort myfile
Pag-uuri-uriin nito ang mga linya mula sa file tulad nito:
likegeeks
Likegeeks
Koponan sort, bilang default, nag-uuri ng mga string sa pataas na pagkakasunud-sunod, iyon ay, ang maliit na titik sa aming halimbawa ay mas maliit kaysa sa malaking titik. Ngayon, maghanda tayo ng script na maghahambing ng parehong mga string:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
Kung patakbuhin mo ito, lumalabas na ang lahat ay baligtad - ang maliit na titik ay mas malaki na ngayon kaysa sa malalaking titik.
Ang sort command at paghahambing ng mga string sa isang script file
Sa paghahambing na mga utos, ang malalaking titik ay mas maliit kaysa sa maliliit na titik. Ang paghahambing ng string dito ay ginagawa sa pamamagitan ng paghahambing ng mga ASCII code ng mga character, ang pagkakasunud-sunod ng mga ito ay depende sa mga code ng character.
Koponan sort, sa turn, ay gumagamit ng pagkakasunud-sunod na tinukoy sa mga setting ng wika ng system.
Mga pagsusuri sa file
Marahil ang mga sumusunod na utos ay madalas na ginagamit sa mga script ng bash. Pinapayagan ka nitong suriin ang iba't ibang mga kundisyon tungkol sa mga file. Narito ang isang listahan ng mga utos na ito.
-d fileSinusuri kung mayroong isang file at ito ay isang direktoryo. -e fileSinusuri kung umiiral ang file. -f file Sinusuri kung may file at isa itong file. -r fileSinusuri kung ang file ay umiiral at nababasa. -s file ΠSinusuri kung ang file ay umiiral at walang laman. -w fileSinusuri kung umiiral ang file at maisusulat. -x fileSinusuri kung ang file ay umiiral at ito ay maipapatupad. file1 -nt file2 Tinitingnan kung ito ay mas bago file1Kaysa file2. file1 -ot file2Sinusuri kung mas matanda file1Kaysa file2. -O file Sinusuri kung ang file ay umiiral at pagmamay-ari ng kasalukuyang user. -G fileTinitingnan kung umiiral ang file at kung tumutugma ang group ID nito sa group ID ng kasalukuyang user.
Ang mga utos na ito, gayundin ang marami pang iba na tinalakay ngayon, ay madaling tandaan. Ang kanilang mga pangalan, bilang mga pagdadaglat ng iba't ibang salita, ay direktang nagpapahiwatig ng mga tseke na kanilang ginagawa.
Subukan natin ang isa sa mga utos sa pagsasanay:
#!/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
Ang script na ito, para sa isang kasalukuyang direktoryo, ay magpapakita ng mga nilalaman nito.
Paglilista ng mga nilalaman ng isang direktoryo
Naniniwala kami na maaari kang mag-eksperimento sa natitirang mga utos sa iyong sarili; lahat sila ay ginagamit ayon sa parehong prinsipyo.
Mga resulta ng
Ngayon ay pinag-usapan namin kung paano magsimulang magsulat ng mga script ng bash at sumaklaw sa ilang mga pangunahing bagay. Sa katunayan, ang paksa ng bash programming ay napakalaki. Ang artikulong ito ay pagsasalin ng unang bahagi ng isang malaking serye ng 11 materyales. Kung gusto mong magpatuloy ngayon, narito ang isang listahan ng mga orihinal ng mga materyales na ito. Para sa kaginhawahan, kasama dito ang pagsasalin na kababasa mo lang.
Hakbang-hakbang na Bash Script β dito pinag-uusapan natin kung paano simulan ang paglikha ng mga script ng bash, ang paggamit ng mga variable ay isinasaalang-alang, ang mga kondisyong istruktura, kalkulasyon, paghahambing ng mga numero, mga string, at paghahanap ng impormasyon tungkol sa mga file ay inilarawan.
Bahagi 3 ng Bash Scripting, Mga Parameter at opsyon β ang materyal na ito ay nakatuon sa mga parameter ng command line at mga susi na maaaring ipasa sa mga script, gumagana sa data na ipinasok ng user at maaaring basahin mula sa mga file.
Bash Scripting Bahagi 4, Input at Output - dito pinag-uusapan natin ang tungkol sa mga file descriptor at nagtatrabaho sa kanila, tungkol sa input, output, error stream, at tungkol sa output redirection.
Bash Scripting Part 5, Sighals at Trabaho β ang materyal na ito ay nakatuon sa mga signal ng Linux, ang kanilang pagproseso sa mga script, at paglulunsad ng mga script sa isang iskedyul.
Bash Scripting Part 6, Functions β dito maaari mong malaman ang tungkol sa paggawa at paggamit ng mga function sa mga script at pagbuo ng mga aklatan.
Bash Scripting Part 10, Mga Praktikal na Halimbawa β narito ang mga diskarte para sa pagtatrabaho sa mga mensahe na maaaring ipadala sa mga user, pati na rin isang paraan para sa pagsubaybay sa disk.
Bash Scripting Part 11, Asahan ang Utos β ang materyal na ito ay nakatuon sa Expect tool, kung saan maaari mong i-automate ang pakikipag-ugnayan sa mga interactive na utility. Sa partikular, pinag-uusapan natin ang tungkol sa mga expect script at ang kanilang pakikipag-ugnayan sa mga script ng bash at iba pang mga programa.
Naniniwala kami na ang isa sa mga mahahalagang tampok ng seryeng ito ng mga artikulo ay, simula sa pinakasimpleng, angkop para sa mga gumagamit ng anumang antas, unti-unti itong humahantong sa mga seryosong paksa, na nagbibigay sa lahat ng pagkakataong umunlad sa paglikha ng mga script ng command line ng Linux. .
Minamahal na mga mambabasa! Hinihiling namin sa mga bash programming guru na pag-usapan kung paano nila naabot ang taas ng kanilang kahusayan, ibahagi ang kanilang mga lihim, at inaasahan naming makatanggap ng mga impression mula sa mga kakasulat pa lang ng kanilang unang script.
Ang mga rehistradong user lamang ang maaaring lumahok sa survey. Mag-sign in, pakiusap
Dapat ko bang isalin ang natitirang serye ng mga artikulo?