Vandag sal ons praat oor bash-skrifte. Hierdie - opdragreëlskrifte, geskryf vir die bash-dop. Daar is ander skulpe, soos zsh, tcsh, ksh, maar ons sal op bash fokus. Hierdie materiaal is bedoel vir almal, die enigste voorwaarde is die vermoë om in te werk bevelreël Linux.
Opdragreëlskrifte is stelle van dieselfde opdragte wat vanaf die sleutelbord ingevoer kan word, in lêers versamel en deur een of ander gemeenskaplike doel verenig kan word. Terselfdertyd kan die resultate van die spanne se werk óf van onafhanklike waarde wees óf as insette vir ander spanne dien. Skripte is 'n kragtige manier om handelinge wat gereeld uitgevoer word te outomatiseer.
Dus, as ons oor die opdragreël praat, laat dit jou toe om verskeie opdragte gelyktydig uit te voer deur hulle met 'n kommapunt in te voer:
pwd ; whoami
Trouens, as jy dit in jou terminaal probeer het, is jou eerste bash script wat twee opdragte gebruik reeds geskryf. Dit werk so. Span eerste pwd vertoon inligting oor die huidige werkgids, dan die opdrag whoamiwys inligting oor die gebruiker as jy aangemeld is.
Deur hierdie benadering te gebruik, kan jy soveel opdragte kombineer as wat jy wil op een reël, die limiet is slegs die maksimum aantal argumente wat na die program deurgegee kan word. U kan hierdie limiet definieer met die volgende opdrag:
getconf ARG_MAX
Die opdragreël is 'n wonderlike hulpmiddel, maar jy moet opdragte daarin invoer elke keer as jy dit nodig het. Wat as ons 'n stel opdragte na 'n lêer skryf en bloot daardie lêer oproep om dit uit te voer? Trouens, die lêer waaroor ons praat, word die opdragreëlskrif genoem.
Hoe bash scripts werk
Skep 'n leë lêer met die opdrag touch. In die eerste reël moet u spesifiseer watter dop ons gaan gebruik. Ons stel belang in bash, so die eerste reël van die lêer sal wees:
#!/bin/bash
Elders in hierdie lêer word die hash-simbool gebruik om opmerkings aan te dui wat die dop nie verwerk nie. Die eerste reël is egter 'n spesiale geval, dit is 'n pondteken gevolg deur 'n uitroepteken (hierdie ry word genoem shebang) en die pad na bash, dui aan die stelsel waarvoor die skrif spesifiek geskep is bash.
Shell-opdragte word geskei deur 'n lynvoer, opmerkings word geskei deur 'n skutteken. Hier is hoe dit lyk:
#!/bin/bash
# This is a comment
pwd
whoami
Hier, net soos op die opdragreël, kan jy opdragte op een reël skryf en dit met 'n kommapunt skei. As jy egter opdragte op verskillende reëls skryf, is die lêer makliker om te lees. In elk geval sal die dop hulle verwerk.
Stel toestemmings op 'n skriplêer
Stoor die lêer deur dit 'n naam te gee myscript, en die bash script is amper klaar. Nou bly dit net om hierdie lêer uitvoerbaar te maak, anders sal jy 'n fout teëkom wanneer jy dit probeer uitvoer Permission denied.
Poging om 'n skriplêer met verkeerd gekonfigureerde toestemmings te laat loop
Kom ons maak die lêer uitvoerbaar:
chmod +x ./myscript
Kom ons probeer dit nou uitvoer:
./myscript
Nadat u die toestemmings gestel het, werk alles soos dit moet.
Begin bash script suksesvol
Boodskapuitvoer
Om teks na die Linux-konsole te druk, gebruik die opdrag echo. Kom ons gebruik die kennis van hierdie feit en wysig ons skrif, en voeg verduidelikings by die data wat die opdragte reeds daarin uitvoer:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
Hier is wat gebeur nadat die opgedateerde skrip uitgevoer is.
Uitvoer van boodskappe vanaf 'n skrif
Nou kan ons verduidelikende byskrifte vertoon deur die opdrag te gebruik echo. As jy nie weet hoe om 'n lêer met Linux-nutsmiddels te redigeer nie, of as jy nog nie die opdrag gesien het nie echo, gaan kyk na hierdie die dinge.
Gebruik veranderlikes
Veranderlikes laat jou toe om inligting in 'n skriplêer te stoor, soos die resultate van opdragte, vir gebruik deur ander opdragte.
Daar is niks verkeerd om individuele opdragte uit te voer sonder om die resultate van hul werk te stoor nie, maar die moontlikhede van hierdie benadering is baie beperk.
Daar is twee tipes veranderlikes wat in bash-skrifte gebruik kan word:
omgewings veranderlikes
Gebruiker veranderlikes
omgewings veranderlikes
Soms moet dopopdragte met sommige stelseldata werk. Byvoorbeeld, hier is hoe om die huidige gebruiker se tuisgids te vertoon:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
Neem asseblief kennis dat ons die stelselveranderlike kan gebruik $HOME in dubbele aanhalingstekens, sal dit nie verhoed dat die stelsel dit herken nie. Hier is wat gebeur as jy die bogenoemde skrif uitvoer.
Die gebruik van 'n omgewingsveranderlike in 'n skrif
Maar wat as jy 'n dollarteken wil vertoon? Kom ons probeer dit:
echo "I have $1 in my pocket"
Die stelsel sal 'n dollarteken opspoor in 'n string wat deur aanhalingstekens afgebaken word en aanvaar dat ons 'n veranderlike verwys het. Die skrip sal probeer om die waarde van 'n ongedefinieerde veranderlike te vertoon. $1. Dit is nie wat ons nodig het nie. Wat om te doen?
In 'n situasie soos hierdie help die gebruik van die agterste skuinsbeheerkarakter voor die dollarteken:
echo "I have $1 in my pocket"
Die skrif sal nou presies uitvoer wat verwag word.
Gebruik 'n ontsnappingsreeks om 'n dollarteken uit te voer
Gebruiker veranderlikes
Benewens omgewingsveranderlikes, laat bash-skrifte jou toe om jou eie veranderlikes in die skrif te stel en te gebruik. Sulke veranderlikes hou 'n waarde totdat die skrif eindig.
Soos met stelselveranderlikes, kan gebruikerveranderlikes verkry word deur die dollarteken te gebruik:
TNW-CUS-FMP - promosiekode vir 'n 10% afslag op ons dienste, beskikbaar vir aktivering binne 7 dae
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"
Hier is wat gebeur nadat jy so 'n skrip uitgevoer het.
Pasgemaakte veranderlikes in Skrip
Bevelvervanging
Een van die nuttigste kenmerke van bash-skrifte is die vermoë om inligting uit die uitvoer van opdragte te onttrek en dit aan veranderlikes toe te wys, wat jou toelaat om hierdie inligting oral in die skriflêer te gebruik.
Dit kan op twee maniere gedoen word.
Met die terugmerkkarakter "`"
Met die hulp van konstruksie $()
Wanneer jy die eerste benadering gebruik, wees versigtig om nie 'n enkele aanhaling in plaas van 'n terugmerk te gebruik nie. Die opdrag moet in twee sulke ikone ingesluit word:
mydir=`pwd`
In die tweede benadering word dieselfde so geskryf:
mydir=$(pwd)
En die draaiboek kan op die ou end so lyk:
#!/bin/bash
mydir=$(pwd)
echo $mydir
Tydens sy werking, die uitvoer van die opdrag pwdsal in 'n veranderlike gestoor word mydir, waarvan die inhoud, met behulp van die opdrag echo, sal na die konsole gaan.
Skrip wat die resultate van die opdrag in 'n veranderlike stoor
Wiskundige bewerkings
Om wiskundige bewerkings in 'n skriflêer uit te voer, kan jy 'n konstruksie van die vorm gebruik $((a+b)):
In sommige scenario's is dit nodig om die vloei van opdraguitvoering te beheer. Byvoorbeeld, as 'n sekere waarde groter as vyf is, moet een aksie uitgevoer word, anders 'n ander. Dit is van toepassing in baie situasies, en hier sal die beheerstruktuur ons help if-then. In sy eenvoudigste vorm lyk dit soos volg:
if команда
then
команды
fi
En hier is 'n werkende voorbeeld:
#!/bin/bash
if pwd
then
echo "It works"
fi
In hierdie geval, as die uitvoering van die opdrag pwdsuksesvol voltooi is, sal die teks "dit werk" in die konsole vertoon word.
Kom ons gebruik die kennis wat ons het en skryf 'n meer komplekse scenario. Kom ons sê ons moet 'n gebruiker in vind /etc/passwd, en as dit gevind is, rapporteer dat dit bestaan.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
Dit is wat gebeur nadat hierdie skrip uitgevoer is.
Gebruikerssoektog
Hier het ons die opdrag gebruik grepom na 'n gebruiker in 'n lêer te soek /etc/passwd. As die span greponbekend aan jou, kan die beskrywing daarvan gevind word hier.
In hierdie voorbeeld, as die gebruiker gevind word, sal die skrif 'n toepaslike boodskap vertoon. Wat as die gebruiker nie gevind kon word nie? In hierdie geval sal die skrif eenvoudig die uitvoering voltooi sonder om ons iets te vertel. Ek wil graag hê hy moet ons ook hiervan vertel, so kom ons verbeter die kode.
Die as-dan-else-beheerkonstruksie
Om die program beide die resultate van 'n suksesvolle soektog en 'n mislukking te kan rapporteer, gebruik ons die konstruksie if-then-else. Hier is hoe dit opgestel is:
if команда
then
команды
else
команды
fi
As die eerste opdrag nul gee, wat beteken dat dit suksesvol uitgevoer is, sal die voorwaarde waar wees en die uitvoering sal nie langs die tak gaan nie else. Andersins, as iets anders as nul teruggestuur word, wat mislukking beteken, of 'n vals resultaat, die opdragte na else.
Kom ons skryf die volgende skrif:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi
Sy teregstelling het afgegaan else.
Begin 'n skrip met 'n if-then-else-konstruksie
Wel, kom ons gaan aan en vra onsself af oor moeiliker toestande. Wat as jy nie een toestand moet nagaan nie, maar verskeie? Byvoorbeeld, as die vereiste gebruiker gevind word, moet een boodskap vertoon word, as daar aan 'n ander voorwaarde voldoen word, moet 'n ander boodskap vertoon word, ensovoorts. In so 'n situasie sal geneste toestande ons help. Dit lyk so:
if команда1
then
команды
elif команда2
then
команды
fi
As die eerste opdrag nul gee, wat die suksesvolle uitvoering daarvan aandui, sal die opdragte in die eerste blok uitgevoer word then, anders, as die eerste voorwaarde vals is, en as die tweede opdrag nul gee, sal die tweede blok kode uitgevoer word.
#!/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
In so 'n skrif kan jy byvoorbeeld 'n nuwe gebruiker skep deur die opdrag te gebruik useradd, as die soektog geen resultate opgelewer het nie, of doen iets anders nuttig.
Getalvergelyking
In skrifte kan jy numeriese waardes vergelyk. Hieronder is 'n lys van relevante opdragte.
n1 -eq n2Wys waar as n1 ewe veel n2. n1 -ge n2 Wys waar as n1meer of gelyk n2. n1 -gt n2Wys waar as n1 beter n2. n1 -le n2Wys waar as n1minder of gelyk n2. n1 -lt n2Wys waar as n1 minder is as n2. n1 -ne n2Wys waar as n1nie gelyk nie n2.
As voorbeeld, kom ons probeer een van die vergelykingsoperateurs. Let daarop dat die uitdrukking tussen vierkantige hakies ingesluit is.
#!/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
Hier is wat hierdie opdrag sal uitvoer.
Vergelyk getalle in skrifte
Veranderlike waarde val1groter as 5, uiteindelik word die tak uitgevoer thenvergelykingsoperateur en die ooreenstemmende boodskap word in die konsole vertoon.
String vergelyking
Skripte kan ook stringwaardes vergelyk. Vergelykingsoperateurs lyk redelik eenvoudig, maar stringvergelykingsoperateurs het sekere eienaardighede, wat ons hieronder sal aanraak. Hier is 'n lys van operateurs.
str1 = str2 Toets stringe vir gelykheid, gee waar as stringe identies is.
str1 != str2Wys waar as die stringe nie identies is nie. str1 < str2Wys waar as str1minder as str2. str1 > str2 Wys waar as str1meer as str2. -n str1 Wys waar as lengte str1Bo nul. -z str1Wys waar as lengte str1gelyk aan nul.
Hier is 'n voorbeeld van 'n string vergelyking in 'n skrif:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fi
As gevolg van die skrifuitvoering kry ons die volgende.
Stringvergelyking in skrifte
Hier is een kenmerk van stringvergelyking wat die moeite werd is om te noem. Die ">" en "<" operateurs moet naamlik ontsnap word met 'n terugskuinsstreep, anders sal die skrif nie reg werk nie, alhoewel geen foutboodskappe sal verskyn nie. Die skrif interpreteer die ">" teken as 'n opdrag om uitset te herlei.
Hier is hoe werk met hierdie operateurs in kode lyk:
#!/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
Hier is die resultate van die draaiboek.
Snaar vergelyking, waarskuwing gegooi
Let daarop dat die skrip, alhoewel dit uitgevoer word, 'n waarskuwing gee:
./myscript: line 5: [: too many arguments
Om van hierdie waarskuwing ontslae te raak, sluit ons af $val2 in dubbele aanhalingstekens:
#!/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
Nou werk alles soos dit moet.
String vergelyking
Nog 'n kenmerk van die ">" en "<" operateurs is hoe hulle werk met hoofletters en kleinletters. Om hierdie kenmerk te verstaan, kom ons berei 'n tekslêer voor met die volgende inhoud:
Likegeeks
likegeeks
Stoor dit met 'n naam myfileen voer dan die volgende opdrag in die terminaal uit:
sort myfile
Dit sal die lyne van die lêer soos volg sorteer:
likegeeks
Likegeeks
Span sort, sorteer by verstek stringe in stygende volgorde, wat beteken dat die kleinletter in ons voorbeeld minder as die hoofletter is. Kom ons berei nou 'n skrif voor wat dieselfde stringe sal vergelyk:
#!/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 jy dit hardloop, blyk dit dat die teenoorgestelde waar is - die kleinletter is nou groter as die hoofletter.
sorteer opdrag en string vergelyking in script lêer
In vergelykende opdragte is hoofletters kleiner as kleinletters. Stringvergelyking word hier gedoen deur die ASCII-karakterkodes te vergelyk, die sorteervolgorde is dus afhanklik van die karakterkodes.
Span sort, gebruik op sy beurt die sorteervolgorde wat in die stelseltaalinstellings gespesifiseer word.
Lêerkontroles
Miskien word die opdragte hieronder die meeste in bash-skrifte gebruik. Hulle laat jou toe om verskeie voorwaardes rakende lêers na te gaan. Hier is 'n lys van hierdie opdragte.
-d fileKontroleer of 'n lêer bestaan en of dit 'n gids is. -e fileKontroleer of 'n lêer bestaan. -f file Kontroleer of 'n lêer bestaan en of dit 'n lêer is. -r fileKontroleer of die lêer bestaan en leesbaar is. -s file ПKontroleer of die lêer bestaan en nie leeg is nie. -w fileKontroleer of die lêer bestaan en skryfbaar is. -x fileKontroleer of 'n lêer bestaan en uitvoerbaar is. file1 -nt file2 Kyk of dit nuwer is file1as file2. file1 -ot file2Kontroleer as ouer file1as file2. -O file Kontroleer of die lêer bestaan en deur die huidige gebruiker besit word. -G fileKontroleer of die lêer bestaan en of sy groep-ID ooreenstem met die huidige gebruiker se groep-ID.
Hierdie opdragte, sowel as baie ander wat vandag bespreek word, is maklik om te onthou. Hulle name, wat afkortings vir verskeie woorde is, dui direk die kontroles aan wat hulle uitvoer.
Kom ons probeer een van die opdragte in die praktyk:
#!/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
Hierdie skrif, vir 'n bestaande gids, sal die inhoud daarvan vertoon.
Lys die inhoud van 'n gids
Ons glo dat jy met die res van die opdragte op jou eie kan eksperimenteer, hulle geld almal volgens dieselfde beginsel.
Resultate van
Vandag het ons gepraat oor hoe om te begin om bash-skrifte te skryf en 'n paar basiese dinge gedek. Trouens, die onderwerp van bash-programmering is groot. Hierdie artikel is 'n vertaling van die eerste deel van 'n groot reeks van 11 materiaal. As jy nou wil voortgaan, hier is 'n lys van die oorspronklikes van hierdie materiaal. Gerieflikheidshalwe is die een wie se vertaling jy pas gelees het hier ingesluit.
Bash Script Stap Vir Stap - hier praat ons oor hoe om bash-skrifte te begin skep, die gebruik van veranderlikes word oorweeg, voorwaardelike konstruksies, berekeninge, vergelykings van getalle, stringe, om inligting oor lêers uit te vind, word beskryf.
Bash Scripting Deel 3, Parameters en opsies - hierdie materiaal word gewy aan opdragreëlparameters en sleutels wat na skrifte deurgegee kan word, werk met data wat die gebruiker invoer en wat uit lêers gelees kan word.
Bash Scripting Deel 11, Expect Command - hierdie materiaal is gewy aan die Verwag-instrument, waarmee u interaksie met interaktiewe nutsprogramme kan outomatiseer. Dit gaan veral oor verwag-skripte en hoe hulle met bash-skrifte en ander programme omgaan.
Ons dink dat een van die wonderlike dinge van hierdie reeks artikels is dat dit begin van die mees basiese, geskik vir gebruikers van enige vlak, geleidelik lei tot redelik ernstige onderwerpe, wat almal 'n kans gee om te vorder in Linux-opdragreël-skrip.
Liewe lesers! Ons vra bash-programmering ghoeroes om te praat oor hoe hulle tot die hoogtes van bemeestering gekom het, geheime deel, en ons wag vir indrukke van diegene wat pas hul eerste draaiboek geskryf het.
Slegs geregistreerde gebruikers kan aan die opname deelneem. Meld aan, asseblief.
Vertaal die res van die reeks artikels?
Ja!
Nee nie nodig nie
1030 gebruikers het gestem. 106 gebruikers het buite stemming gebly.