Bash scripts: begynnelsen

Bash scripts: begynnelsen
Bash Scripts del 2: Loops
Bash-skript, del 3: Kommandolinjealternativer og brytere
Bash Scripts del 4: Input og Output
Bash-skript, del 5: Signaler, bakgrunnsoppgaver, skriptbehandling
Bash-skript, del 6: Funksjoner og bibliotekutvikling
Bash-skript, del 7: sed og tekstbehandling
Bash-skript, del 8: awk databehandlingsspråk
Bash Scripts del 9: Regulære uttrykk
Bash Scripts del 10: Praktiske eksempler
Bash-skript, del 11: Forvent og automatisering av interaktive verktøy

I dag skal vi snakke om bash-skript. dette - kommandolinjeskript, skrevet for bash-skallet. Det er andre skjell som zsh, tcsh, ksh, men vi vil fokusere på bash. Dette materialet er beregnet for alle, den eneste betingelsen er evnen til å jobbe i kommandolinje Linux.

Bash scripts: begynnelsen

Kommandolinjeskript er samlinger av de samme kommandoene som kan legges inn fra tastaturet, samles inn i filer og forenes med et felles formål. I dette tilfellet kan resultatene av teamenes arbeid enten være av uavhengig verdi eller tjene som inputdata for andre team. Skript er en kraftig måte å automatisere ofte utførte handlinger.

Bash scripts: begynnelsen

Så hvis vi snakker om kommandolinjen, lar den deg utføre flere kommandoer samtidig ved å skrive dem atskilt med semikolon:

pwd ; whoami

Faktisk, hvis du prøvde dette i terminalen din, er ditt første bash-skript som involverer to kommandoer allerede skrevet. Det fungerer slik. Lag først pwd viser informasjon om gjeldende arbeidskatalog, deretter kommandoen whoamiviser informasjon om brukeren du er logget på som.

Ved å bruke denne tilnærmingen kan du kombinere så mange kommandoer du vil på en linje, den eneste grensen er det maksimale antallet argumenter som kan sendes til programmet. Du kan definere denne grensen ved å bruke følgende kommando:

getconf ARG_MAX

Kommandolinjen er et flott verktøy, men du må legge inn kommandoer hver gang du trenger dem. Hva om vi skrev et sett med kommandoer inn i en fil og bare kalte den filen for å utføre dem? Faktisk kalles filen vi snakker om et kommandolinjeskript.

Hvordan bash-skript fungerer

Lag en tom fil ved å bruke kommandoen touch. Den første linjen må indikere hvilket skall vi skal bruke. Vi er interessert i bash, så den første linjen i filen blir:

#!/bin/bash

Andre linjer i denne filen bruker hash-symbolet for å indikere kommentarer som skallet ikke behandler. Den første linjen er imidlertid et spesialtilfelle, det er en hash etterfulgt av et utropstegn (denne sekvensen kalles shebang) og veien til bash, indikerer for systemet at skriptet ble opprettet spesielt for bash.

Shell-kommandoer er atskilt med en linjefeed, kommentarer er atskilt med et hash-tegn. Slik ser det ut:

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

Her, akkurat som på kommandolinjen, kan du skrive kommandoer på én linje, atskilt med semikolon. Men hvis du skriver kommandoene på forskjellige linjer, er filen lettere å lese. I alle fall vil skallet behandle dem.

Angi skriptfiltillatelser

Lagre filen og gi den et navn myscript, og arbeidet med å lage bash-skriptet er nesten ferdig. Nå gjenstår det bare å gjøre denne filen kjørbar, ellers, hvis du prøver å kjøre den, vil du støte på en feil Permission denied.

Bash scripts: begynnelsen
Forsøker å kjøre en skriptfil med feil konfigurerte tillatelser

La oss gjøre filen kjørbar:

chmod +x ./myscript

La oss nå prøve å utføre det:

./myscript

Etter å ha angitt tillatelsene fungerer alt som det skal.

Bash scripts: begynnelsen
Kjører bash-skriptet vellykket

Meldingsutgang

For å sende ut tekst til Linux-konsollen, bruk kommandoen echo. La oss bruke kunnskapen om dette faktum og redigere skriptet vårt, og legge til forklaringer til dataene som sendes ut av kommandoene som 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 hva som skjer etter å ha kjørt det oppdaterte skriptet.

Bash scripts: begynnelsen
Sender ut meldinger fra et skript

Nå kan vi vise forklarende notater ved å bruke kommandoen echo. Hvis du ikke vet hvordan du redigerer en fil ved hjelp av Linux-verktøy, eller du ikke har sett kommandoen før echo, se på dette materiale.

Bruke variabler

Variabler lar deg lagre informasjon i en skriptfil, for eksempel resultatet av kommandoer, for bruk av andre kommandoer.

