Bash-skript: början

Bash-skript: början
Bash-skript, del 2: loopar
Bash-skript, del 3: parametrar och kommandoradsnycklar
Bash-skript, del 4: in- och utdata
Bash-skript, del 5: signaler, bakgrundsuppgifter, skriptkontroll
Bash-skript, del 6: funktioner och utveckling av bibliotek
Bash-skript, del 7: sed och textbearbetning
Bash-skript, del 8: databehandlingssprÄket awk
Bash-skript, del 9: reguljÀra uttryck
Bash-skript, del 10: praktiska exempel
Bash-skript, del 11: expect och automatisering av interaktiva verktyg

Idag ska vi prata om bash-skript. Det hĂ€r Ă€r kommandoradsprogram, 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 kommandoraden Linux.

Bash-skript: början

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.

Bash-skript: början

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_MAX

Kommandoraden À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 shebang) 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
whoami

HÀ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.

Bash-skript: början
Försök att köra skriptfilen med felaktigt instÀllda behörigheter

LÄt oss göra filen körbar:

chmod +x .\/myscript

Nu försöker vi köra den:

.\/myscript

Efter att ha stÀllt in behörigheterna fungerar allt som det ska.

Bash-skript: början
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:"
whoami

SÄ hÀr ser det ut efter att det uppdaterade skriptet körts.

Bash-skript: början
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Ä det hÀr 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.

Bash-skript: början
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.

Bash-skript: början
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.

Bash-skript: början
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.

Bash-skript: början
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

Bash-skript: början
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
fi

HÀ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"
fi

SÄ hÀr ser det ut efter att ha kört detta skript.

Bash-skript: början
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 hÀr.

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.

Bash-skript: början
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 om n1 Àr lika med n2.
n1 -ge n2 Returnerar sant om n1större Àn eller lika med n2.
n1 -gt n2Returnerar sant om n1 större n2.
n1 -le n2Returnerar sant om n1mindre Àn eller lika med n2.
n1 -lt n2Returnerar sant om n1 Àr mindre Àn n2.
n1 -ne n2Returnerar sant om n1inte lika med n2.

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"
fi

Detta Àr vad som kommer att skrivas ut av detta kommando.

Bash-skript: början
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 = str2 Kontrollerar om strÀngarna Àr lika, returnerar sant om strÀngarna Àr identiska.
sstr1 != str2Returnerar sant om strÀngarna inte Àr identiska.
str1 < str2Returnerar sant om str1Àr mindre Àn str2.
str1 > str2 Returnerar sant om str1större Àn str2.
-n str1 Returnerar sant om lÀngden str1Àr större Àn noll.
-z str1Returnerar sant om lÀngden str1À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"
fi

Som ett resultat av skriptets körning fÄr vi följande.

Bash-skript: början
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"
fi

HÀr Àr resultaten av skriptets arbete.

Bash-skript: början
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"
fi

Nu fungerar allt som det ska.

Bash-skript: början
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 myfile

Det 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"
fi

Om det körs kommer det att visa att allt Àr tvÀrtom - den lilla bokstaven Àr nu större Àn den stora bokstaven.

Bash-skript: början
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 file Kontrollerar 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 file2 Kontrollerar om det Àr nyare Àn fil1, Àn fil2.
fil1 -ot fil2Kontrollerar om det Àr Àldre Àn fil1, Àn fil2.
-O fil Kontrollerar 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"
fi

Detta skript, för en existerande katalog, kommer att skriva ut dess innehÄll.

Bash-skript: början
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.

  1. Bash Skript Steg För Steg — 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.
  2. Bash Scripting Del 2, Bash den fantastiska — hĂ€r diskuteras sĂ€rdragen av att arbeta med for- och while-loopar.
  3. Bash Scripting Del 3, Parametrar & alternativ — 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.
  4. Bash Scripting Del 4, Inmatning & Utmatning — hĂ€r handlar det om filbeskrivare och hur man arbetar med dem, om in- och utdataflöden, felmeddelanden, och om att omdirigera utdata.
  5. Bash Scripting Del 5, Signaler & Jobb — detta material handlar om Linux-signaler, deras behandling i skript, och planering av körning av skript.
  6. Bash Scripting Del 6, Funktioner — hĂ€r kan du lĂ€ra dig om hur man skapar och anvĂ€nder funktioner i skript, samt hur man utvecklar bibliotek.
  7. Bash Scripting Del 7, AnvĂ€nda sed — den hĂ€r artikeln handlar om att arbeta med textredigeraren sed.
  8. Bash Scripting Del 8, AnvĂ€nda awk — detta material handlar om programmering med databehandlingssprĂ„ket awk.
  9. Bash Scripting Del 9, Regexp — hĂ€r kan du lĂ€sa om anvĂ€ndningen av reguljĂ€ra uttryck i bash-skript.
  10. Bash-skriptning Del 10, Praktiska Exempel — hĂ€r presenteras metoder för att hantera meddelanden som kan skickas till anvĂ€ndare, samt metoder för diskövervakning.
  11. Bash-skriptning Del 11, Expect Kommando — 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.

Bash-skript: början

Endast registrerade anvÀndare kan delta i omröstningen. Logga in, 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

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster