Bash-scripts: start

Bash-scripts: start
Bash-scripts, del 2: løkker
Bash-scripts, del 3: parametre og kommandolinjealternativer
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 skal vi tale om bash-scripts. Det er — kommandolinjescripts, skrevet til bash-skallen. Der findes også andre skaller, såsom — zsh, tcsh, ksh, men vi vil fokusere på bash. Dette materiale er beregnet til alle, der ønsker at lære, den eneste betingelse er at kunne arbejde i kommandolinjen Linux.

Bash-scripts: start

Kommandolinjescripts er sæt af de samme kommandoer, som kan indtastes via tastaturet, samlet i filer og forbundet af et fælles mål. Resultaterne af kommandoerne kan have selvstændig værdi eller fungere som input til andre kommandoer. Scripts er en kraftfuld måde at automatisere ofte udførte handlinger på.

Bash-scripts: start

Så, hvad angår kommandolinjen, giver den mulighed for at udføre flere kommandoer på én gang ved at indtaste dem med et semikolon:

pwd ; whoami

Hvis du har prøvet dette i din terminal, er dit første bash-script, der involverer to kommandoer, allerede skrevet. Det fungerer sådan her. Først pwd viser kommandoen information om den nuværende arbejdsmappe, og derefter viser kommandoenwhoami

data om brugeren, som du er logget ind som.

getconf ARG_MAX

Ved at bruge denne tilgang kan du kombinere så mange kommandoer som ønskes i én linje, begrænsningen er kun det maksimale antal argumenter, der kan overføres 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 vi skriver et sæt kommandoer i en fil og blot kalder denne fil for at udføre dem? Den fil, vi taler om, kaldes faktisk et kommandolinjescript.

Sådan fungerer bash-scripts Opret en tom fil med kommandoenI den første linje skal du angive, hvilken shell vi planlægger at bruge. Vi er interesserede i bash, derfor vil den første linje i filen være sådan her:

#!/bin/bash

I de andre linjer i denne fil bruges hash-tegnet til at angive kommentarer, som shell'en ikke behandler. Dog er den første linje et særligt tilfælde, hvor hash-tegnet efterfølges af et udråbstegn (denne sekvens kaldes shebang) og stien til bash, angiver til systemet, at scriptet er oprettet specifikt til bash.

Shell-kommandoer adskilles med en linjeskift, kommentarer fremhæves med hash-tegn. Sådan ser det ud:

#!/bin/bash
# This is a comment
pwd
whoami

Her, ligesom i kommandolinjen, kan du skrive kommandoer på én linje adskilt af semikolon. Men hvis du skriver kommandoer på forskellige linjer, er filen lettere at læse. Under alle omstændigheder vil shell'en behandle dem.

Indstilling af tilladelser for scriptet

Gem filen med navnet myscript, og arbejdet med at oprette bash-scriptet er næsten færdigt. Nu er det kun tilbage at gøre denne fil eksekverbar, ellers vil du støde på en fejl, når du forsøger at køre den Permission denied.

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

Lad os gøre filen eksekverbar:

chmod +x ./myscript

Nu prøver vi at udføre det:

./myscript

Efter indstilling af tilladelser fungerer alt som det skal.

Bash-scripts: start
Succesfuld kørsel af bash-script

Udskrivning af meddelelser

For at udskrive tekst til konsollen i Linux bruges kommandoen echo. Lad os bruge denne viden til at redigere vores script ved at tilføje forklaringer til de data, som de eksisterende kommandoer allerede udskriver:

#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami

Her er hvad der vil ske efter kørsel af det opdaterede script.

Bash-scripts: start
Udskrivning af meddelelser fra scriptet

Nu kan vi udskrive forklarende tekst ved at bruge kommandoen echo. Hvis du ikke ved, hvordan man redigerer en fil ved hjælp af Linux-værktøjer, eller aldrig har stødt på kommandoen echo, se venligst på denne materiale.

Brug af variable

Variabler gør det muligt at gemme information i scriptet, f.eks. - resultaterne af kommandoer til brug for andre kommandoer.