Det er ingenting galt med å utføre individuelle kommandoer uten å lagre resultatene, men denne tilnærmingen er ganske begrenset i sine muligheter.

Det er to typer variabler som kan brukes i bash-skript:

  • Miljøvariabler
  • Brukervariabler

Miljøvariabler

Noen ganger må shell-kommandoer fungere med noen systemdata. Her er et eksempel på hvordan du viser gjeldende brukers hjemmekatalog:

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

Vær oppmerksom på at vi kan bruke en systemvariabel $HOME i doble anførselstegn vil dette ikke hindre systemet i å gjenkjenne det. Dette er hva du får hvis du kjører scenariet ovenfor.

Bash scripts: begynnelsen
Bruke en miljøvariabel i et skript

Hva om du trenger å vise et dollartegn på skjermen? La oss prøve dette:

echo "I have $1 in my pocket"

Systemet vil oppdage et dollartegn i en angitt streng og anta at vi har referert til en variabel. Skriptet vil prøve å vise verdien til en udefinert variabel $1. Det er ikke dette vi trenger. Hva å gjøre?

I denne situasjonen vil bruk av escape-tegnet, en omvendt skråstrek, før dollartegnet hjelpe:

echo "I have $1 in my pocket"

Skriptet vil nå gi nøyaktig det som forventes.

Bash scripts: begynnelsen
Bruke en rømningssekvens for å skrive ut et dollartegn

Brukervariabler

I tillegg til miljøvariabler lar bash-skript deg definere og bruke dine egne variabler i skriptet. Slike variabler har en verdi til skriptet fullfører utførelse.

Som med systemvariabler, kan brukervariabler nås ved å bruke dollartegnet:
TNW-CUS-FMP - kampanjekode for 10% rabatt på våre tjenester, tilgjengelig for aktivering innen 7 dager

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

Dette er hva som skjer etter å ha kjørt et slikt skript.

Bash scripts: begynnelsen
Egendefinerte variabler i et skript

Kommandoerstatning

En av de mest nyttige funksjonene til bash-skript er muligheten til å trekke ut informasjon fra kommandoutdata og tilordne den til variabler, slik at du kan bruke denne informasjonen hvor som helst i skriptfilen.

Dette kan gjøres på to måter.

  • Bruke tilbaketikken "`"
  • Av design $()

Når du bruker den første tilnærmingen, vær forsiktig så du ikke tar med et enkelt anførselstegn i stedet for backtick. Kommandoen må være omsluttet av to slike ikoner:

mydir=`pwd`

I den andre tilnærmingen er det samme skrevet slik:

mydir=$(pwd)

Og manuset kan ende opp med å se slik ut:

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

Under driften, utgangen av kommandoen pwdvil bli lagret i en variabel mydir, hvis innhold, ved hjelp av kommandoen echo, vil gå til konsollen.

Bash scripts: begynnelsen
Et skript som lagrer resultatene av en kommando i en variabel

Matematiske operasjoner

For å utføre matematiske operasjoner i en skriptfil, kan du bruke en konstruksjon som $((a+b)):

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

Bash scripts: begynnelsen
Matematiske operasjoner i et skript

hvis-da kontrollkonstruksjon

I noen scenarier må du kontrollere flyten av kommandoutførelse. For eksempel, hvis en viss verdi er større enn fem, må du utføre én handling, ellers en annen. Dette gjelder i mange situasjoner, og her vil kontrollstrukturen hjelpe oss if-then. I sin enkleste form ser det slik ut:

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

Her er et fungerende eksempel:

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

I dette tilfellet, hvis kommandoen utføres pwdfullføres, vil teksten "det fungerer" vises i konsollen.

La oss bruke kunnskapen vi har og skrive et mer komplekst manus. La oss si at vi må finne en bestemt bruker i /etc/passwd, og hvis du klarte å finne den, rapporter at den eksisterer.

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

Dette er hva som skjer etter å ha kjørt dette skriptet.

Bash scripts: begynnelsen
Søk etter en bruker

Her brukte vi kommandoen grepfor å søke etter en bruker i en fil /etc/passwd. Hvis laget grepukjent for deg, kan beskrivelsen bli funnet her.

I dette eksemplet, hvis brukeren blir funnet, vil skriptet vise en tilsvarende melding. Hva om brukeren ikke ble funnet? I dette tilfellet vil skriptet ganske enkelt fullføre kjøringen uten å fortelle oss noe. Vi vil gjerne at han også skal fortelle oss om dette, så vi vil forbedre koden.

hvis-så-ellers kontrollkonstruksjon

For at programmet skal kunne rapportere både resultater av et vellykket søk og feil, vil vi bruke konstruksjonen if-then-else. Slik fungerer det:

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

