I dag vil vi tale om bash-scripts. Det er - , skrevet til bash-shellen. Der findes også andre shells, såsom zsh, tcsh, ksh, men vi vil fokusere på bash. Dette materiale er beregnet til alle interesserede, den eneste betingelse er, at man skal kunne arbejde med i Linux.
Kommandolinjescripts er sæt af de samme kommandoer, som kan indtastes via tastaturet, samlet i filer og forenet med et fælles mål. Resultaterne af disse kommandoer kan enten have en selvstændig værdi eller tjene som input til andre kommandoer. Scripts er en kraftfuld måde at automatisere ofte udførte handlinger på.
Så hvis vi taler om kommandolinjen, tillader den, at man kan udføre flere kommandoer på én gang ved at indtaste dem adskilt med et semikolon:
pwd ; whoami Faktisk, hvis du har prøvet dette i din terminal, er dit første bash-script, som involverer to kommandoer, allerede skrevet. Det fungerer således. Først pwd viser kommandoen output om den nuværende arbejdsmappe, og derefter viser kommandoenwhoami
oplysninger om brugeren, som du er logget ind som.
getconf ARG_MAXVed at bruge en sådan tilgang kan du kombinere så mange kommandoer som muligt i én linje, begrænsningen er kun det maksimale antal argumenter, der kan sendes til programmet. Denne begrænsning kan bestemmes ved hjælp af følgende kommando:
Kommandolinjen er et fremragende værktøj, men kommandoer skal indtastes hver gang, der er behov for dem. Hvad hvis du skriver et sæt af kommandoer ind i en fil og bare kalder denne fil for at udføre dem? Faktisk kaldes denne fil, vi taler om, et kommandolinjescript.
Hvordan bash-scripts fungerer Opret en tom fil med kommandoen. I den første linje skal vi angive, hvilken shell vi planlægger at bruge. Vi er interesseret i bash, så den første linje i filen vil se sådan ud:
#!/bin/bash I andre linjer i denne fil bruges hash-tegnet til at angive kommentarer, som shell'en ikke behandler. Dog er første linje et særligt tilfælde, her bruges hash-tegnet efterfulgt af et udråbstegn (denne sekvens kaldes ) og sti til bash, der fortæller systemet, at scriptet er oprettet specifikt til bash.
Shell-kommandoer adskilles af linjeskift, kommentarer fremhæves med hash-tegnet. Sådan ser det ud:
#!/bin/bash
# This is a comment
pwd
whoamiHer, ligesom i kommandoprompten, kan kommandoer skrives på én linje, adskilt med semikolon. Men hvis man skriver kommandoer på forskellige linjer, er filen lettere at læse. Uanset hvad vil shell'en behandle dem.
Indstilling af tilladelser for scriptfilen
Gem filen og giv den navnet myscript, og arbejdet med at oprette bash-scriptet er næsten færdigt. Nu er der kun tilbage at gøre denne fil eksekverbar, ellers vil du støde på en fejl, når du prøver at køre den. Adgang nægtet.

Forsøg på at køre scriptfilen med forkert indstillede tilladelser
Lad os gøre filen eksekverbar:
chmod +x .\/myscriptNu prøver vi at udføre den:
.\/myscriptEfter indstillingen af tilladelserne fungerer alt som det skal.

Succesfuld kørsel af bash-script
Udskrivning af meddelelser
Til at udskrive tekst i Linux-konsollen bruges kommandoen echo. Lad os bruge denne viden og redigere vores script ved at tilføje forklaringer til dataene, der allerede er genereret af de eksisterende kommandoer i det:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiSådan ser det ud efter kørsel af det opdaterede script.

Udskrivning af meddelelser fra scriptet
Nu kan vi udskrive forklarende tekster ved at bruge kommandoen echo. Hvis du ikke ved, hvordan du redigerer en fil ved hjælp af Linux-værktøjer, eller hvis du ikke tidligere har mødt kommandoen echo, så kig på materialet.
Brug af variabler
Variabler gør det muligt at gemme information i scriptfilen, for eksempel - resultaterne af kørslen af kommandoer til brug for andre kommandoer.
Der er ikke noget galt i at udføre enkelte kommandoer uden at gemme resultaterne, men mulighederne for denne tilgang er meget begrænsede.
Der findes to typer variabler, som kan anvendes i bash-scripts:
- Miljøvariabler
- Brugerdefinerede variabler
Miljøvariabler
Nogle gange i shell-kommandoer skal man arbejde med visse systemdata. Her er for eksempel, hvordan man viser den hjemlige mappe for den nuværende bruger:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Bemærk, at vi kan bruge systemvariablen $HOME i dobbelte citationstegn, det vil ikke forhindre systemet i at genkende den. Sådan ser det ud, hvis man udfører ovenstående script.

