Illum ser nitkellmu dwar bash scripts. Dan - skripts tal-linja tal-kmand, miktub għall-qoxra bash. Hemm qxur oħra bħal zsh, tcsh, ksh, iżda aħna se niffukaw fuq bash. Dan il-materjal huwa maħsub għal kulħadd, l-unika kundizzjoni hija l-abbiltà li taħdem fih linja tal-kmand Linux.
L-iskripts tal-linja tal-kmand huma kollezzjonijiet tal-istess kmandi li jistgħu jiddaħħlu mit-tastiera, miġbura f'fajls u magħqudin b'xi skop komuni. F'dan il-każ, ir-riżultati tax-xogħol tat-timijiet jistgħu jew ikunu ta' valur indipendenti jew iservu bħala dejta ta' input għal timijiet oħra. L-iskripts huma mod b'saħħtu biex jiġu awtomatizzati azzjonijiet li jsiru ta' spiss.
Allura, jekk nitkellmu dwar il-linja tal-kmand, tippermettilek tesegwixxi diversi kmandi f'daqqa billi ddaħħalhom separati b'punt virgola:
pwd ; whoami
Fil-fatt, jekk ippruvajt dan fit-terminal tiegħek, l-ewwel script bash tiegħek li jinvolvi żewġ kmandi diġà nkiteb. Jaħdem bħal dan. Tim l-ewwel pwd juri informazzjoni dwar id-direttorju tax-xogħol kurrenti, imbagħad il-kmand whoamijuri informazzjoni dwar l-utent li int illoggjat bħala.
Billi tuża dan l-approċċ, tista 'tgħaqqad kemm trid kmandi fuq linja waħda, l-uniku limitu huwa n-numru massimu ta' argumenti li jistgħu jiġu mgħoddija lill-programm. Tista' tiddefinixxi dan il-limitu billi tuża l-kmand li ġej:
getconf ARG_MAX
Il-linja tal-kmand hija għodda kbira, imma trid tidħol fiha kmandi kull darba li jkollok bżonnhom. X'jiġri jekk ktibna sett ta 'kmandi f'fajl u sempliċement imsejjaħ dak il-fajl biex tesegwixxihom? Fil-fatt, il-fajl li qed nitkellmu jissejjaħ script tal-linja tal-kmand.
Kif jaħdmu l-iskripts bash
Oħloq fajl vojt billi tuża l-kmand touch. L-ewwel linja tagħha trid tindika liema qoxra se nużaw. Aħna interessati bash, għalhekk l-ewwel linja tal-fajl tkun:
#!/bin/bash
Linji oħra f'dan il-fajl jużaw is-simbolu tal-hash biex jindikaw kummenti li l-qoxra ma tipproċessax. Madankollu, l-ewwel linja hija każ speċjali, hemm hash segwit minn marka ta 'exclamation (din is-sekwenza tissejjaħ shebang) u t-triq lejn bash, indika lis-sistema li l-iskript inħoloq speċifikament għaliha bash.
Il-kmandi tal-qoxra huma separati b'line feed, il-kummenti huma separati b'sinjal hash. Dan huwa kif jidher:
#!/bin/bash
# This is a comment
pwd
whoami
Hawnhekk, bħal fuq il-linja tal-kmand, tista 'tikteb kmandi fuq linja waħda, separati minn punt u virgola. Madankollu, jekk tikteb il-kmandi fuq linji differenti, il-fajl ikun aktar faċli biex jinqara. Fi kwalunkwe każ, il-qoxra se tipproċessahom.
L-issettjar tal-permessi tal-fajl tal-iskript
Issejvja l-fajl agħtih isem myscript, u x-xogħol tal-ħolqien tal-iskript bash huwa kważi lest. Issa kulma jibqa 'hu li tagħmel dan il-fajl eżekutibbli, inkella, jekk tipprova tmexxih, tiltaqa' ma 'żball Permission denied.
Wara li tissettja l-permessi kollox jaħdem kif suppost.
Tmexxi b'suċċess l-iskript bash
Output tal-messaġġ
Biex toħroġ it-test għall-console Linux, uża l-kmand echo. Ejja nużaw l-għarfien ta 'dan il-fatt u teditja l-iskrittura tagħna, billi żżid spjegazzjonijiet għad-dejta li toħroġ mill-kmandi diġà fiha:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
Dan huwa dak li jiġri wara li titħaddem l-iskritt aġġornat.
Outputing messaġġi minn skript
Issa nistgħu nuru noti spjegattivi bl-użu tal-kmand echo. Jekk ma tafx kif teditja fajl billi tuża għodod Linux, jew ma rajtx il-kmand qabel echo, agħti ħarsa lejn dan il-materjal.
Użu ta' Varjabbli
Varjabbli jippermettulek taħżen informazzjoni f'fajl b'kitba, bħar-riżultati tal-kmandi, għall-użu minn kmandi oħra.
M'hemm xejn ħażin li tesegwixxi kmandi individwali mingħajr ma taħżen ir-riżultati tagħhom, iżda l-kapaċitajiet ta 'dan l-approċċ huma limitati ħafna.
Hemm żewġ tipi ta 'varjabbli li jistgħu jintużaw fl-iskripts bash:
Varjabbli Ambjentali
Varjabbli tal-Utent
Varjabbli Ambjentali
Kultant il-kmandi tal-qoxra jeħtieġ li jaħdmu ma 'xi data tas-sistema. Hawn eżempju ta' kif turi d-direttorju tad-dar tal-utent attwali:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
Jekk jogħġbok innota li nistgħu nużaw varjabbli tas-sistema $HOME fi kwotazzjonijiet doppji, dan mhux se jipprevjeni lis-sistema milli tagħrafha. Dan huwa dak li tikseb jekk tmexxi x-xenarju ta 'hawn fuq.
L-użu ta' varjabbli ambjentali fi skript
X'jiġri jekk ikollok bżonn turi sinjal tad-dollaru fuq l-iskrin? Ejja nippruvaw dan:
echo "I have $1 in my pocket"
Is-sistema se tiskopri sinjal tad-dollaru f'sekwenza kkwotata u tassumi li għandna referenza għal varjabbli. L-iskrittura se tipprova turi l-valur ta 'varjabbli mhux definit $1. Dan mhux dak li għandna bżonn. X'tagħmel?
F'din is-sitwazzjoni, bl-użu tal-karattru tal-ħarba, backslash, qabel is-sinjal tad-dollaru se jgħin:
echo "I have $1 in my pocket"
L-iskrittura issa se toħroġ eżattament dak li hu mistenni.
L-użu ta' sekwenza ta' ħarba biex tipprintja sinjal tad-dollaru
Varjabbli tal-Utent
Minbarra l-varjabbli ambjentali, l-iskripts bash jippermettulek tiddefinixxi u tuża l-varjabbli tiegħek stess fl-iskrittura. Tali varjabbli jżommu valur sakemm l-iskript itemm l-eżekuzzjoni.
Bħal fil-każ tal-varjabbli tas-sistema, il-varjabbli tal-utent jistgħu jiġu aċċessati permezz tas-sinjal tad-dollaru:
TNW-CUS-FMP - kodiċi promozzjonali għal skont ta '10% fuq is-servizzi tagħna, disponibbli għall-attivazzjoni fi żmien 7 ijiem
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"
Dan huwa dak li jiġri wara li titħaddem skript bħal dan.
Varjabbli Custom fi Script
Sostituzzjoni tal-Kmand
Waħda mill-aktar karatteristiċi utli tal-iskripts bash hija l-abbiltà li tiġbed informazzjoni mill-output tal-kmand u tassenjaha għal varjabbli, li tippermettilek tuża din l-informazzjoni kullimkien fil-fajl tal-iskrittura.
Hemm żewġ modi kif tagħmel dan.
Tuża l-backtick "`"
Permezz tad-disinn $()
Meta tuża l-ewwel approċċ, oqgħod attent li ma tinkludix virgoletta waħda minflok il-backtick. Il-kmand għandu jkun magħluq f'żewġ ikoni bħal dawn:
mydir=`pwd`
Fit-tieni approċċ, l-istess ħaġa hija miktuba hekk:
mydir=$(pwd)
U l-iskript jista' jispiċċa jidher bħal dan:
#!/bin/bash
mydir=$(pwd)
echo $mydir
Matul it-tħaddim tiegħu, l-output tal-kmand pwdse jiġu ffrankati f'varjabbli mydir, li l-kontenut tiegħu, bl-użu tal-kmand echo, se jmorru għall-console.
Skript li jsalva r-riżultati ta' kmand f'varjabbli
Operazzjonijiet matematiċi
Biex twettaq operazzjonijiet matematiċi f'fajl b'kitba, tista 'tuża kostruzzjoni simili $((a+b)):
F'xi xenarji, għandek bżonn tikkontrolla l-fluss tal-eżekuzzjoni tal-kmand. Per eżempju, jekk ċertu valur huwa akbar minn ħamsa, għandek bżonn twettaq azzjoni waħda, inkella, oħra. Dan huwa applikabbli f'ħafna sitwazzjonijiet, u hawn l-istruttura ta 'kontroll tgħinna if-then. Fl-aktar forma sempliċi tagħha tidher bħal din:
if команда
then
команды
fi
Hawn eżempju ta 'ħidma:
#!/bin/bash
if pwd
then
echo "It works"
fi
F'dan il-każ, jekk il-kmand jiġi esegwit pwdse jitlesta b'suċċess, it-test "taħdem" se jintwera fil-console.
Ejja nużaw l-għarfien li għandna u niktbu kitba aktar kumplessa. Ejja ngħidu li għandna bżonn insibu ċertu utent fi /etc/passwd, u jekk irnexxielek issibha, irrapporta li teżisti.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
Dan huwa dak li jiġri wara li titħaddem dan l-iskritt.
Tiftix għall-utent
Hawnhekk użajna l-kmand grepbiex tfittex utent f'fajl /etc/passwd. Jekk it-tim grepmhux familjari għalik, id-deskrizzjoni tagħha tista 'tinstab hawn.
F'dan l-eżempju, jekk jinstab l-utent, l-iskrittura se juri messaġġ korrispondenti. X'jiġri jekk l-utent ma jistax jinstab? F'dan il-każ, l-iskrittura sempliċement tlesti l-eżekuzzjoni mingħajr ma tgħidilna xejn. Nixtiequ li jgħidilna dwar dan ukoll, għalhekk intejbu l-kodiċi.
kostruzzjoni tal-kontroll jekk imbagħad inkella
Sabiex il-programm ikun jista 'jirrapporta kemm ir-riżultati ta' tfittxija b'suċċess kif ukoll falliment, se nużaw il-kostruzzjoni if-then-else. Hawn kif taħdem:
if команда
then
команды
else
команды
fi
Jekk l-ewwel kmand jirritorna żero, li jfisser li ġie esegwit b'suċċess, il-kundizzjoni tkun vera u l-eżekuzzjoni ma tipproċedix tul il-fergħa else. Inkella, jekk xi ħaġa oħra għajr żero tiġi rritornata, li jindika falliment, jew riżultat falz, il-kmandi wara else.
Ejja ikteb l-iskrittura li ġejja:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi
L-eżekuzzjoni tiegħu niżlet fil-fossa else.
Tmexxi b'kitba b'kostrutt jekk imbagħad inkella
Ukoll, ejja nkomplu u nistaqsu lilna nfusna dwar kundizzjonijiet aktar kumplessi. X'jiġri jekk ikollok bżonn tiċċekkja mhux kundizzjoni waħda, iżda bosta? Pereżempju, jekk jinstab l-utent mixtieq, għandu jintwera messaġġ wieħed, jekk tintlaħaq xi kundizzjoni oħra, għandu jintwera messaġġ ieħor, eċċ. F'sitwazzjoni bħal din, il-kundizzjonijiet nested se jgħinuna. Jidher bħal dan:
if команда1
then
команды
elif команда2
then
команды
fi
Jekk l-ewwel kmand jirritorna żero, li jindika l-eżekuzzjoni b'suċċess tiegħu, il-kmandi fl-ewwel blokk jiġu esegwiti then, inkella, jekk l-ewwel kundizzjoni hija falza u jekk it-tieni kmand jirritorna żero, it-tieni blokka ta 'kodiċi tiġi eżegwita.
#!/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
F'kitba bħal din, tista', pereżempju, toħloq utent ġdid billi tuża l-kmand useradd, jekk it-tfittxija ma pproduċietx riżultati, jew tagħmel xi ħaġa oħra utli.
Tqabbil tan-numri
Fl-iskripts tista 'tqabbel valuri numeriċi. Hawn taħt hawn lista ta 'kmandi rilevanti.
n1 -eq n2Jirritorna veru jekk n1 ugwali n2. n1 -ge n2 Jirritorna veru jekk n1aktar jew ugwali n2. n1 -gt n2Jirritorna veru jekk n1 aħjar n2. n1 -le n2Jirritorna veru jekk n1inqas jew ugwali n2. n1 -lt n2Jirritorna vera jekk n1 huwa inqas minn n2. n1 -ne n2Jirritorna veru jekk n1mhux ugwali n2.
Bħala eżempju, ejja nippruvaw wieħed mill-operaturi tal-paragun. Innota li l-espressjoni hija magħluqa fil-parentesi kwadri.
#!/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
Dan huwa dak li se joħroġ dan il-kmand.
Tqabbil ta 'numri fl-iskripts
Valur varjabbli val1akbar minn 5, il-fergħa tispiċċa tiġi eżegwita thenoperatur ta 'tqabbil u messaġġ korrispondenti huwa murija fil-console.
Paragun tal-istring
L-iskripts jistgħu wkoll iqabblu l-valuri tas-sekwenza. L-operaturi tat-tqabbil jidhru pjuttost sempliċi, iżda l-operazzjonijiet ta 'tqabbil ta' string għandhom ċerti karatteristiċi, li se tmisshom hawn taħt. Hawnhekk hawn lista ta' operaturi.
str1 = str2 Jittestja l-kordi għall-ugwaljanza, u jirritorna vera jekk il-kordi huma identiċi.
str1 != str2Jirritorna vera jekk il-kordi mhumiex identiċi. str1 < str2Jirritorna veru jekk str1inqas minn str2. str1 > str2 Jirritorna veru jekk str1aktar minn str2. -n str1 Jirritorna vera jekk it-tul str1Fuq iż-żero. -z str1Jirritorna vera jekk it-tul str1ugwali għal żero.
Hawn eżempju ta 'tqabbil ta' kordi fi skript:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fi
Bħala riżultat tal-eżekuzzjoni tal-iskrittura, aħna tikseb dan li ġej.
Tqabbil ta 'kordi fl-iskripts
Hawn karatteristika waħda ta 'paragun ta' string li ta 'min isemmi. Jiġifieri, l-operaturi ">" u "<" għandhom jinħarbu b'backslash, inkella l-iskript ma jaħdimx b'mod korrett, għalkemm ma jidhru l-ebda messaġġi ta 'żball. L-iskrittura tinterpreta s-sinjal ">" bħala kmand ta' direzzjoni mill-ġdid tal-output.
Hawn kif jidher ix-xogħol ma 'dawn l-operaturi fil-kodiċi:
#!/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
Hawn huma r-riżultati tal-iskript.
Paragun ta' string, twissija mogħtija
Jekk jogħġbok innota li l-iskript, għalkemm eżegwit, joħroġ twissija:
./myscript: line 5: [: too many arguments
Biex teħles minn din it-twissija, nikkonkludu $val2 fi kwotazzjonijiet doppji:
#!/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
Issa kollox jaħdem kif suppost.
Paragun tal-istring
Karatteristika oħra tal-operaturi ">" u "<" hija kif jaħdmu b'karattri kbar u żgħar. Sabiex nifhmu din il-karatteristika, ejja nippreparaw fajl test bil-kontenut li ġej:
Likegeeks
likegeeks
Ejja nsalvawh billi nagħtuha isem myfile, imbagħad mexxi l-kmand li ġej fit-terminal:
sort myfile
Se issolvi l-linji mill-fajl bħal dan:
likegeeks
Likegeeks
Team sort, b'mod awtomatiku, issortja strings f'ordni axxendenti, jiġifieri, l-ittra żgħira fl-eżempju tagħna hija iżgħar minn dik kbira. Issa ejja nħejju skript li se jqabbel l-istess kordi:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
Jekk tmexxiha, jirriżulta li kollox huwa l-maqlub - l-ittra żgħira issa hija akbar minn dik kbira.
Il-kmand tas-sort u t-tqabbil ta' kordi f'fajl b'kitba
Fil-kmandi ta 'tqabbil, ittri kbar huma iżgħar minn ittri żgħar. Il-paragun tal-istring hawn isir billi jitqabblu l-kodiċi ASCII tal-karattri, l-ordni ta 'sortjar għalhekk tiddependi fuq il-kodiċijiet tal-karattri.
Team sort, min-naħa tiegħu, juża l-ordni speċifikata fis-settings tal-lingwa tas-sistema.
Kontrolli tal-fajls
Forsi l-kmandi li ġejjin jintużaw l-aktar spiss fl-iskripts bash. Huma jippermettu li inti tiċċekkja kundizzjonijiet varji dwar il-fajls. Hawnhekk hawn lista ta 'dawn il-kmandi.
-d fileJiċċekkja jekk fajl jeżistix u huwiex direttorju. -e fileJiċċekkja jekk il-fajl jeżistix. -f file Jiċċekkja jekk fajl jeżistix u huwiex fajl. -r fileJiċċekkja jekk il-fajl jeżistix u jinqarax. -s file ПJiċċekkja jekk il-fajl jeżistix u mhux vojt. -w fileJiċċekkja jekk il-fajl jeżistix u jistax jinkiteb. -x fileJiċċekkja jekk il-fajl jeżistix u huwiex eżekutibbli. file1 -nt file2 Iċċekkja jekk huwiex aktar ġdid file1minn file2. file1 -ot file2Iċċekkja jekk anzjani file1minn file2. -O file Jiċċekkja jekk il-fajl jeżistix u huwiex proprjetà tal-utent attwali. -G fileJiċċekkja jekk il-fajl jeżistix u jekk l-ID tal-grupp tiegħu jaqbilx mal-ID tal-grupp tal-utent attwali.
Dawn il-kmandi, kif ukoll ħafna oħrajn diskussi llum, huma faċli biex tiftakar. L-ismijiet tagħhom, li huma abbrevjazzjonijiet ta 'kelmiet varji, jindikaw direttament il-kontrolli li jagħmlu.
Ejja nippruvaw wieħed mill-kmandi fil-prattika:
#!/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
Dan l-iskript, għal direttorju eżistenti, se juri l-kontenut tiegħu.
Elenkar tal-kontenut ta' direttorju
Aħna nemmnu li tista 'tesperimenta bil-kmandi li fadal lilek innifsek; huma kollha użati skond l-istess prinċipju.
Riżultati ta '
Illum tkellimna dwar kif tibda tikteb skripts bash u kopra xi affarijiet bażiċi. Fil-fatt, is-suġġett tal-ipprogrammar bash huwa enormi. Dan l-artikolu huwa traduzzjoni tal-ewwel parti ta 'serje kbira ta' 11-il materjal. Jekk trid tkompli bħalissa, hawn lista ta 'l-oriġinali ta' dawn il-materjali. Għall-konvenjenza, it-traduzzjoni tagħha li għadek qrajt hija inkluża hawn.
Bash Script Pass Pass — hawnhekk qed nitkellmu dwar kif tibda toħloq skripts bash, l-użu ta 'varjabbli huwa kkunsidrat, strutturi kondizzjonali, kalkoli, paraguni ta' numri, kordi, u s-sejba ta 'informazzjoni dwar fajls huma deskritti.
Bash Scripting Parti 3, Parametri u għażliet — dan il-materjal huwa ddedikat għal parametri tal-linja tal-kmand u ċwievet li jistgħu jiġu mgħoddija lill-iskripts, li jaħdmu b'dejta li l-utent idaħħal u li jistgħu jinqraw mill-fajls.
Bash Scripting Parti 4, Input & Output - hawnhekk qed nitkellmu dwar deskritturi tal-fajls u naħdmu magħhom, dwar input, output, flussi ta 'żbalji, u dwar direzzjoni mill-ġdid tal-output.
Bash Scripting Parti 11, Jistennew Kmand — dan il-materjal huwa ddedikat għall-għodda Jistennew, li biha tista' awtomat l-interazzjoni ma' utilitajiet interattivi. B'mod partikolari, qed nitkellmu dwar expect scripts u l-interazzjoni tagħhom ma 'bash scripts u programmi oħra.
Aħna nemmnu li waħda mill-karatteristiċi siewja ta 'din is-serje ta' artikoli hija li, li tibda mill-aktar sempliċi, adattata għal utenti ta 'kull livell, twassal gradwalment għal suġġetti pjuttost serji, li tagħti lil kulħadd iċ-ċans li javvanza fil-ħolqien ta' skripts tal-linja tal-kmand Linux. .
Għeżież qarrejja! Nitolbu lill-gurus tal-ipprogrammar tal-bash biex jitkellmu dwar kif laħqu l-ogħla livell tal-ħakma, jaqsmu s-sigrieti tagħhom, u nistennew bil-ħerqa li nirċievu impressjonijiet minn dawk li għadhom kemm kitbu l-ewwel kitba tagħhom.
Utenti reġistrati biss jistgħu jipparteċipaw fl-istħarriġ. Idħol, ta 'xejn.