Bash scripts: begyndelsen

Bash scripts: begyndelsen
Bash Scripts Del 2: Loops
Bash Scripts, del 3: Kommandolinjeindstillinger og kontakter
Bash Scripts Del 4: Input og Output
Bash Scripts, del 5: Signaler, baggrundsopgaver, scripthåndtering
Bash Scripts, del 6: Funktioner og biblioteksudvikling
Bash Scripts, del 7: sed og tekstbehandling
Bash scripts, del 8: awk databehandlingssprog
Bash Scripts Del 9: Regulære udtryk
Bash Scripts Del 10: Praktiske eksempler
Bash-scripts, del 11: Forvent og automatisering af interaktive hjælpeprogrammer

I dag vil vi tale om bash-scripts. Det her - kommandolinjescripts, skrevet til bash-skallen. Der er andre skaller såsom zsh, tcsh, ksh, men vi vil fokusere på bash. Dette materiale er beregnet til alle, den eneste betingelse er evnen til at arbejde i kommandolinje Linux.

Bash scripts: begyndelsen

Kommandolinjescripts er samlinger af de samme kommandoer, som kan indtastes fra tastaturet, samles i filer og forenes med et fælles formål. I dette tilfælde kan resultaterne af teams arbejde enten være af selvstændig værdi eller tjene som inputdata for andre teams. Scripts er en effektiv måde at automatisere hyppigt udførte handlinger.

Bash scripts: begyndelsen

Så hvis vi taler om kommandolinjen, giver den dig mulighed for at udføre flere kommandoer på én gang ved at indtaste dem adskilt af et semikolon:

pwd ; whoami

Faktisk, hvis du prøvede dette i din terminal, er dit første bash-script, der involverer to kommandoer, allerede blevet skrevet. Det fungerer sådan her. Hold først pwd viser information om den aktuelle arbejdsmappe, derefter kommandoen whoamiviser information om den bruger du er logget ind som.

Ved at bruge denne tilgang kan du kombinere så mange kommandoer som du vil på én linje, den eneste grænse er det maksimale antal argumenter, der kan sendes til programmet. Du kan definere denne grænse ved at bruge følgende kommando:

getconf ARG_MAX

Kommandolinjen er et fantastisk værktøj, men du skal indtaste kommandoer i den, hver gang du har brug for dem. Hvad hvis vi skrev et sæt kommandoer ind i en fil og blot kaldte den fil for at udføre dem? Faktisk kaldes filen vi taler om et kommandolinjescript.

Sådan fungerer bash-scripts

Opret en tom fil ved hjælp af kommandoen touch. Dens første linje skal angive, hvilken shell vi skal bruge. Vi er interesserede i bash, så den første linje i filen vil være:

#!/bin/bash

Andre linjer i denne fil bruger hash-symbolet til at indikere kommentarer, som skallen ikke behandler. Men den første linje er et specialtilfælde, der er en hash efterfulgt af et udråbstegn (denne sekvens kaldes shebang) og vejen til bash, indikere til systemet, som scriptet blev oprettet specifikt til bash.

Shell-kommandoer er adskilt af et linjefeed, kommentarer adskilles af et hash-tegn. Sådan ser det ud:

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

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

Indstilling af scriptfiltilladelser

Gem filen, giv den et navn myscript, og arbejdet med at skabe bash-scriptet er næsten færdigt. Nu er der kun tilbage at gøre denne fil eksekverbar, ellers, hvis du prøver at køre den, vil du støde på en fejl Permission denied.

Bash scripts: begyndelsen
Forsøg på at køre en scriptfil med forkert konfigurerede tilladelser

Lad os gøre filen eksekverbar:

chmod +x ./myscript

Lad os nu prøve at udføre det:

./myscript

Efter indstilling af tilladelserne fungerer alt, som det skal.

Bash scripts: begyndelsen
Bash-scriptet blev kørt

Besked output

Brug kommandoen for at udlæse tekst til Linux-konsollen echo. Lad os bruge viden om denne kendsgerning og redigere vores script og tilføje forklaringer til de data, der udlæses af kommandoerne, der allerede er i det:

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

Dette er, hvad der sker efter at have kørt det opdaterede script.

Bash scripts: begyndelsen
Udskrive beskeder fra et script

Nu kan vi vise forklarende noter ved hjælp af kommandoen echo. Hvis du ikke ved, hvordan du redigerer en fil ved hjælp af Linux-værktøjer, eller du ikke har set kommandoen før echo, se på dette materiale.

Brug af variabler

Variabler giver dig mulighed for at gemme information i en scriptfil, såsom resultaterne af kommandoer, til brug for andre kommandoer.

Der er intet galt med at udføre individuelle kommandoer uden at gemme deres resultater, men denne tilgang er ret begrænset i sine muligheder.