Brug af miljøvariabel i scriptet
Hvad hvis vi skal vise dollartegnet på skærmen? Lad os prøve sådan:
echo "I have $1 in my pocket" Systemet vil registrere dollartegnet i strengen, der er indhegnet i citationstegn, og beslutte, at vi har refereret til en variabel. Scriptet vil forsøge at vise værdien af den udefinerede variabel $1. Det er ikke det, vi ønsker. Hvad skal vi gøre?
I en sådan situation kan brugen af kontroll tegn, en omvendt skråstreg, før dollartegnet hjælpe:
echo "I have $1 in my pocket"Nu vil scriptet vise præcis det, som forventet.

Brug af kontrolsekvens til at vise dollartegnet
Brugerdefinerede variabler
Ud over miljøvariabler tillader bash-scripts også, at man definere og bruge egne variabler i scriptet. Sådanne variabler opbevarer værdien, indtil scriptet er færdigt med at køre.
Som med systemvariabler kan man referere til brugerdefinerede variabler ved at bruge dollartegnet:
TNW-CUS-FMP — rabatkoden på 10% på vores tjenester, tilgængelig for aktivering i 7 dage
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Sådan ser det ud efter kørsel af et sådant script.

Brugerdefinerede variabler i scriptet
Kommandoindsættelse
En af de mest nyttige funktioner i bash-scripts er muligheden for at hente information fra kommandoudgangen og tildele den til variabler, hvilket gør det muligt at bruge denne information hvor som helst i scriptfilen.
Dette kan gøres på to måder.
- Ved hjælp af det omvendte apostrof-tegn «`»
- Ved hjælp af konstruktionen
$()
Ved at bruge den første tilgang, skal du sikre dig, at du ikke indtaster en enkelt citationstegn i stedet for det omvendte apostrof. Kommandoen skal indkapsles i to sådanne tegn:
mydir=`pwd`Ved den anden tilgang skrives det samme sådan:
mydir=$(pwd)Og scriptet kan til sidst se sådan ud:
#!/bin/bash
mydir=$(pwd)
echo $mydir Under udførelsen vil udgangen af kommandoen pwdblive gemt i variablen mydir, hvis indhold, ved hjælp af kommandoen echo, vil blive sendt til konsollen.

Et script, der gemmer resultaterne af kommandoen i en variabel
Matematiske operationer
For performing mathematical operations in a script file, you can use a structure like $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Mathematical Operations in a Script
Control Structure if-then
In some scripts, it is necessary to control the flow of command execution. For example, if a certain value is greater than five, one action needs to be performed, otherwise — another. This applies in many situations, and here the control structure will help us. if-then. In its simplest form, it looks like this:
if command
then
commands
fiHere is a working example:
#!/bin/bash
if pwd
then
echo "It works"
fi In this case, if the execution of the command pwdis successful, the text "it works" will be displayed in the console.
Let’s use our existing knowledge and write a more complex script. Suppose, we need to find a certain user in /etc/passwd, and if the user is found, report that they exist.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiHere is what happens after running this script.

User Search
Here we used the command grepto search for a user in the file /etc/passwd. If the command grepis unfamiliar to you, its description can be found .
In this example, if the user is found, the script will display the corresponding message. But what if the user is not found? In this case, the script simply ends without informing us. We would like it to tell us that too, so let’s improve the code.
Control Structure if-then-else
To enable the program to report both successful search results and failures, we will use the structure if-then-else. Here’s how it works:
if command
then
commands
else
commands
fi If the first command returns zero, indicating its successful execution, the condition will be true, and execution will not go down the branch ellers. Otherwise, if something other than zero is returned, indicating a failure or a false result, the commands following ellers.
will be executed.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Let’s write a script like this: ellers.

Running the Script with if-then-else Structure
Lad os fortsætte og stille spørgsmålet om mere komplekse betingelser. Hvad hvis vi skal tjekke ikke én, men flere betingelser? For eksempel, hvis den ønskede bruger findes, skal vi vise én besked, hvis en anden betingelse er opfyldt — en anden besked, og så videre. I sådan en situation kan indlejrede betingelser hjælpe os. Det ser sådan ud:
if kommando1
then
kommandoer
elif kommando2
then
kommandoer
fi Hvis den første kommando returnerer nul, hvilket indikerer, at den er udført med succes, udføres kommandoerne i den første blok så, ellers, hvis den første betingelse viser sig at være falsk, og hvis den anden kommando returnerer nul, udføres den anden blok kode.
#!/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 et sådan script kan man for eksempel oprette en ny bruger med kommandoen useradd, hvis søgningen ikke gav resultater, eller gøre noget andet nyttigt.
Sammenligning af tal
I scripts kan du sammenligne numeriske værdier. Nedenfor er en liste over de relevante kommandoer.
n1 -eq n2Returnerer sandt, hvisn1er lig medn2.
n1 -ge n2Returnerer sandt, hvisn1større end eller lig medn2.
n1 -gt n2Returnerer sandt, hvisn1meren2.
n1 -le n2Returnerer sandt, hvisn1mindre end eller lig medn2.
n1 -lt n2Returnerer sandt, hvis n1 er mindre endn2.
n1 -ne n2Returnerer sandt, hvisn1ikke lig medn2.
Som et eksempel vil vi prøve en af sammenligningsoperatorerne. Vær opmærksom på, at udtrykket er indkapslet i firkantede parenteser.
#!/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"
fiDette er, hvad denne kommando vil vise.

Sammenligning af tal i scripts
Værdien af variablen val1større end 5, så udføres grenen såaf sammenligningsoperatoren, og den tilsvarende besked vises i konsollen.
Sammenligning af strenge
I scripts kan man også sammenligne strengværdier. Sammenligningsoperatorer ser ret enkle ud, men der er nogle specifikke egenskaber ved sammenligning af strenge, som vi vil berøre nedenfor. Her er en liste over operatorerne.
str1 = str2Tjekker, om strenge er ens, returnerer sandt, hvis strenge er identiske.
sstr1 != str2Returnerer sandt, hvis strenge ikke er identiske.
str1 < str2Returnerer sandt, hvisstr1er mindre endstr2.
str1 > str2Returnerer sandt, hvisstr1større endstr2.
-n str1Returnerer sandt, hvis længdenstr1er større end nul.
-z str1Returnerer sandt, hvis længdenstr1er lig med nul.
Her er et eksempel på sammenligning af strenge i et script:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiSom resultat af scriptets udførelse får vi følgende.

Sammenligning af strenge i scripts
Der er en særlig funktion ved sammenligning af strenge, som er værd at nævne. Nemlig, operatørerne „>“ og „“ som en kommando til at omdirigere output.
Her er, hvordan arbejdet med disse operatører ser ud 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"
fiHer er resultaterne af scriptets arbejde.

Sammenligning af strenge, advarsel blev udskrevet
Bemærk, at scriptet, selvom det kører, giver en advarsel:
. /myscript: linje 5: [: for mange argumenter For at slippe af med denne advarsel, lad os indkapsle $val2 i dobbelte citationstegn:
#!/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 fungerer alt som det skal.

Sammenligning af strenge
En anden funktion ved operatørerne „>“ og „<“ er, hvordan de arbejder med tegn i store og små bogstaver. For at forstå denne funktion, lad os forberede en tekstfil med følgende indhold:
Likegeeks
likegeeks Lad os gemme den med navnet myfile, hvorefter vi udfører denne kommando i terminalen:
sort myfileDet vil sortere linjerne fra filen sådan:
likegeeks
Likegeeks Kommandoen sort, som standard sorterer det linjer i stigende orden, hvilket betyder, at et lille bogstav i vores eksempel er mindre end et stort bogstav. Lad os nu forberede et script, der vil sammenligne de samme strenge:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiHvis det køres, viser det sig, at alt er omvendt — det lille bogstav er nu større end det store bogstav.

Sortering kommandoen og sammenligning af strenge i scriptet
I sammenligningskommandoerne er store bogstaver mindre end små bogstaver. Sammenligning af strenge udføres her ved at sammenligne ASCII-koderne for tegnene, rækkefølgen af sorteringen afhænger således af koderne for tegnene.
Kommandoen sort, som på sin side bruger den rækkefølge, der er angivet i systemets sprogindstillinger.
Filkontroller
Formentlig er nedenstående kommandoer de mest anvendte i bash-scripts. De muliggør kontrol af forskellige betingelser vedrørende filer. Her er listen over disse kommandoer.
-d filKontrollerer, om filen eksisterer, og om den er en mappe.
-e filKontrollerer, om filen eksisterer.
-f filKontrollerer, om filen eksisterer, og om den er en fil.
-r filKontrollerer, om filen eksisterer, og om den er tilgængelig for læsning.
-s filKontrollerer, om filen eksisterer, og om den ikke er tom.
-w filKontrollerer, om filen eksisterer, og om den er skrivbar.
-x filKontrollerer, om filen eksisterer, og om den er eksekverbar.
file1 -nt file2Tjekker om det er nyere endfile1, endfile2.
file1 -ot file2Tjekker om det er ældre endfile1, endfile2.
-O filTjekker om filen eksisterer, og om den nuværende bruger er ejer af den.
-G filTjekker om filen eksisterer, og om dens gruppe-ID svarer til den nuværende brugers gruppe-ID.
Disse kommandoer, ligesom mange andre vi har set i dag, er ikke svære at huske. Deres navne, som er forkortelser af forskellige ord, angiver direkte de kontroller, de udfører.
Lad os prøve en af kommandoerne i praksis:
#!/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"
fiDette script vil for en eksisterende mappe vise dens indhold.

Visning af indholdet af mappen
Vi antager, at du vil kunne eksperimentere med de øvrige kommandoer på egen hånd, da de alle anvendes efter samme princip.
Resumé
I dag har vi fortalt om, hvordan man kan begynde at skrive bash-scripts og set nogle grundlæggende ting. Emnet bash-programmering er faktisk enormt. Denne artikel er en oversættelse af den første del af en stor serie på 11 materialer. Hvis du ønsker at fortsætte lige nu – her er listen over de originale materialer. For nemheds skyld er den, du lige har læst, også inkluderet.
- – her handler det om, hvordan man begynder at skabe bash-scripts, det berører brugen af variabler, beskriver betingede konstruktioner, beregninger, sammenligninger af tal og strenge, samt indhentning af oplysninger om filer.
- – her udforskes detaljerne om arbejdet med for- og while-løkker.
- – dette materiale er dedikeret til kommandolinjens parametre og nøgler, som kan overføres til scripts, samt arbejdet med data indtastet af brugeren og som kan læses fra filer.
- – her handler det om filbeskrivere og hvordan man arbejder med dem, samt input-, output- og fejlstrømme, og om omdirigering af output.
- – dette materiale handler om Linux-signaler, deres behandling i scripts og om at køre scripts efter en tidsplan.
- – her kan man lære om oprettelse og brug af funktioner i scripts og om udvikling af biblioteker.
- – denne artikel omhandler arbejdet med tekstbehandleren sed.
- – dette materiale handler om programmering med databehandlingssproget awk.
- — her kan du læse om brugen af regulære udtryk i bash-scripts.
- — her præsenteres teknikker til at arbejde med meddelelser, der kan sendes til brugere, samt metoden til at overvåge disk.
- — dette materiale er dedikeret til værktøjet Expect, som gør det muligt at automatisere interaktionen med interaktive værktøjer. Især handler det om expect-scripts og deres interaktion med bash-scripts og andre programmer.
Vi mener, at en af de værdifulde egenskaber ved denne artikelserie er, at den, startende fra det mest enkle, som er velegnet til brugere på alle niveauer, gradvist fører til tematikker af mere seriøs karakter og giver alle interesserede mulighed for at avancere i at skabe kommandolinjescripts i Linux.
Kære læsere! Vi beder bash-programmeringsguderne om at fortælle, hvordan de har nået toppen af deres færdigheder, dele hemmeligheder, og vi ser frem til indtryk fra dem, der lige har skrevet deres første script.
Kun registrerede brugere kan deltage i undersøgelsen. , please.
Skaffer vi de andre dele af artikelserien?
Ja!
Nej, det er ikke nødvendigt
1030 brugere stemte. 106 brugere undlod at stemme.
Kilde: habr.com