Der er ikke noget galt i at køre enkelte kommandoer uden at gemme resultaterne af deres arbejde, men mulighederne ved denne tilgang er meget begrænsede.

Der findes to typer variabler, som kan bruges i bash-scripts:

  • Miljøvariabler
  • Brugerdefinerede variabler

Miljøvariabler

Nogle gange skal man i shell-kommandoer arbejde med visse systemdata. Her er for eksempel, hvordan man kan udskrive hjemmebiblioteket 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 forhindrer ikke systemet i at genkende den. Her er hvad der sker, hvis vi udfører det ovenstående script.

Bash-scripts: start
Brug af miljøvariabel i script

Hvad hvis vi skal udskrive dollar-tegnet på skærmen? Lad os prøve som følger:

echo "I have $1 in my pocket"

Systemet vil opdage dollar-tegnet i strengen, der er indkapslet i citationstegnene, og konkludere, at vi henviser til en variabel. Scriptet vil forsøge at udskrive værdien af en udefineret variabel $1. Det er ikke, hvad vi ønsker. Hvad skal vi gøre?

I en sådan situation kan vi bruge kontroltegnet, den omvendte skråstreg, før dollar-tegnet:

echo "I have $1 in my pocket"

Nu vil scriptet udskrive præcis det, vi forventer.

Bash-scripts: start
Brug af escape-sekvens til at udskrive dollar-tegnet

Brugerdefinerede variabler

Ud over miljøvariabler tillader bash-scripts at definere og bruge egne variabler i scripts. Sådanne variabler gemmer værdien, indtil scriptets kørsel er afsluttet.

Ligesom med systemvariabler kan brugerdefinerede variabler tilgås ved at bruge dollar-tegnet:
TNW-CUS-FMP — rabatkoden til 10% rabat 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"

Her er, hvad der sker efter at have kørt et sådant script.

Bash-scripts: start
Brugerdefinerede variabler i scripts

Kommando substitution

