Idag ska vi prata om bash-skript. Det hĂ€r Ă€r , skrivna för bash-skalet. Det finns andra skal, till exempel â zsh, tcsh, ksh, men vi kommer att fokusera pĂ„ bash. Detta material Ă€r avsett för alla som vill lĂ€ra sig, den enda förutsĂ€ttningen Ă€r att kunna arbeta i Linux.
Kommandoradsprogram Àr uppsÀttningar av samma kommandon som kan skrivas in via tangentbordet, samlade i filer och förenade med ett gemensamt syfte. Resultatet av dessa kommandon kan antingen ha ett sjÀlvstÀndigt vÀrde eller fungera som indata för andra kommandon. Skript Àr ett kraftfullt sÀtt att automatisera ofta utförda uppgifter.
SÄ, om man talar om kommandoraden, tillÄter den att utföra flera kommandon pÄ en gÄng genom att skriva in dem med ett semikolon:
pwd ; whoami I sjÀlva verket, om du har testat detta i din terminal, sÄ har ditt första bash-skript, som anvÀnder tvÄ kommandon, redan skrivits. Det fungerar sÄ hÀr. Först kommandot pwd visar information om den aktuella arbetskatalogen, sedan visar kommandot whoamiinformation om den anvÀndare du Àr inloggad som.
Genom att anvÀnda en sÄdan metod kan du kombinera hur mÄnga kommandon som helst pÄ en rad, begrÀnsningen Àr endast det maximala antalet argument som kan överföras till programmet. Denna begrÀnsning kan bestÀmmas med följande kommando:
getconf ARG_MAXKommandoraden Àr ett utmÀrkt verktyg, men kommandona mÄste skrivas in varje gÄng de behövs. Vad sÀgs om att skriva en uppsÀttning kommandon till en fil och helt enkelt Äberopa den filen för att utföra dem? Egentligen kallas den fil vi pratar om för ett kommandoradsskript.
Hur bash-skript Àr uppbyggda
Skapa en tom fil med kommandot touch. I den första raden mÄste vi ange vilken speciell skalkommandotolk vi avser att anvÀnda. Vi Àr intresserade av bash, sÄ den första raden i filen blir följande:
#!/bin/bash I andra rader i denna fil anvÀnds tecknet # för att indikera kommentarer som skalet inte bearbetar. Men den första raden Àr ett specialfall; hÀr anvÀnds ett # följt av ett utropstecken (denna sekvens kallas för ) och sökvÀgen till bash, vilket indikerar för systemet att skriptet har skapats specifikt för bash.
Skalkommandon separeras med radbrytningar, kommentarer markeras med tecknet #. SÄ hÀr ser det ut:
#!/bin/bash
# This is a comment
pwd
whoamiHÀr, precis som i kommandoraden, kan du skriva kommandon pÄ en rad, separerade med semikolon. Men om du skriver kommandon pÄ olika rader blir filen lÀttare att lÀsa. I vilket fall som helst kommer skalet att bearbeta dem.
InstÀllning av behörigheter för skriptfilen
Spara filen med namnet 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 kommer du att stöta pÄ ett fel nÀr du försöker köra den. Behörighet nekad.

Försök att köra skriptfilen med felaktigt instÀllda behörigheter
LÄt oss göra filen körbar:
chmod +x .\/myscriptNu försöker vi köra den:
.\/myscriptEfter att ha stÀllt in behörigheterna fungerar allt som det ska.

FramgÄngsrik körning av bash-skriptet
Utskrift av meddelanden
För att skriva text till Linux-konsolen anvÀnds kommandot echo. LÄt oss anvÀnda denna kunskap och redigera vÄrt skript, lÀgga till förklaringar till de data som de befintliga kommandona skriver ut:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiSÄ hÀr ser det ut efter att det uppdaterade skriptet körts.