Hvis den første kommandoen returnerer null, noe som betyr at den ble utført vellykket, vil betingelsen være sann og utførelsen vil ikke fortsette langs grenen else. Ellers, hvis noe annet enn null returneres, noe som ville indikere feil eller et falsk resultat, vil kommandoene etter else.

La oss skrive følgende manus:

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

Henrettelsen hans gikk i vasken else.

Bash scripts: begynnelsen
Kjøre et skript med en if-then-else-konstruksjon

Vel, la oss gå videre og spørre oss selv om mer komplekse forhold. Hva om du trenger å sjekke ikke én tilstand, men flere? For eksempel, hvis ønsket bruker blir funnet, skal én melding vises, hvis en annen betingelse er oppfylt, skal en annen melding vises, og så videre. I en slik situasjon vil nestede forhold hjelpe oss. Det ser slik ut:

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

Hvis den første kommandoen returnerer null, noe som indikerer vellykket utførelse, vil kommandoene i den første blokken bli utført then, ellers, hvis den første betingelsen er falsk og hvis den andre kommandoen returnerer null, vil den andre kodeblokken bli utfø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 slikt skript kan du for eksempel opprette en ny bruker ved å bruke kommandoen useradd, hvis søket ikke ga resultater, eller gjøre noe annet nyttig.

Sammenligning av tall

I skript kan du sammenligne numeriske verdier. Nedenfor er en liste over relevante kommandoer.

n1 -eq n2Returnerer sant hvis n1 er n2.
n1 -ge n2 Returnerer sant hvis n1mer eller lik n2.
n1 -gt n2Returnerer sant hvis n1 mer enn n2.
n1 -le n2Returnerer sant hvis n1mindre eller lik n2.
n1 -lt n2Returnerer sann hvis n1 er mindre enn n2.
n1 -ne n2Returnerer sant hvis n1ikke like n2.

Som et eksempel, la oss prøve en av sammenligningsoperatørene. Merk at uttrykket er omsluttet av hakeparenteser.

#!/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 hva denne kommandoen vil sende ut.

Bash scripts: begynnelsen
Sammenligning av tall i skript

Variabel verdi val1større enn 5, ender grenen med å bli henrettet thensammenligningsoperatør og en tilsvarende melding vises i konsollen.

Strengesammenligning

Skript kan også sammenligne strengverdier. Sammenligningsoperatorer ser ganske enkle ut, men strengsammenligningsoperasjoner har visse funksjoner, som vi vil berøre nedenfor. Her er en liste over operatører.

str1 = str2 Tester strenger for likhet, returnerer sann hvis strengene er identiske.
str1 != str2Returnerer sann hvis strengene ikke er identiske.
str1 < str2Returnerer sant hvis str1mindre enn str2.
str1 > str2 Returnerer sant hvis str1mer enn str2.
-n str1 Returnerer sann hvis lengde str1Over null.
-z str1Returnerer sann hvis lengde str1lik null.

Her er et eksempel på sammenligning av strenger i et skript:

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

Som et resultat av å kjøre skriptet får vi følgende.

Bash scripts: begynnelsen
Sammenligning av strenger i skript

Her er en funksjon ved strengsammenligning som er verdt å nevne. Operatorene ">" og "<" må nemlig escapes med en omvendt skråstrek, ellers vil ikke skriptet fungere riktig, selv om det ikke vises noen feilmeldinger. Skriptet tolker tegnet ">" som en omdirigeringskommando for utdata.

Slik ser det ut å jobbe med disse operatørene 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 resultatene av manuset.

Bash scripts: begynnelsen
Strengesammenligning, advarsel gitt

Vær oppmerksom på at skriptet, selv om det er utført, gir en advarsel:

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

For å bli kvitt denne advarselen, konkluderer vi $val2 i doble 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

Nå fungerer alt som det skal.

Bash scripts: begynnelsen
Strengesammenligning

En annen funksjon ved ">" og "<" operatorene er hvordan de fungerer med store og små bokstaver. For å forstå denne funksjonen, la oss forberede en tekstfil med følgende innhold:

Likegeeks
likegeeks

La oss lagre den ved å gi den et navn myfile, kjør deretter følgende kommando i terminalen:

sort myfile

Det vil sortere linjene fra filen slik:

likegeeks
Likegeeks

Lag sort, som standard, sorterer strenger i stigende rekkefølge, det vil si at den lille bokstaven i vårt eksempel er mindre enn den store. La oss nå forberede et skript som vil sammenligne de samme strengene:

#!/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 kjører det, viser det seg at alt er omvendt - den lille bokstaven er nå større enn den store.

Bash scripts: begynnelsen
Sorteringskommandoen og sammenligning av strenger i en skriptfil