En af de mest nyttige funktioner i bash-scripts er muligheden for at udtrække information fra output af kommandoer og tildele det 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 at bruge tegnene for omvendt apostrof «`»
  • Ved at bruge konstruktionen $()

Når man bruger den første tilgang, skal man sørge for ikke at indtaste en enkelt apostrof i stedet for omvendt apostrof. Kommandoen skal indkapsles i to sådanne tegn:

mydir=`pwd`

Ved den anden tilgang skrives det på samme måde som:

mydir=$(pwd)

Og scriptet kan til sidst se således ud:

#!/bin/bash
mydir=$(pwd)
echo $mydir

Under udførelsen vil output fra kommandoen pwdblive gemt i variablen mydir, hvis indhold vil, ved hjælp af kommandoen echo, blive sendt til konsollen.

Bash-scripts: start
Script der gemmer resultaterne af en kommando i en variabel

Matematiske operationer

For mathematical operations in the script file, you can use a construction like $((a+b)):

#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2

Bash-scripts: start
Mathematical operations in the 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 must be performed; otherwise, another action must be taken. This is applicable in many situations, and here we can use the control structure 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 output to the console.

Let’s use our existing knowledge and write a more complex script. Let’s say we need to find a certain user in /etc/passwd, and if we manage to find them, notify that they exist.

#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi

Here’s 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 output a corresponding message. But what if the user could not be found? In this case, the script will simply terminate without notifying us. We would like it to tell us about this too, so let’s enhance the code.

Control structure if-then-else

To enable the program to report both successful searches and failures, we will use the construction if-then-else. Here’s how it works:

if command
then
commands
else
commands
fi

If the first command returns zero, which indicates its successful execution, the condition will be true, and execution will not go down the path ellers. Otherwise, if something different from zero is returned, indicating failure or a false result, the commands located after 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 such a script: ellers.

Bash-scripts: start
Execution followed the path

Lad os fortsætte og stille spørgsmålet om mere komplekse betingelser. Hvad hvis vi skal tjekke ikke én betingelse, men flere? For eksempel, hvis den ønskede bruger er fundet, skal der vises en besked; hvis en anden betingelse også er opfyldt, så en anden besked, og så videre. I sådanne situationer kan vi bruge indlejrede betingelser. 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 korrekt, vil kommandoerne i den første blok blive udført. så, ellers, hvis den første betingelse er falsk, og hvis den anden kommando returnerer nul, udføres den anden kodeblok.

#!/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ådant script kan du 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 man sammenligne numeriske værdier. Nedenfor er en liste over de relevante kommandoer.

n1 -eq n2Returnerer sand, hvis n1 er lig med n2.
n1 -ge n2 Returnerer sand, hvis n1større end eller lig med n2.
n1 -gt n2Returnerer sand, hvis n1 mere n2.
n1 -le n2Returnerer sand, hvis n1mindre end eller lig med n2.
n1 -lt n2Returnerer sand, hvis n1 er mindre end n2.
n1 -ne n2Returnerer sand, hvis n1forskellig fra n2.

Som et eksempel prøver vi en af sammenligningsoperatorerne. Bemærk, 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

Her er, hvad denne kommando vil returnere.

Bash-scripts: start
Sammenligning af tal i scripts

Værdien af variablen val1større end 5, hvilket resulterer i, at sammenligningsgrenen udføres, og den relevante besked vises i konsollen. såSammenligning af strenge

I scripts kan man også sammenligne strenge. Sammenligningsoperatorerne ser ret enkle ud, men der er visse særlige forhold ved strengesammenligninger, som vi vil dække nedenfor. Her er listen over operatorer.

str1 = str2

Tjekker om strenge er ens; returnerer sand, hvis strenge er identiske. tr1 != str2
sReturnerer sand, hvis strenge ikke er identiske.str1 < str2
Returnerer sand, hvisstr1 er mindre endstr2 str1 > str2.
større end str1 er mindre end-n str1 str1 > str2.
Returnerer sand, hvis længden er større end nul. er mindre end-z str1
er lig med nul.er større end nul. er mindre endHer er et eksempel på strengesammenligning i et script:

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

#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fi

Sammenligning af strenge i scripts

Bash-scripts: start
Сравнение строк в скриптах

Her er et særligt aspekt ved sammenligning af strenge, som det er værd at nævne. Det vil sige, at operatorerne ">" og " " som en kommando til at omdirigere output.

Sådan ser arbejdet med disse operatorer 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 kørsel.

Bash-scripts: start
Sammenligning af strenge, advarslen blev vist

Bemærk, at scriptet, selvom det kører, giver en advarsel:

./myscript: linje 5: [: for mange argumenter

For at slippe af med denne advarsel, skal vi placere $val2 i anførselstegn:

#!/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
I scripts kan man også sammenligne strenge. Sammenligningsoperatorerne ser ret enkle ud, men der er visse særlige forhold ved strengesammenligninger, som vi vil dække nedenfor. Her er listen over operatorer.

En anden egenskab ved operatorerne ">" og "<" er, hvordan de arbejder med store og små bogstaver. For at forstå denne egenskab, forbereder vi en tekstfil med følgende indhold:

Likegeeks
likegeeks

Vi gemmer den og giver den navnet myfile, hvorefter vi kører følgende kommando i terminalen:

sort myfile

Den vil sortere linjerne i filen som følger:

likegeeks
Likegeeks

Kommandoen sort, som standard sorterer den linjer stigende, hvilket betyder, at den lille bogstav i vores eksempel er mindre end det store. Nu forbereder vi 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, vil det vise sig, at alt er omvendt - den lille bogstav er nu større end den store.

Bash-scripts: start
Sort kommandoen og sammenligning af strenge i scriptet

I sammenligningskommandoerne er store bogstaver mindre end små bogstaver. Strengesammenligning sker her ved at sammenligne ASCII-koderne for tegnene, og sorteringsrækkefølgen afhænger dermed af tegnkoderne.

Kommandoen sort, som igen bruger den sorteringsrækkefølge, der er angivet i systemets sprogindstillinger.

Filkontroller

Måske er de nedenstående kommandoer oftest anvendt i bash-scripts. De tillader kontrol af forskellige betingelser vedrørende filer. Her er en liste over disse kommandoer.

-d filTjekker, om filen eksisterer, og om den er en mappe.
-e filTjekker, om filen eksisterer.
-f fil Tjekker, om filen eksisterer, og om den er en fil.
-r filTjekker, om filen eksisterer, og om den er tilgængelig for læsning.
-s filTjekker, om filen eksisterer, og om den ikke er tom.
-w filTjekker, om filen eksisterer, og om den er tilgængelig for skrivning.
-x filTjekker, om filen eksisterer, og om den er eksekverbar.
file1 -nt file2 Kontrollerer, om den er nyere end file1, end file2.
file1 -ot file2Kontrollerer, om den er ældre end file1, end file2.
-O fil Kontrollerer, om filen eksisterer, og om den nuværende bruger er ejer af den.
-G filKontrollerer, om filen eksisterer, og om dens gruppe-ID matcher den nuværende brugers gruppe-ID.

Disse kommandoer, ligesom mange andre, vi har drøftet i dag, er lette at huske. Deres navne, som er forkortelser for forskellige ord, angiver klart 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, for en eksisterende mappe, vil udskrive dens indhold.

Bash-scripts: start
Udskrivning af indholdet af mappen

Vi antager, at du selv kan eksperimentere med de øvrige kommandoer, da de anvendes efter samme princip.

Resumé

I dag har vi fortalt om, hvordan man begynder at skrive bash-scripts og gennemgået nogle grundlæggende ting. Emnet bash-programmering er faktisk meget omfattende. Denne artikel er en oversættelse af 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, som du lige har læst, også inkluderet her.

  1. Bash Script Trin for Trin — her handler det om, hvordan man starter med at oprette bash-scripts, brugen af variabler, beskrivelse af betingede konstruktioner, beregninger, sammenligninger af tal og strenge, og om at hente 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 & options — dette materiale omhandler kommandolinjeparametre og nøgler, der kan sendes til scripts, samt arbejde med data, som brugeren indtaster, og som kan læses fra filer.
  4. Bash Scripting Del 4, Input & Output — her handler det om filbeskrivere og arbejdet med dem, inddata- og uddata-strømme, fejl, samt om videresendelse af output.
  5. Bash Scripting Del 5, Signal & Jobs — dette materiale handler om Linux-signaler, deres håndtering i scripts, og planlægning af scenarier.
  6. Bash Scripting Del 6, Funktioner — her kan man lære om oprettelse og brug af funktioner i scripts, samt udvikling af biblioteker.
  7. Bash Scripting Del 7, Bruger sed — denne artikel handler om arbejdet med den streamede teksteditor sed.
  8. Bash Scripting Del 8, Bruger awk — dette materiale handler om programmering i databehandlingssproget awk.
  9. Bash Scripting Del 9, Regulerede Udtryk — 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, som kan sendes til brugerne, samt metoder til overvågning af disk.
  11. Bash Scripting Del 11, Expect Command — dette materiale er dedikeret til værktøjet Expect, som kan automatisere interaktionen med interaktive værktøjer. Især diskuteres 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, som starter med de mest enkle emner, der er tilgængelige for brugere på alle niveauer, gradvist fører til ret alvorlige emner, hvilket giver alle, der ønsker det, en chance for at avancere inden for oprettelse af Linux kommandoliniescripts.

Kære læsere! Vi beder guruerne indenfor bash-programmering om at dele deres rejse til topniveau, afsløre hemmeligheder, og fra dem, der netop har skrevet deres første script, venter vi på indtryk.

Bash-scripts: start

Kun registrerede brugere kan deltage i undersøgelsen. Log ind, please.

Skal vi oversætte de andre dele af artikelserien?

  • Ja!

  • Nej, det er ikke nødvendigt

1030 brugere har stemt. 106 brugere har undladt 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