Utskrift av meddelanden frÄn skriptet
Nu kan vi skriva ut förklarande texter med hjÀlp av kommandot echo. Om du inte vet hur du redigerar en fil med Linux-verktyg eller inte har stött pÄ kommandot echo, ta en titt pÄ materialet.
AnvÀndning av variabler
Variabler tillÄter lagring av information i skriptfilen, till exempel resultaten av kommandon för att anvÀnda dem i andra kommandon.
Det Àr inget fel i att köra enskilda kommandon utan att lagra resultaten, men möjligheterna med en sÄdan metod Àr ganska begrÀnsade.
Det finns tvÄ typer av variabler som kan anvÀndas i bash-skript:
- Miljövariabler
- Anpassade variabler
Miljövariabler
Ibland behöver man arbeta med vissa systemdata i skalkommandon. HÀr Àr till exempel hur man visar hemmakatalogen för den aktuella anvÀndaren:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Observera att vi kan anvÀnda systemvariabeln $HOME i dubbla citat, detta hindrar inte systemet frÄn att kÀnna igen den. SÄ hÀr ser det ut om man kör det ovanstÄende skriptet.

AnvÀndning av miljövariabel i skript
Men vad om vi vill visa dollartecknet pÄ skÀrmen? LÄt oss försöka sÄ hÀr:
echo "I have $1 in my pocket" Systemet kommer att upptÀcka dollartecknet i strÀngen inom citat och anta att vi refererar till en variabel. Skriptet kommer att försöka visa vÀrdet av en icke-definierad variabel $1. Det Àr inte vad vi vill ha. Vad ska vi göra?
I en sÄdan situation kan anvÀndning av kontrolltecknet, bakÄtsnedstreck, före dollartecknet hjÀlpa:
echo "I have $1 in my pocket"Nu kommer skriptet att visa precis det som förvÀntas.

AnvÀndning av kontrollsekvens för att visa dollartecknet
Anpassade variabler
Förutom miljövariabler tillÄter bash-skript att man definierar och anvÀnder egna variabler i skriptet. SÄdana variabler behÄller sitt vÀrde tills skriptets körning Àr avslutad.
Precis som med systemvariabler kan man referera till anvÀndarvariabler med ett dollartecken:
TNW-CUS-FMP â en kampanjkod för 10% rabatt pĂ„ vĂ„ra tjĂ€nster, tillgĂ€nglig för aktivering under 7 dagar
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"SÄ hÀr ser det ut efter att man har kört ett sÄdant skript.

