Idag ska vi prata om bash-skript. det här - kommandoradsskript, skrivet för bash-skalet. Det finns andra skal som zsh, tcsh, ksh, men vi kommer att fokusera på bash. Detta material är avsett för alla, det enda villkoret är förmågan att arbeta i kommandorad Linux.
Kommandoradsskript är samlingar av samma kommandon som kan matas in från tangentbordet, samlas in i filer och förenas med något gemensamt syfte. I det här fallet kan resultaten av teamens arbete antingen vara av oberoende värde eller fungera som indata för andra team. Skript är ett kraftfullt sätt att automatisera ofta utförda åtgärder.
Så, om vi pratar om kommandoraden, låter den dig utföra flera kommandon samtidigt genom att ange dem separerade med semikolon:
pwd ; whoami
Faktum är att om du provade detta i din terminal, har ditt första bash-skript som involverar två kommandon redan skrivits. Det fungerar så här. Laget först pwd visar information om den aktuella arbetskatalogen, sedan kommandot whoamivisar information om användaren du är inloggad som.
Med detta tillvägagångssätt kan du kombinera hur många kommandon du vill på en rad, den enda gränsen är det maximala antalet argument som kan skickas till programmet. Du kan definiera denna gräns med följande kommando:
getconf ARG_MAX
Kommandoraden är ett utmärkt verktyg, men du måste ange kommandon i den varje gång du behöver dem. Tänk om vi skrev en uppsättning kommandon i en fil och helt enkelt anropade den filen för att utföra dem? Faktum är att filen vi pratar om kallas ett kommandoradsskript.
Hur bash-skript fungerar
Skapa en tom fil med kommandot touch. Dess första rad måste indikera vilket skal vi ska använda. Vi är intresserade av bash, så den första raden i filen blir:
#!/bin/bash
Andra rader i den här filen använder hash-symbolen för att indikera kommentarer som skalet inte bearbetar. Den första raden är dock ett specialfall, det finns en hash följt av ett utropstecken (denna sekvens kallas shebang) och vägen till bash, indikera för systemet som skriptet skapades specifikt för bash.
Skalkommandon separeras av en radmatning, kommentarer separeras av ett hash-tecken. Så här ser det ut:
#!/bin/bash
# This is a comment
pwd
whoami
Här, precis som på kommandoraden, kan du skriva kommandon på en rad, separerade med semikolon. Men om du skriver kommandona på olika rader är filen lättare att läsa. I alla fall kommer skalet att bearbeta dem.
Ställa in skriptfilsbehörigheter
Spara filen och ge den ett namn myscript, och arbetet med att skapa bash-skriptet är nästan klart. Nu återstår bara att göra den här filen körbar, annars, om du försöker köra den, kommer du att stöta på ett fel Permission denied.
Försöker köra en skriptfil med felaktigt konfigurerade behörigheter
Låt oss göra filen körbar:
chmod +x ./myscript
Låt oss nu försöka köra det:
./myscript
Efter att ha ställt in behörigheterna fungerar allt som det ska.
Bash-skriptet körs framgångsrikt
Meddelandeutgång
Använd kommandot för att mata ut text till Linux-konsolen echo. Låt oss använda kunskapen om detta faktum och redigera vårt skript och lägga till förklaringar till data som matas ut av kommandona som redan finns i det:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
Detta är vad som händer efter att ha kört det uppdaterade skriptet.
Utmatning av meddelanden från ett skript
Nu kan vi visa förklarande anteckningar med kommandot echo. Om du inte vet hur man redigerar en fil med Linux-verktyg, eller om du inte har sett kommandot tidigare echo, ta en titt på detta материал.
Använda variabler
Variabler låter dig lagra information i en skriptfil, till exempel resultatet av kommandon, för användning av andra kommandon.
Det är inget fel med att utföra individuella kommandon utan att lagra deras resultat, men detta tillvägagångssätt är ganska begränsat i sina möjligheter.
Det finns två typer av variabler som kan användas i bash-skript:
Miljövariabler
Användarvariabler
Miljövariabler
Ibland måste skalkommandon fungera med vissa systemdata. Här är ett exempel på hur man visar den aktuella användarens hemkatalog:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
Observera att vi kan använda en systemvariabel $HOME i dubbla citattecken kommer detta inte att hindra systemet från att känna igen det. Detta är vad du får om du kör scenariot ovan.
Använda en miljövariabel i ett skript
Vad händer om du behöver visa ett dollartecken på skärmen? Låt oss prova detta:
echo "I have $1 in my pocket"
Systemet kommer att upptäcka ett dollartecken i en citerad sträng och antar att vi har refererat till en variabel. Skriptet kommer att försöka visa värdet på en odefinierad variabel $1. Det här är inte vad vi behöver. Vad ska man göra?
I den här situationen hjälper det att använda escape-tecken, ett snedstreck, innan dollartecknet:
echo "I have $1 in my pocket"
Skriptet kommer nu att mata ut exakt vad som förväntas.
Använda en flyktsekvens för att skriva ut ett dollartecken
Användarvariabler
Förutom miljövariabler låter bash-skript dig definiera och använda dina egna variabler i skriptet. Sådana variabler har ett värde tills skriptet slutför exekvering.
Som med systemvariabler kan användarvariabler nås med hjälp av dollartecknet:
TNW-CUS-FMP - kampanjkod för 10% rabatt på våra tjänster, tillgänglig för aktivering inom 7 dagar
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"
Detta är vad som händer efter att ha kört ett sådant skript.
Anpassade variabler i ett skript
Kommandosubstitution
En av de mest användbara funktionerna i bash-skript är möjligheten att extrahera information från kommandoutdata och tilldela den till variabler, så att du kan använda denna information var som helst i skriptfilen.
Detta kan göras på två sätt.
Använda backteck "`"
Genom design $()
När du använder den första metoden, var noga med att inte inkludera ett enda citattecken i stället för backtick. Kommandot måste omges av två sådana ikoner:
mydir=`pwd`
I det andra tillvägagångssättet skrivs samma sak så här:
mydir=$(pwd)
Och manuset kan sluta se ut så här:
#!/bin/bash
mydir=$(pwd)
echo $mydir
Under dess drift, utmatningen av kommandot pwdkommer att sparas i en variabel mydir, vars innehåll, med hjälp av kommandot echo, kommer att gå till konsolen.
Ett skript som sparar resultatet av ett kommando i en variabel
Matematiska operationer
För att utföra matematiska operationer i en skriptfil kan du använda en konstruktion som $((a+b)):
I vissa scenarier måste du kontrollera flödet av kommandoexekvering. Till exempel, om ett visst värde är större än fem, måste du utföra en åtgärd, annars en annan. Detta är tillämpligt i många situationer och här kommer kontrollstrukturen att hjälpa oss if-then. I sin enklaste form ser det ut så här:
if команда
then
команды
fi
Här är ett fungerande exempel:
#!/bin/bash
if pwd
then
echo "It works"
fi
I det här fallet, om kommandot exekveras pwdkommer att slutföras framgångsrikt, kommer texten "det fungerar" att visas i konsolen.
Låt oss använda den kunskap vi har och skriva ett mer komplext manus. Låt oss säga att vi måste hitta en viss användare i /etc/passwd, och om du lyckades hitta den, rapportera att den finns.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
Detta är vad som händer efter att ha kört det här skriptet.
Användarsökning
Här använde vi kommandot grepför att söka efter en användare i en fil /etc/passwd. Om laget grepobekant för dig, dess beskrivning kan hittas här.
I det här exemplet, om användaren hittas, kommer skriptet att visa ett motsvarande meddelande. Vad händer om användaren inte kunde hittas? I det här fallet kommer skriptet helt enkelt att slutföra körningen utan att berätta något för oss. Vi vill att han också berättar om detta, så vi förbättrar koden.
om-då-annat kontrollkonstruktion
För att programmet ska kunna rapportera både resultat av en lyckad sökning och misslyckande kommer vi att använda konstruktionen if-then-else. Så här fungerar det:
if команда
then
команды
else
команды
fi
Om det första kommandot returnerar noll, vilket betyder att det kördes framgångsrikt, kommer villkoret att vara sant och exekveringen kommer inte att fortsätta längs grenen else. Annars, om något annat än noll returneras, vilket skulle indikera fel eller ett falskt resultat, kommandona efter else.
Låt oss skriva följande manus:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi
Hans avrättning gick i sjön else.
Köra ett skript med en if-then-else-konstruktion
Nåväl, låt oss gå vidare och fråga oss själva om mer komplexa förhållanden. Vad händer om du behöver kontrollera inte ett tillstånd, utan flera? Till exempel, om den önskade användaren hittas ska ett meddelande visas, om något annat villkor är uppfyllt ska ett annat meddelande visas och så vidare. I en sådan situation kommer kapslade förhållanden att hjälpa oss. Det ser ut så här:
if команда1
then
команды
elif команда2
then
команды
fi
Om det första kommandot returnerar noll, vilket indikerar dess framgångsrika exekvering, kommer kommandona i det första blocket att utföras then, annars, om det första villkoret är falskt och om det andra kommandot returnerar noll, kommer det andra kodblocket att exekveras.
#!/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
I ett sådant skript kan du till exempel skapa en ny användare med kommandot useradd, om sökningen inte gav resultat, eller gör något annat användbart.
Jämförelse av siffror
I skript kan du jämföra numeriska värden. Nedan finns en lista över relevanta kommandon.
n1 -eq n2Returnerar sant om n1 är n2. n1 -ge n2 Returnerar sant om n1mer eller lika n2. n1 -gt n2Returnerar sant om n1 больше n2. n1 -le n2Returnerar sant om n1mindre eller lika n2. n1 -lt n2Returnerar sant om n1 är mindre än n2. n1 -ne n2Returnerar sant om n1inte lika n2.
Som ett exempel, låt oss prova en av jämförelseoperatorerna. Observera att uttrycket omges av hakparenteser.
#!/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
Detta är vad detta kommando kommer att mata ut.
Jämförelse av siffror i skript
Variabelt värde val1större än 5, slutar grenen att exekveras thenjämförelseoperatör och ett motsvarande meddelande visas i konsolen.
Strängjämförelse
Skript kan också jämföra strängvärden. Jämförelseoperatorer ser ganska enkla ut, men strängjämförelseoperationer har vissa funktioner, som vi kommer att beröra nedan. Här är en lista över operatörer.
str1 = str2 Testar strängar för likhet, returnerar sant om strängarna är identiska.
str1 != str2Returnerar sant om strängarna inte är identiska. str1 < str2Returnerar sant om str1mindre än str2. str1 > str2 Returnerar sant om str1mer än str2. -n str1 Returnerar sant om längden str1Över noll. -z str1Returnerar sant om längden str1lika med noll.
Här är ett exempel på att jämföra strängar i ett skript:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fi
Som ett resultat av att köra skriptet får vi följande.
Jämföra strängar i skript
Här är en funktion av strängjämförelse som är värd att nämna. Operatörerna ">" och "<" måste nämligen escapes med ett omvänt snedstreck, annars kommer skriptet inte att fungera korrekt, även om inga felmeddelanden visas. Skriptet tolkar tecknet ">" som ett omdirigeringskommando för utdata.
Så här ser det ut att arbeta med dessa operatorer i kod:
#!/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
Här är resultatet av manuset.
Strängjämförelse, varning ges
Observera att skriptet, även om det körs, utfärdar en varning:
./myscript: line 5: [: too many arguments
För att bli av med denna varning, avslutar vi $val2 inom dubbla citattecken:
#!/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
Nu fungerar allt som det ska.
Strängjämförelse
En annan funktion hos operatorerna ">" och "<" är hur de fungerar med versaler och gemener. För att förstå den här funktionen, låt oss förbereda en textfil med följande innehåll:
Likegeeks
likegeeks
Låt oss spara den genom att ge den ett namn myfile, kör sedan följande kommando i terminalen:
sort myfile
Det kommer att sortera raderna från filen så här:
likegeeks
Likegeeks
Team sort, som standard, sorterar strängar i stigande ordning, det vill säga att den gemena bokstaven i vårt exempel är mindre än den stora. Låt oss nu förbereda ett skript som kommer att jämföra samma strängar:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
Om du kör det visar det sig att allt är tvärtom - den gemena bokstaven är nu större än den stora.
Sorteringskommandot och jämförande strängar i en skriptfil
I jämförelsekommandon är stora bokstäver mindre än gemener. Strängjämförelse här görs genom att jämföra tecknens ASCII-koder, sorteringsordningen beror alltså på teckenkoderna.
Team sort, använder i sin tur den sorteringsordning som anges i systemspråkinställningarna.
Filkontroller
Kanske används följande kommandon oftast i bash-skript. De låter dig kontrollera olika villkor för filer. Här är en lista över dessa kommandon.
-d fileKontrollerar om en fil finns och är en katalog. -e fileKontrollerar om filen finns. -f file Kontrollerar om en fil finns och är en fil. -r fileKontrollerar om filen finns och är läsbar. -s file ПKontrollerar om filen finns och inte är tom. -w fileKontrollerar om filen finns och är skrivbar. -x fileKontrollerar om filen finns och är körbar. file1 -nt file2 Kollar om det är nyare file1än file2. file1 -ot file2Kollar om det är äldre file1än file2. -O file Kontrollerar om filen finns och ägs av den aktuella användaren. -G fileKontrollerar om en fil finns och om dess grupp-ID matchar den aktuella användarens grupp-ID.
Dessa kommandon, liksom många andra som diskuteras idag, är lätta att komma ihåg. Deras namn, som är förkortningar av olika ord, indikerar direkt vilka kontroller de utför.
Låt oss prova ett av kommandona i praktiken:
#!/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
Detta skript, för en befintlig katalog, visar dess innehåll.
Lista innehållet i en katalog
Vi tror att du kan experimentera med de återstående kommandona själv, de används alla enligt samma princip.
Resultat av
Idag pratade vi om hur man kommer igång med att skriva bash-manus och täckte några grundläggande saker. Faktum är att ämnet bash-programmering är enormt. Den här artikeln är en översättning av den första delen av en stor serie med 11 material. Om du vill fortsätta just nu, här är en lista över originalen av dessa material. För enkelhetens skull ingår översättningen som du just läste av här.
Bash Script steg för steg — här talar vi om hur man börjar skapa bash-skript, användningen av variabler övervägs, villkorliga strukturer, beräkningar, jämförelser av tal, strängar och att ta reda på information om filer beskrivs.
Bash Scripting del 3, parametrar och alternativ — Detta material är ägnat åt kommandoradsparametrar och nycklar som kan skickas till skript, som arbetar med data som användaren anger och som kan läsas från filer.
Bash Scripting Del 4, Input & Output - här pratar vi om fildeskriptorer och att arbeta med dem, om input, output, felströmmar och om output omdirigering.
Bash Scripting Del 5, Sighals & Jobs — Detta material ägnas åt Linux-signaler, deras bearbetning i skript och lansering av skript enligt ett schema.
Bash Scripting Del 11, Expect Command — Detta material är tillägnat Expect-verktyget, med vilket du kan automatisera interaktion med interaktiva verktyg. I synnerhet talar vi om förväntade manus och deras interaktion med bash-skript och andra program.
Vi tror att en av de värdefulla funktionerna i den här artikelserien är att den, från den enklaste, lämplig för användare på alla nivåer, gradvis leder till ganska allvarliga ämnen, vilket ger alla en chans att avancera i skapandet av Linux-kommandoradsskript .
Kära läsare! Vi ber bash-programmeringsguruer att prata om hur de nådde höjderna av sin behärskning, dela med sig av sina hemligheter och vi ser fram emot att få intryck från dem som precis har skrivit sitt första manus.
Endast registrerade användare kan delta i undersökningen. Logga in, Snälla du.
Ska jag översätta resten av artikelserien?
Yes!
Nej inget behov
1030 användare röstade. 106 användare avstod från att rösta.