Der er to typer variabler, der kan bruges i bash-scripts:

  • miljøvariabler
  • Brugervariabler

miljøvariabler

Nogle gange skal shell-kommandoer arbejde med nogle systemdata. Her er et eksempel på, hvordan man viser den aktuelle brugers hjemmemappe:

#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"

Bemærk venligst, at vi kan bruge en systemvariabel $HOME i dobbelte anførselstegn vil dette ikke forhindre systemet i at genkende det. Dette er, hvad du får, hvis du kører ovenstående scenarie.

Bash scripts: begyndelsen
Brug af en miljøvariabel i et script

Hvad hvis du har brug for at vise et dollartegn på skærmen? Lad os prøve dette:

echo "I have $1 in my pocket"

Systemet vil registrere et dollartegn i en citeret streng og antage, at vi har refereret til en variabel. Scriptet vil forsøge at vise værdien af ​​en udefineret variabel $1. Det er ikke det, vi har brug for. Hvad skal man gøre?

I denne situation vil brug af escape-karakteren, en omvendt skråstreg, før dollartegnet hjælpe:

echo "I have $1 in my pocket"

Scriptet vil nu udlæse nøjagtigt, hvad der forventes.

Bash scripts: begyndelsen
Brug af en escape-sekvens til at udskrive et dollartegn

Brugervariabler

Ud over miljøvariabler giver bash-scripts dig mulighed for at definere og bruge dine egne variabler i scriptet. Sådanne variable holder en værdi, indtil scriptet fuldfører eksekveringen.

Som med systemvariabler kan brugervariabler tilgås ved hjælp af dollartegnet:
TNW-CUS-FMP - kampagnekode til 10% rabat på vores tjenester, tilgængelig til aktivering inden for 7 dage

#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"

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

Bash scripts: begyndelsen
Brugerdefinerede variabler i et script

Kommandoerstatning

En af de mest nyttige funktioner ved bash-scripts er evnen til at udtrække information fra kommando-output og tildele den til variabler, så du kan bruge denne information hvor som helst i script-filen.

Dette kan gøres på to måder.

  • Brug af backtikken "`"
  • Af design $()

Når du bruger den første tilgang, skal du passe på ikke at inkludere et enkelt anførselstegn i stedet for backtick. Kommandoen skal være omgivet af to sådanne ikoner:

mydir=`pwd`

I den anden tilgang er det samme skrevet sådan:

mydir=$(pwd)

Og scriptet kan ende med at se sådan ud:

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

Under dens drift, outputtet af kommandoen pwdvil blive gemt i en variabel mydir, hvis indhold ved hjælp af kommandoen echo, vil gå til konsollen.

Bash scripts: begyndelsen
Et script, der gemmer resultaterne af en kommando i en variabel

Matematiske operationer

For at udføre matematiske operationer i en scriptfil kan du bruge en konstruktion som f.eks $((a+b)):

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

Bash scripts: begyndelsen
Matematiske operationer i et script

hvis-så kontrolkonstruktion

I nogle scenarier skal du kontrollere strømmen af ​​kommandoudførelse. For eksempel, hvis en bestemt værdi er større end fem, skal du udføre én handling, ellers en anden. Dette er anvendeligt i mange situationer, og her vil kontrolstrukturen hjælpe os if-then. I sin enkleste form ser det sådan ud:

if команда
then
команды
fi

Her er et fungerende eksempel:

#!/bin/bash
if pwd
then
echo "It works"
fi

I dette tilfælde, hvis kommandoen udføres pwdvil fuldføres, vil teksten "det virker" blive vist i konsollen.

Lad os bruge den viden, vi har, og skrive et mere komplekst manuskript. Lad os sige, at vi skal finde en bestemt bruger i /etc/passwd, og hvis det lykkedes dig at finde det, så rapporter at det eksisterer.

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

Dette er, hvad der sker efter at have kørt dette script.

Bash scripts: begyndelsen
Brugersøgning

Her brugte vi kommandoen grepfor at søge efter en bruger i en fil /etc/passwd. Hvis holdet grepukendt for dig, kan dens beskrivelse findes her.

I dette eksempel, hvis brugeren er fundet, vil scriptet vise en tilsvarende besked. Hvad hvis brugeren ikke kunne findes? I dette tilfælde vil scriptet simpelthen fuldføre eksekveringen uden at fortælle os noget. Vi vil gerne have, at han også fortæller os om dette, så vi vil forbedre koden.

hvis-så-ellers kontrolkonstruktion

For at programmet skal kunne rapportere både resultaterne af en vellykket søgning og fiasko, vil vi bruge konstruktionen if-then-else. Sådan fungerer det:

if команда
then
команды
else
команды
fi

Hvis den første kommando returnerer nul, hvilket betyder, at den blev udført med succes, vil betingelsen være sand, og udførelsen vil ikke fortsætte langs grenen else. Ellers, hvis noget andet end nul returneres, hvilket ville indikere fejl eller et falsk resultat, vil kommandoerne efter else.

Lad os skrive følgende script:

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi

Hans henrettelse gik i vasken else.

Bash scripts: begyndelsen
Kørsel af et script med en if-then-else-konstruktion

Nå, lad os gå videre og spørge os selv om mere komplekse forhold. Hvad hvis du ikke skal kontrollere én tilstand, men flere? For eksempel, hvis den ønskede bruger er fundet, skal en besked vises, hvis en anden betingelse er opfyldt, skal en anden besked vises, og så videre. I en sådan situation vil indlejrede forhold hjælpe os. Det ser sådan ud:

if команда1
then
команды
elif команда2
then
команды
fi

Hvis den første kommando returnerer nul, hvilket indikerer dens succesfulde udførelse, vil kommandoerne i den første blok blive udført thenellers, hvis den første betingelse er falsk, og hvis den anden kommando returnerer nul, vil den anden kodeblok blive udført.

#!/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 ved hjælp af kommandoen useradd, hvis søgningen ikke gav resultater, eller gør noget andet nyttigt.

Sammenligning af tal

I scripts kan du sammenligne numeriske værdier. Nedenfor er en liste over relevante kommandoer.

n1 -eq n2Returnerer sandt hvis n1 er n2.
n1 -ge n2 Returnerer sandt hvis n1mere eller lige n2.
n1 -gt n2Returnerer sandt hvis n1 mere end n2.
n1 -le n2Returnerer sandt hvis n1mindre eller lige n2.
n1 -lt n2Returnerer sand, hvis n1 er mindre end n2.
n1 -ne n2Returnerer sandt hvis n1ikke lige n2.

Lad os som et eksempel prøve en af ​​sammenligningsoperatørerne. Bemærk, at udtrykket er omgivet af 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 udsende.

Bash scripts: begyndelsen
Sammenligning af tal i scripts

Variabel værdi val1større end 5, ender grenen med at blive henrettet thensammenligningsoperatør, og en tilsvarende meddelelse vises i konsollen.

Streng sammenligning

Scripts kan også sammenligne strengværdier. Sammenligningsoperatorer ser ret enkle ud, men strengsammenligningsoperationer har visse funktioner, som vi vil berøre nedenfor. Her er en liste over operatører.

str1 = str2 Tester strenge for lighed og returnerer sand, hvis strengene er identiske.
str1 != str2Returnerer sand, hvis strengene ikke er identiske.
str1 < str2Returnerer sandt hvis str1Mindre end str2.
str1 > str2 Returnerer sandt hvis str1mere end str2.
-n str1 Returnerer sand, hvis længden str1Over nul.
-z str1Returnerer sand, hvis længden str1lig 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 et resultat af at udføre scriptet får vi følgende.

Bash scripts: begyndelsen
Sammenligning af strenge i scripts

Her er en funktion af strengsammenligning, der er værd at nævne. Nemlig ">" og "<" operatorerne skal escapes med en omvendt skråstreg, ellers vil scriptet ikke fungere korrekt, selvom der ikke kommer nogen fejlmeddelelser. Scriptet fortolker tegnet ">" som en output-omdirigeringskommando.

Sådan ser det ud at arbejde med disse operatører i kode:

#!/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 scriptet.

Bash scripts: begyndelsen
Strengesammenligning, advarsel givet

Bemærk venligst, at scriptet, selvom det er udført, udsender en advarsel:

./myscript: line 5: [: too many arguments

For at slippe af med denne advarsel konkluderer vi $val2 i dobbelte 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: begyndelsen
Streng sammenligning

En anden funktion ved operatorerne ">" og "<" er, hvordan de fungerer med store og små bogstaver. For at forstå denne funktion, lad os forberede en tekstfil med følgende indhold:

Likegeeks
likegeeks

Lad os gemme det ved at give det et navn myfile, kør derefter følgende kommando i terminalen:

sort myfile

Det vil sortere linjerne fra filen sådan her:

likegeeks
Likegeeks

Team sort, som standard, sorterer strenge i stigende rækkefølge, det vil sige, at det lille bogstav i vores eksempel er mindre end det store bogstav. Lad os nu forberede et script, der sammenligner 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 du kører det, viser det sig, at alt er omvendt - det lille bogstav er nu større end det store.

Bash scripts: begyndelsen
Sorteringskommandoen og sammenligning af strenge i en scriptfil

I sammenligningskommandoer er store bogstaver mindre end små bogstaver. Strengsammenligning her foretages ved at sammenligne karakterernes ASCII-koder, sorteringsrækkefølgen afhænger således af tegnkoderne.

Team sort, til gengæld bruger sorteringsrækkefølgen angivet i systemsprogindstillingerne.

Filtjek

Måske bruges følgende kommandoer oftest i bash-scripts. De giver dig mulighed for at kontrollere forskellige forhold vedrørende filer. Her er en liste over disse kommandoer.

-d fileKontrollerer, om en fil eksisterer og er en mappe.
-e fileTjek om filen findes.
-f file Kontrollerer, om en fil eksisterer og er en fil.
-r fileKontrollerer om filen findes og er læsbar.
-s file ПKontrollerer om filen findes og ikke er tom.
-w fileKontrollerer, om filen findes og er skrivbar.
-x fileKontrollerer om filen eksisterer og er eksekverbar.
file1 -nt file2 Tjekker om det er nyere file1Than file2.
file1 -ot file2Tjek hvis ældre file1Than file2.
-O file Kontrollerer, om filen eksisterer og ejes af den aktuelle bruger.
-G fileKontrollerer, om filen eksisterer, og om dens gruppe-id matcher den aktuelle brugers gruppe-id.

Disse kommandoer, såvel som mange andre, der diskuteres i dag, er nemme at huske. Deres navne, der 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, for en eksisterende mappe, vil vise dets indhold.

Bash scripts: begyndelsen
Liste over indholdet af en mappe

Vi mener, at du selv kan eksperimentere med de resterende kommandoer, de bruges alle efter samme princip.

Resultaterne af

I dag talte vi om, hvordan man kommer i gang med at skrive bash-scripts og dækkede nogle grundlæggende ting. Faktisk er emnet bash-programmering enormt. Denne artikel er en oversættelse af første del af en stor serie på 11 materialer. Hvis du vil fortsætte lige nu, er her en liste over originalerne af disse materialer. For nemheds skyld er oversættelsen, som du lige har læst, inkluderet her.

  1. Bash Script Trin For Trin — her taler vi om, hvordan man begynder at skabe bash-scripts, brugen af ​​variabler overvejes, betingede strukturer, beregninger, sammenligninger af tal, strenge og at finde ud af information om filer er beskrevet.
  2. Bash Scripting del 2, Bash the awesome — her afsløres funktionerne ved at arbejde med for og mens-løkker.
  3. Bash Scripting del 3, parametre og muligheder — dette materiale er afsat til kommandolinjeparametre og nøgler, der kan overføres til scripts, arbejde med data, som brugeren indtaster, og som kan læses fra filer.
  4. Bash Scripting Del 4, Input & Output - her taler vi om fildeskriptorer og arbejdet med dem, om input, output, fejlstrømme og om output omdirigering.
  5. Bash Scripting Del 5, Sighals & Jobs — dette materiale er afsat til Linux-signaler, deres behandling i scripts og lancering af scripts efter en tidsplan.
  6. Bash Scripting Del 6, Funktioner — her kan du lære om oprettelse og brug af funktioner i scripts og udvikling af biblioteker.
  7. Bash Scripting Del 7, Brug af sed — denne artikel er viet til at arbejde med sed-streaming teksteditoren.
  8. Bash Scripting del 8, Using awk — dette materiale er afsat til programmering i det awk databehandlingssprog.
  9. Bash Scripting Del 9, Regulære udtryk — her kan du læse om at bruge regulære udtryk i bash-scripts.
  10. Bash Scripting Del 10, Praktiske eksempler — her er teknikker til at arbejde med beskeder, der kan sendes til brugere, samt en metode til diskovervågning.
  11. Bash Scripting del 11, Expect Command — dette materiale er dedikeret til Expect-værktøjet, med hvilket du kan automatisere interaktion med interaktive hjælpeprogrammer. Vi taler især om forventer-scripts og deres interaktion med bash-scripts og andre programmer.

Vi mener, at en af ​​de værdifulde egenskaber ved denne serie af artikler er, at den, fra den enkleste, velegnet til brugere på ethvert niveau, gradvist fører til ret seriøse emner, hvilket giver alle en chance for at komme videre i skabelsen af ​​Linux-kommandolinjescripts .

Kære læsere! Vi beder bash-programmeringsguruer om at tale om, hvordan de nåede højderne af deres beherskelse, dele deres hemmeligheder, og vi ser frem til at modtage indtryk fra dem, der lige har skrevet deres første manuskript.

Bash scripts: begyndelsen

Kun registrerede brugere kan deltage i undersøgelsen. Log ind, Vær venlig.

Skal jeg oversætte resten af ​​serien af ​​artikler?

  • Yes!

  • Nej ikke nødvendigt

1030 brugere stemte. 106 brugere undlod at stemme.

Kilde: www.habr.com

Tilføj en kommentar