Anpassade variabler i skriptet
KommandoinbÀddning
En av de mest anvÀndbara funktionerna i bash-skript Àr möjligheten att extrahera information frÄn kommandons utdata och tilldela det till variabler, vilket gör det möjligt att anvÀnda denna information var som helst i skriptfilen.
Det kan göras pÄ tvÄ sÀtt.
- Med hjÀlp av bakÄtvÀnd apostrof «`»
- Med hjÀlp av konstruktionen
$()
Vid anvÀndning av det första tillvÀgagÄngssÀttet, se till att du inte skriver en vanlig citat istÀllet för bakÄtvÀnd apostrof. Kommandot mÄste omges av tvÄ sÄdana tecken:
mydir=`pwd`Vid det andra tillvÀgagÄngssÀttet skrivs det pÄ samma sÀtt:
mydir=$(pwd)Och skriptet kan se ut sÄ hÀr:
#!/bin/bash
mydir=$(pwd)
echo $mydir Under sin körning kommer kommandots utdata pwdatt sparas i variabeln mydir, vars innehÄll, med hjÀlp av kommandot echo, kommer att dyka upp i konsolen.

Ett skript som sparar resultaten av kommandots arbete i en variabel
Matematiska operationer
För att utföra matematiska operationer i skriptfilen kan man anvÀnda konstruktionen $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Matematiska operationer i skriptet
Kontrollstruktur if-then
I vissa skript krÀvs det att man styr flödet av kommandots exekvering. Till exempel, om ett visst vÀrde Àr större Àn fem, mÄste en ÄtgÀrd utföras, annars en annan. Detta Àr tillÀmpligt i mÄnga situationer, och hÀr hjÀlper oss kontrollstrukturen if-then. I sin mest grundlÀggande form ser den ut sÄ hÀr:
if kommando
then
kommandon
fiHÀr Àr ett arbetsprov:
#!/bin/bash
if pwd
then
echo "It works"
fi I detta fall, om exekveringen av kommandot pwdslutar framgÄngsrikt, kommer texten "it works" att skrivas ut i konsolen.
LÄt oss anvÀnda den befintliga kunskapen och skriva ett mer komplext skript. LÄt oss sÀga att vi behöver hitta en viss anvÀndare i /etc/passwd, och om vi lyckas hitta honom, meddela att han existerar.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiSÄ hÀr ser det ut efter att ha kört detta skript.

Sök anvÀndare
HÀr anvÀnde vi kommandot grepför att söka efter anvÀndaren i filen /etc/passwd. Om kommandot grepÀr okÀnt för dig, kan du hitta dess beskrivning .
I detta exempel, om anvÀndaren hittas, kommer skriptet att ge ett motsvarande meddelande. Men om anvÀndaren inte kan hittas? I sÄ fall kommer skriptet helt enkelt att avsluta exekveringen utan att meddela oss nÄgot. Vi skulle vilja att det berÀttar Àven om detta, sÄ vi förbÀttrar koden.
Kontrollstruktur if-then-else
För att programmet ska kunna meddela bÄde resultaten av en framgÄngsrik sökning och ett misslyckande anvÀnder vi konstruktionen if-then-else. SÄ hÀr fungerar den:
if kommando
then
kommandon
else
kommandon
fi Om det första kommandot returnerar noll, vilket betyder att det har utförts framgÄngsrikt, kommer villkoret att vara sant och exekveringen följer inte grenen else. I motsatt fall, om nÄgot annat Àn noll returneras, vilket indikerar ett misslyckande eller en falsk utgÄng, kommer kommandon efter else.
Skriv ett sÄdant skript:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesnât exist"
fi Dess exekvering gick genom grenen else.

Köra skriptet med if-then-else-konstruktionen
SĂ„, vi fortsĂ€tter framĂ„t och stĂ€ller oss frĂ„gan om mer komplexa villkor. Vad hĂ€nder om vi mĂ„ste kontrollera mer Ă€n ett villkor? Till exempel, om den önskade anvĂ€ndaren hittas, ska vi visa ett meddelande, om nĂ„got annat villkor uppfylls â ett annat meddelande, och sĂ„ vidare. I en sĂ„dan situation hjĂ€lper oss inbĂ€ddade villkor. Det ser ut sĂ„ hĂ€r:
if kommando1
then
kommandon
elif kommando2
then
kommandon
fi Om det första kommandot returnerar noll, vilket indikerar att det har utförts framgÄngsrikt, kommer kommandona i första blocket att köras. then, annars, om det första villkoret visar sig vara falskt, och om det andra kommandot returnerar noll, kommer det andra kodblocket att köras.
#!/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 vi till exempel skapa en ny anvÀndare med kommandot useradd, om sökningen inte gav nÄgra resultat, eller göra nÄgot annat anvÀndbart.
JÀmförelse av tal
I skript kan vi jÀmföra numeriska vÀrden. Nedan följer en lista över motsvarande kommandon.
n1 -eq n2Returnerar sant omn1Ă€r lika medn2.
n1 -ge n2Returnerar sant omn1större Àn eller lika medn2.
n1 -gt n2Returnerar sant omn1störren2.
n1 -le n2Returnerar sant omn1mindre Àn eller lika medn2.
n1 -lt n2Returnerar sant om n1 Àr mindre Ànn2.
n1 -ne n2Returnerar sant omn1inte lika medn2.
Som exempel ska vi testa en av jÀmförelseoperatörerna. Observera att uttrycket Àr inneslutet i 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"
fiDetta Àr vad som kommer att skrivas ut av detta kommando.

JÀmförelse av tal i skript
VÀrdet av variabeln val1Àr större Àn 5, och grenen av thenjÀmförelseoperatorn kommer att utföras, och ett motsvarande meddelande skrivs ut i konsolen.
JÀmförelse av strÀngar
I skript kan vi ocksÄ jÀmföra strÀngvÀrden. JÀmförelseoperatörerna ser ganska enkla ut, men det finns vissa specifika egenskaper med strÀngjÀmförelser som vi kommer att beröra nedan. HÀr Àr en lista över operatörerna.
str1 = str2Kontrollerar om strÀngarna Àr lika, returnerar sant om strÀngarna Àr identiska.
sstr1 != str2Returnerar sant om strÀngarna inte Àr identiska.
str1 < str2Returnerar sant omstr1Àr mindre Ànstr2.
str1 > str2Returnerar sant omstr1större Ànstr2.
-n str1Returnerar sant om lÀngdenstr1Àr större Àn noll.
-z str1Returnerar sant om lÀngdenstr1Àr lika med noll.
HÀr Àr ett exempel pÄ strÀngjÀmförelse i ett skript:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fiSom ett resultat av skriptets körning fÄr vi följande.

JÀmförelse av strÀngar i skript
Det finns ett sÀtt att jÀmföra strÀngar som bör nÀmnas. NÀrmare bestÀmt, operatörerna ">" och "" som ett kommando för att omdirigera utdata.
SÄ hÀr ser arbetet med dessa operatorer ut i koden:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiHÀr Àr resultaten av skriptets arbete.

StrÀngjÀmförelse, varning genererad
Observera att skriptet, Àven om det körs, ger en varning:
./myscript: line 5: [: för mÄnga argument För att bli av med denna varning, omger vi $val2 med 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"
fiNu fungerar allt som det ska.

JÀmförelse av strÀngar
Ănnu en aspekt av operatorerna ">" och "<" handlar om hur de fungerar med stora och smĂ„ bokstĂ€ver. För att förstĂ„ denna egenskap, förbereder vi en textfil med följande innehĂ„ll:
Likegeeks
likegeeks Vi sparar den under namnet myfile, och kör sedan följande kommando i terminalen:
sort myfileDet kommer att sortera raderna frÄn filen sÄ hÀr:
likegeeks
Likegeeks Team sort, sorterar som standard raderna i stigande ordning, vilket innebÀr att en liten bokstav i vÄrt exempel Àr mindre Àn en stor bokstav. Nu förbereder vi 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"
fiOm det körs kommer det att visa att allt Àr tvÀrtom - den lilla bokstaven Àr nu större Àn den stora bokstaven.

Kommandot sort och strÀngjÀmförelse i skriptfilen
I jÀmförelsekommandon Àr stora bokstÀver mindre Àn smÄ bokstÀver. StrÀngjÀmförelsen utförs hÀr genom att jÀmföra ASCII-koderna för tecknen, vilket gör att sorteringsordningen beror pÄ teckenkoderna.
Team sort, i sin tur, anvÀnder den sorteringsordningen som anges i systemets sprÄkinstÀllningar.
Filkontroller
Kanske anvÀnds följande kommandon i bash-skript oftast. De gör det möjligt att kontrollera olika villkor som rör filer. HÀr Àr en lista över dessa kommandon.
-d fileKontrollerar om filen finns och om den Àr en katalog.
-e fileKontrollerar om filen finns.
-f fileKontrollerar om filen finns och om den Àr en fil.
-r fileKontrollerar om filen finns och om den Àr lÀsbar.
-s fileKontrollerar om filen finns och om den inte Àr tom.
-w fileKontrollerar om filen finns och om den Àr skrivbar.
-x fileKontrollerar om filen finns och om den Àr körbar.
file1 -nt file2Kontrollerar om det Àr nyare Ànfil1, Ànfil2.
fil1 -ot fil2Kontrollerar om det Àr Àldre Ànfil1, Ànfil2.
-O filKontrollerar om filen finns och om den nuvarande anvÀndaren Àr Àgare av den.
-G filKontrollerar om filen finns och om dess gruppidentifierare matchar den aktuella anvÀndarens gruppidentifierare.
Dessa kommandon, som mÄnga andra som vi diskuterat idag, Àr inte svÄra att komma ihÄg. Deras namn, som Àr förkortningar av olika ord, anger tydligt 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"
fiDetta skript, för en existerande katalog, kommer att skriva ut dess innehÄll.

Utdata för katalogens innehÄll
Vi antar att du kan experimentera med de andra kommandona sjÀlv, de tillÀmpas alla pÄ samma sÀtt.
Sammanfattning
Idag har vi pratat om hur man börjar skriva bash-skript och diskuterat nĂ„gra grundlĂ€ggande saker. Ămnet bash-programmering Ă€r faktiskt enormt. Den hĂ€r artikeln Ă€r en översĂ€ttning av den första delen av en stor serie med 11 artiklar. Om du vill ha fortsĂ€ttningen direkt â hĂ€r Ă€r en lista med originalen av dessa artiklar. För bekvĂ€mlighetens skull Ă€r Ă€ven den artikel inkluderad som du just har lĂ€st.
- â hĂ€r handlar det om hur man börjar skapa bash-skript, anvĂ€ndning av variabler, beskrivning av villkorliga konstruktioner, berĂ€kningar, jĂ€mförelser av siffror, strĂ€ngar, och att hĂ€mta information om filer.
- â hĂ€r diskuteras sĂ€rdragen av att arbeta med for- och while-loopar.
- â detta material handlar om kommandoradsparametrar och nycklar som kan överföras till skript, arbete med data som anvĂ€ndaren matar in, och som kan lĂ€sas frĂ„n filer.
- â hĂ€r handlar det om filbeskrivare och hur man arbetar med dem, om in- och utdataflöden, felmeddelanden, och om att omdirigera utdata.
- â detta material handlar om Linux-signaler, deras behandling i skript, och planering av körning av skript.
- â hĂ€r kan du lĂ€ra dig om hur man skapar och anvĂ€nder funktioner i skript, samt hur man utvecklar bibliotek.
- â den hĂ€r artikeln handlar om att arbeta med textredigeraren sed.
- â detta material handlar om programmering med databehandlingssprĂ„ket awk.
- â hĂ€r kan du lĂ€sa om anvĂ€ndningen av reguljĂ€ra uttryck i bash-skript.
- â hĂ€r presenteras metoder för att hantera meddelanden som kan skickas till anvĂ€ndare, samt metoder för diskövervakning.
- â detta material handlar om verktyget Expect, som kan anvĂ€ndas för att automatisera interaktion med interaktiva verktyg. HĂ€r diskuteras sĂ€rskilt expect-skript och deras interaktion med bash-skript och andra program.
Vi anser att en av de vÀrdefulla egenskaperna hos denna serie artiklar Àr att den, med början i det mest grundlÀggande som passar anvÀndare pÄ alla nivÄer, gradvis leder till ganska seriösa Àmnen, vilket ger alla som önskar en chans att förbÀttra sina fÀrdigheter i att skapa Linux kommandoradsskript.
KÀra lÀsare! Vi ber bash-programmeringsexperter att berÀtta hur de nÄdde mÀsterskapsnivÄ, dela hemligheter, och frÄn dem som just har skrivit sitt första skript vÀntar vi pÄ intryck.
Endast registrerade anvÀndare kan delta i omröstningen. , tack.
Ska vi översÀtta de resterande delarna av artikelcykeln?
Ja!
Nej, det behövs inte
1030 anvÀndare har röstat. 106 anvÀndare avstod.
KĂ€lla: habr.com