I sammenligningskommandoer er store bokstaver mindre enn små bokstaver. Stringsammenlikning her gjøres ved å sammenligne ASCII-kodene til tegnene, sorteringsrekkefølgen avhenger altså av tegnkodene.

Lag sort, bruker på sin side sorteringsrekkefølgen angitt i systemspråkinnstillingene.

Filsjekker

Kanskje de følgende kommandoene brukes oftest i bash-skript. De lar deg sjekke ulike forhold angående filer. Her er en liste over disse kommandoene.

-d fileSjekker om en fil eksisterer og er en katalog.
-e fileSjekker om filen eksisterer.
-f file Sjekker om en fil eksisterer og er en fil.
-r fileSjekker om filen eksisterer og er lesbar.
-s file ПSjekker om filen eksisterer og ikke er tom.
-w fileSjekker om filen eksisterer og er skrivbar.
-x fileSjekker om filen eksisterer og er kjørbar.
file1 -nt file2 Sjekker om den er nyere file1enn file2.
file1 -ot file2Sjekker om den er eldre file1enn file2.
-O file Sjekker om filen eksisterer og eies av gjeldende bruker.
-G fileSjekker om filen eksisterer og om dens gruppe-ID samsvarer med gjeldende brukers gruppe-ID.

Disse kommandoene, så vel som mange andre som diskuteres i dag, er enkle å huske. Navnene deres, som er forkortelser av forskjellige ord, indikerer direkte kontrollene de utfører.

La oss prøve en av kommandoene 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 skriptet, for en eksisterende katalog, vil vise innholdet.

Bash scripts: begynnelsen
Liste over innholdet i en katalog

Vi tror at du kan eksperimentere med de resterende kommandoene selv; de brukes alle etter samme prinsipp.

Resultater av

I dag snakket vi om hvordan du kommer i gang med å skrive bash-manus og dekket noen grunnleggende ting. Faktisk er temaet bash-programmering enormt. Denne artikkelen er en oversettelse av første del av en stor serie med 11 materialer. Hvis du vil fortsette akkurat nå, her er en liste over originalene til disse materialene. For enkelhets skyld er oversettelsen du nettopp har lest inkludert her.

  1. Bash Script trinn for trinn — her snakker vi om hvordan du begynner å lage bash-skript, bruk av variabler vurderes, betingede strukturer, beregninger, sammenligninger av tall, strenger og å finne ut informasjon om filer beskrives.
  2. Bash Scripting del 2, Bash the awesome — her avsløres funksjonene ved å jobbe med for og mens-løkker.
  3. Bash Scripting del 3, parametere og alternativer — dette materialet er viet til kommandolinjeparametere og nøkler som kan overføres til skript, arbeider med data som brukeren legger inn og som kan leses fra filer.
  4. Bash Scripting del 4, Input & Output - her snakker vi om fildeskriptorer og arbeid med dem, om input, output, feilstrømmer, og om output redirection.
  5. Bash Scripting del 5, Sighals & Jobs – dette materialet er viet til Linux-signaler, deres behandling i skript og lansering av skript etter en tidsplan.
  6. Bash Scripting del 6, funksjoner — her kan du lære om å lage og bruke funksjoner i skript og utvikle biblioteker.
  7. Bash Scripting Del 7, Bruke sed — denne artikkelen er viet til å jobbe med sed-streaming-tekstredigereren.
  8. Bash Scripting del 8, Using awk — dette materialet er viet programmering i awk databehandlingsspråket.
  9. Bash Scripting del 9, Regulære uttrykk — her kan du lese om bruk av regulære uttrykk i bash-skript.
  10. Bash Scripting del 10, praktiske eksempler — her er teknikker for å jobbe med meldinger som kan sendes til brukere, samt en metode for diskovervåking.
  11. Bash Scripting del 11, Expect Command — dette materialet er dedikert til Expect-verktøyet, som du kan automatisere interaksjon med interaktive verktøy med. Spesielt snakker vi om forventet manus og deres interaksjon med bash manus og andre programmer.

Vi tror at en av de verdifulle egenskapene til denne artikkelserien er at den, fra den enkleste, egnet for brukere på alle nivåer, gradvis fører til ganske alvorlige emner, noe som gir alle en sjanse til å gå videre i opprettelsen av Linux-kommandolinjeskript. .

Kjære lesere! Vi ber bash-programmeringsguruer snakke om hvordan de nådde høydene av mestring, dele hemmeligheter, og vi ser frem til å motta inntrykk fra de som nettopp har skrevet sitt første manus.

Bash scripts: begynnelsen

Kun registrerte brukere kan delta i undersøkelsen. Logg inn, vær så snill.

Bør jeg oversette resten av artikkelserien?

  • Ja!

  • Nei ikke nødvendig

1030 brukere stemte. 106 brukere avsto.

Kilde: www.habr.com

Legg til en kommentar