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.
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.
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.
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-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.
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.
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.
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.
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.
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)):
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Bash Scripting Del 4, Input & Output - her taler vi om fildeskriptorer og arbejdet med dem, om input, output, fejlstrømme og om output omdirigering.
Bash Scripting Del 5, Sighals & Jobs — dette materiale er afsat til Linux-signaler, deres behandling i scripts og lancering af scripts efter en tidsplan.
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.
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.