Bash-scripts: start

Bash-scripts: start
Bash-scripts, del 2: loops
Bash-scripts, del 3: parametre og kommandolinjeindstillinger
Bash-scripts, del 4: input og output
Bash-scripts, del 5: signaler, baggrundsopgaver, scriptstyring
Bash-scripts, del 6: funktioner og udvikling af biblioteker
Bash-scripts, del 7: sed og tekstbehandling
Bash-scripts, del 8: databehandlingssproget awk
Bash-scripts, del 9: regulære udtryk
Bash-scripts, del 10: praktiske eksempler
Bash-scripts, del 11: expect og automatisering af interaktive værktøjer

I dag vil vi tale om bash-scripts. Det er - kommandolinjescripts, 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 kommandolinjen i Linux.

Bash-scripts: start

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å.

Bash-scripts: start

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_MAX

Ved 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 shebang) 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
whoami

Her, 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.

Bash-scripts: start
Forsøg på at køre scriptfilen med forkert indstillede tilladelser

Lad os gøre filen eksekverbar:

chmod +x .\/myscript

Nu prøver vi at udføre den:

.\/myscript

Efter indstillingen af tilladelserne fungerer alt som det skal.

Bash-scripts: start
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:"
whoami

Sådan ser det ud efter kørsel af det opdaterede script.

Bash-scripts: start
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å denne 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.

Bash-scripts: start
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.

Bash-scripts: start
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.

Bash-scripts: start
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.

Bash-scripts: start
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

Bash-scripts: start
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
fi

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

Here is what happens after running this script.

Bash-scripts: start
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 her.

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.

Bash-scripts: start
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, hvis n1 er lig med n2.
n1 -ge n2 Returnerer sandt, hvis n1større end eller lig med n2.
n1 -gt n2Returnerer sandt, hvis n1 mere n2.
n1 -le n2Returnerer sandt, hvis n1mindre end eller lig med n2.
n1 -lt n2Returnerer sandt, hvis n1 er mindre end n2.
n1 -ne n2Returnerer sandt, hvis n1ikke lig med n2.

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

Dette er, hvad denne kommando vil vise.

Bash-scripts: start
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 = str2 Tjekker, om strenge er ens, returnerer sandt, hvis strenge er identiske.
sstr1 != str2Returnerer sandt, hvis strenge ikke er identiske.
str1 < str2Returnerer sandt, hvis str1er mindre end str2.
str1 > str2 Returnerer sandt, hvis str1større end str2.
-n str1 Returnerer sandt, hvis længden str1er større end nul.
-z str1Returnerer sandt, hvis længden str1er 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"
fi

Som resultat af scriptets udførelse får vi følgende.

Bash-scripts: start
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"
fi

Her er resultaterne af scriptets arbejde.

Bash-scripts: start
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"
fi

Nu fungerer alt som det skal.

Bash-scripts: start
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 myfile

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

Hvis det køres, viser det sig, at alt er omvendt — det lille bogstav er nu større end det store bogstav.

Bash-scripts: start
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 fil Kontrollerer, 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 file2 Tjekker om det er nyere end file1, end file2.
file1 -ot file2Tjekker om det er ældre end file1, end file2.
-O fil Tjekker 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"
fi

Dette script vil for en eksisterende mappe vise dens indhold.

Bash-scripts: start
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.

  1. Bash Script Trin For Trin – 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.
  2. Bash Scripting Del 2, Bash the awesome – her udforskes detaljerne om arbejdet med for- og while-løkker.
  3. Bash Scripting Del 3, Parametre & muligheder – 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.
  4. Bash Scripting Del 4, Inddata & output – her handler det om filbeskrivere og hvordan man arbejder med dem, samt input-, output- og fejlstrømme, og om omdirigering af output.
  5. Bash Scripting Del 5, Signaler & Job – dette materiale handler om Linux-signaler, deres behandling i scripts og om at køre scripts efter en tidsplan.
  6. Bash Scripting Del 6, Funktioner – her kan man lære om oprettelse og brug af funktioner i scripts og om udvikling af biblioteker.
  7. Bash Scripting Del 7, Brug af sed – denne artikel omhandler arbejdet med tekstbehandleren sed.
  8. Bash Scripting Del 8, Brug af awk – dette materiale handler om programmering med databehandlingssproget awk.
  9. Bash Scripting Del 9, Regulære Udsagn — her kan du læse om brugen af regulære udtryk i bash-scripts.
  10. Bash Scripting Del 10, Praktiske Eksempler — her præsenteres teknikker til at arbejde med meddelelser, der kan sendes til brugere, samt metoden til at overvåge disk.
  11. Bash Scripting Del 11, Expect Command — 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.

Bash-scripts: start

Kun registrerede brugere kan deltage i undersøgelsen. Log ind, 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

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster