Bash-scripts: het begin

Bash-scripts: het begin
Bash-scripts deel 2: Loops
Bash-scripts, deel 3: opdrachtregelopties en schakelaars
Bash-scripts deel 4: invoer en uitvoer
Bash-scripts, deel 5: signalen, achtergrondtaken, scriptbeheer
Bash-scripts, deel 6: functies en bibliotheekontwikkeling
Bash-scripts, deel 7: sed en tekstverwerking
Bash-scripts, deel 8: awk-taal voor gegevensverwerking
Bash-scripts Deel 9: Reguliere expressies
Bash-scripts deel 10: praktische voorbeelden
Bash-scripts, deel 11: verwachten en automatiseren van interactieve hulpprogramma's

Vandaag zullen we het hebben over bash-scripts. Dit - opdrachtregelscripts, geschreven voor de bash-shell. Er zijn andere shells zoals zsh, tcsh, ksh, maar we zullen ons concentreren op bash. Dit materiaal is voor iedereen bedoeld, de enige voorwaarde is dat je er in kunt werken opdrachtregel Linux.

Bash-scripts: het begin

Commandoregelscripts zijn verzamelingen van dezelfde commando's die vanaf het toetsenbord kunnen worden ingevoerd, in bestanden kunnen worden verzameld en verenigd door een gemeenschappelijk doel. In dit geval kunnen de resultaten van het werk van de teams van onafhankelijke waarde zijn of dienen als inputgegevens voor andere teams. Scripts zijn een krachtige manier om vaak uitgevoerde handelingen te automatiseren.

Bash-scripts: het begin

Dus als we het over de opdrachtregel hebben, kunt u meerdere opdrachten tegelijk uitvoeren door ze gescheiden door een puntkomma in te voeren:

pwd ; whoami

Als je dit in je terminal hebt geprobeerd, is je eerste bash-script met twee opdrachten al geschreven. Het werkt zo. Team eerst pwd geeft informatie weer over de huidige werkmap en vervolgens de opdracht whoamitoont informatie over de gebruiker waarmee u bent ingelogd.

Met deze aanpak kunt u zoveel opdrachten combineren als u wilt op één regel. De enige limiet is het maximale aantal argumenten dat aan het programma kan worden doorgegeven. U kunt deze limiet definiëren met behulp van de volgende opdracht:

getconf ARG_MAX

De opdrachtregel is een geweldig hulpmiddel, maar u moet er telkens opdrachten in invoeren als u ze nodig heeft. Wat als we een reeks opdrachten in een bestand zouden schrijven en dat bestand eenvoudigweg zouden aanroepen om ze uit te voeren? In feite wordt het bestand waar we het over hebben een opdrachtregelscript genoemd.

Hoe bash-scripts werken

Maak een leeg bestand met behulp van de opdracht touch. De eerste regel moet aangeven welke shell we gaan gebruiken. We zijn geïnteresseerd in bash, dus de eerste regel van het bestand zal zijn:

#!/bin/bash

Andere regels in dit bestand gebruiken het hash-symbool om commentaar aan te geven dat de shell niet verwerkt. De eerste regel is echter een speciaal geval: er staat een hekje gevolgd door een uitroepteken (deze reeks wordt genoemd keet) en het pad naar bash, geef aan het systeem aan waarvoor het script speciaal is gemaakt bash.

Shell-opdrachten worden gescheiden door een regelfeed, commentaar wordt gescheiden door een hekje. Dit is hoe het eruit ziet:

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

Hier kunt u, net als op de opdrachtregel, opdrachten op één regel schrijven, gescheiden door puntkomma's. Als u de opdrachten echter op verschillende regels schrijft, is het bestand gemakkelijker te lezen. In ieder geval zal de shell ze verwerken.

Machtigingen voor scriptbestanden instellen

Sla het bestand op en geef het een naam myscript, en het werk van het maken van het bash-script is bijna klaar. Nu hoeft u alleen nog dit bestand uitvoerbaar te maken, anders zult u een fout tegenkomen als u het probeert uit te voeren Permission denied.

Bash-scripts: het begin
Er wordt geprobeerd een scriptbestand uit te voeren met onjuist geconfigureerde machtigingen

Laten we het bestand uitvoerbaar maken:

chmod +x ./myscript

Laten we nu proberen het uit te voeren:

./myscript

Na het instellen van de rechten werkt alles zoals het hoort.

Bash-scripts: het begin
Het bash-script wordt succesvol uitgevoerd

Berichtuitvoer

Gebruik de opdracht om tekst naar de Linux-console uit te voeren echo. Laten we de kennis van dit feit gebruiken en ons script bewerken, door uitleg toe te voegen aan de gegevens die worden uitgevoerd door de opdrachten die er al in staan:

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

Dit is wat er gebeurt nadat het bijgewerkte script is uitgevoerd.

Bash-scripts: het begin
Berichten uit een script uitvoeren

Nu kunnen we verklarende opmerkingen weergeven met behulp van de opdracht echo. Als je niet weet hoe je een bestand moet bewerken met Linux-tools, of als je de opdracht nog niet eerder hebt gezien echo, kijk eens deze материал.

Variabelen gebruiken

Met variabelen kunt u informatie in een scriptbestand opslaan, zoals de resultaten van opdrachten, voor gebruik door andere opdrachten.

Er is niets mis met het uitvoeren van individuele opdrachten zonder de resultaten ervan op te slaan, maar deze aanpak is vrij beperkt in zijn mogelijkheden.

Er zijn twee soorten variabelen die in bash-scripts kunnen worden gebruikt:

  • Omgevingsvariabelen
  • Gebruikersvariabelen

Omgevingsvariabelen

Soms moeten shell-opdrachten met bepaalde systeemgegevens werken. Hier is een voorbeeld van hoe u de thuismap van de huidige gebruiker kunt weergeven:

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

Houd er rekening mee dat we een systeemvariabele kunnen gebruiken $HOME tussen dubbele aanhalingstekens zal dit niet voorkomen dat het systeem het herkent. Dit is wat u krijgt als u het bovenstaande scenario uitvoert.

Bash-scripts: het begin
Een omgevingsvariabele gebruiken in een script

Maar wat als u een dollarteken op het scherm moet weergeven? Laten we dit proberen:

echo "I have $1 in my pocket"

Het systeem detecteert een dollarteken in een tekenreeks tussen aanhalingstekens en gaat ervan uit dat er naar een variabele is verwezen. Het script probeert de waarde van een ongedefinieerde variabele weer te geven $1. Dit is niet wat we nodig hebben. Wat moeten we doen?

In deze situatie kan het gebruik van het escape-teken, een backslash, vóór het dollarteken helpen:

echo "I have $1 in my pocket"

Het script zal nu precies uitvoeren wat wordt verwacht.

Bash-scripts: het begin
Een escape-reeks gebruiken om een ​​dollarteken af ​​te drukken

Gebruikersvariabelen

Naast omgevingsvariabelen kunt u met bash-scripts uw eigen variabelen in het script definiëren en gebruiken. Dergelijke variabelen behouden een waarde totdat het script de uitvoering voltooit.

Net als bij systeemvariabelen zijn gebruikersvariabelen toegankelijk via het dollarteken:
TNW-CUS-FMP - promotiecode voor 10% korting op onze diensten, beschikbaar voor activering binnen 7 dagen

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

Dit is wat er gebeurt nadat een dergelijk script is uitgevoerd.

Bash-scripts: het begin
Aangepaste variabelen in een script

Commando vervanging

Een van de nuttigste kenmerken van bash-scripts is de mogelijkheid om informatie uit de opdrachtuitvoer te extraheren en deze aan variabelen toe te wijzen, waardoor u deze informatie overal in het scriptbestand kunt gebruiken.

Dit kan op twee manieren.

  • Het gebruik van de backtick "`"
  • Met opzet $()

Wanneer u de eerste benadering gebruikt, zorg er dan voor dat u geen enkel aanhalingsteken op de plaats van de backtick plaatst. De opdracht moet tussen twee van dergelijke pictogrammen worden ingesloten:

mydir=`pwd`

In de tweede benadering wordt hetzelfde als volgt geschreven:

mydir=$(pwd)

En het script zou er uiteindelijk zo uit kunnen zien:

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

Tijdens de werking ervan, de uitvoer van het commando pwdwordt opgeslagen in een variabele mydir, waarvan de inhoud, met behulp van de opdracht echo, gaat naar de console.

Bash-scripts: het begin
Een script dat de resultaten van een opdracht in een variabele opslaat

Wiskundige bewerkingen

Om wiskundige bewerkingen in een scriptbestand uit te voeren, kunt u een constructie als $((a+b)):

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

Bash-scripts: het begin
Wiskundige bewerkingen in een script

als-dan-controleconstructie

In sommige scenario's moet u de stroom van de opdrachtuitvoering beheersen. Als een bepaalde waarde bijvoorbeeld groter is dan vijf, moet u de ene actie uitvoeren, en anders een andere. Dit is in veel situaties van toepassing, en hier zal de controlestructuur ons helpen if-then. In zijn eenvoudigste vorm ziet het er als volgt uit:

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

Hier is een werkend voorbeeld:

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

In dit geval, als de opdracht wordt uitgevoerd pwdsuccesvol zal voltooien, zal de tekst “it works” worden weergegeven in de console.

Laten we de kennis die we hebben gebruiken en een complexer script schrijven. Laten we zeggen dat we een bepaalde gebruiker moeten vinden /etc/passwd, en als je het hebt gevonden, meld dan dat het bestaat.

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

Dit is wat er gebeurt nadat dit script is uitgevoerd.

Bash-scripts: het begin
Gebruiker zoeken

Hier gebruikten we het commando grepom een ​​gebruiker in een bestand te zoeken /etc/passwd. Als de ploeg greponbekend voor u, de beschrijving ervan is te vinden hier.

Als de gebruiker in dit voorbeeld wordt gevonden, geeft het script een bijbehorend bericht weer. Wat als de gebruiker niet gevonden kan worden? In dit geval zal het script de uitvoering gewoon voltooien zonder ons iets te vertellen. We willen graag dat hij ons hier ook over vertelt, dus we zullen de code verbeteren.

als-dan-anders controleconstructie

Om ervoor te zorgen dat het programma zowel de resultaten van een succesvolle zoekopdracht als een mislukte zoekopdracht kan rapporteren, zullen we de constructie gebruiken if-then-else. Dit is hoe het werkt:

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

Als het eerste commando nul retourneert, wat betekent dat het met succes is uitgevoerd, is de voorwaarde waar en zal de uitvoering niet langs de vertakking plaatsvinden else. Anders, als er iets anders dan nul wordt geretourneerd, wat zou duiden op een mislukking of een vals resultaat, volgen de opdrachten erna else.

Laten we het volgende script schrijven:

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

Zijn executie liep in de soep else.

Bash-scripts: het begin
Een script uitvoeren met een if-then-else-constructie

Laten we verder gaan en onszelf afvragen wat complexere omstandigheden zijn. Wat als u niet één voorwaarde, maar meerdere moet controleren? Als de gewenste gebruiker bijvoorbeeld wordt gevonden, moet er één bericht worden weergegeven, als aan een andere voorwaarde wordt voldaan, moet er een ander bericht worden weergegeven, enzovoort. In een dergelijke situatie zullen geneste omstandigheden ons helpen. Het ziet er zo uit:

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

Als het eerste commando nul retourneert, wat een succesvolle uitvoering aangeeft, zullen de commando's in het eerste blok worden uitgevoerd thenAnders, als de eerste voorwaarde onwaar is en als de tweede opdracht nul retourneert, wordt het tweede codeblok uitgevoerd.

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

In zo'n script kun je bijvoorbeeld een nieuwe gebruiker aanmaken met behulp van het commando useradd, als de zoekopdracht geen resultaten oplevert, of iets anders nuttigs doet.

Vergelijking van cijfers

In scripts kun je numerieke waarden vergelijken. Hieronder vindt u een lijst met relevante opdrachten.

n1 -eq n2Retourneert waar als n1 is n2.
n1 -ge n2 Retourneert waar als n1meer of gelijk n2.
n1 -gt n2Retourneert waar als n1 больше n2.
n1 -le n2Retourneert waar als n1minder of gelijk n2.
n1 -lt n2Retourneert waar als n1 kleiner is dan n2.
n1 -ne n2Retourneert waar als n1niet gelijk n2.

Laten we als voorbeeld een van de vergelijkingsoperatoren proberen. Merk op dat de uitdrukking tussen vierkante haakjes staat.

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

Dit is wat deze opdracht zal opleveren.

Bash-scripts: het begin
Vergelijking van getallen in scripts

Variabele waarde val1groter dan 5, wordt de vertakking uiteindelijk uitgevoerd thenvergelijkingsoperator en een bijbehorend bericht wordt weergegeven in de console.

Snaarvergelijking

Scripts kunnen ook tekenreekswaarden vergelijken. Vergelijkingsoperatoren zien er vrij eenvoudig uit, maar stringvergelijkingsbewerkingen hebben bepaalde kenmerken, die we hieronder zullen bespreken. Hier is een lijst met exploitanten.

str1 = str2 Test tekenreeksen op gelijkheid en retourneert waar als de tekenreeksen identiek zijn.
str1 != str2Retourneert waar als de tekenreeksen niet identiek zijn.
str1 < str2Retourneert waar als str1minder dan str2.
str1 > str2 Retourneert waar als str1meer dan str2.
-n str1 Retourneert waar als lengte str1Boven nul.
-z str1Retourneert waar als lengte str1gelijk aan nul.

Hier is een voorbeeld van het vergelijken van tekenreeksen in een script:

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

Als resultaat van het uitvoeren van het script krijgen we het volgende.

Bash-scripts: het begin
Tekenreeksen in scripts vergelijken

Hier is een kenmerk van stringvergelijking dat het vermelden waard is. De operatoren ">" en "<" moeten namelijk worden geëscaped met een backslash, anders werkt het script niet correct, hoewel er geen foutmeldingen verschijnen. Het script interpreteert het teken ">" als een uitvoeromleidingsopdracht.

Zo ziet het werken met deze operators er in code uit:

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

Hier zijn de resultaten van het script.

Bash-scripts: het begin
Stringvergelijking, waarschuwing gegeven

Houd er rekening mee dat het script, hoewel uitgevoerd, een waarschuwing geeft:

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

Om van deze waarschuwing af te komen, concluderen we $val2 tussen dubbele aanhalingstekens:

#!/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 werkt alles zoals het hoort.

Bash-scripts: het begin
Snaarvergelijking

Een ander kenmerk van de operatoren ">" en "<" is de manier waarop ze werken met hoofdletters en kleine letters. Om deze functie te begrijpen, gaan we een tekstbestand maken met de volgende inhoud:

Likegeeks
likegeeks

Laten we het opslaan door het een naam te geven myfileen voer vervolgens de volgende opdracht uit in de terminal:

sort myfile

Het sorteert de regels uit het bestand als volgt:

likegeeks
Likegeeks

Team sortsorteert tekenreeksen standaard in oplopende volgorde, dat wil zeggen dat de kleine letter in ons voorbeeld kleiner is dan de hoofdletter. Laten we nu een script voorbereiden dat dezelfde strings vergelijkt:

#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

Als je het uitvoert, blijkt dat alles andersom is: de kleine letter is nu groter dan de hoofdletter.

Bash-scripts: het begin
De sorteeropdracht en het vergelijken van tekenreeksen in een scriptbestand

Bij vergelijkingsopdrachten zijn hoofdletters kleiner dan kleine letters. Stringvergelijking gebeurt hier door de ASCII-codes van de karakters te vergelijken; de sorteervolgorde is dus afhankelijk van de karaktercodes.

Team sortgebruikt op zijn beurt de sorteervolgorde die is opgegeven in de systeemtaalinstellingen.

Bestandscontroles

Misschien worden de volgende opdrachten het vaakst gebruikt in bash-scripts. Hiermee kunt u verschillende voorwaarden met betrekking tot bestanden controleren. Hier is een lijst met deze opdrachten.

-d fileControleert of een bestand bestaat en een directory is.
-e fileControleert of het bestand bestaat.
-f file Controleert of een bestand bestaat en een bestand is.
-r fileControleert of het bestand bestaat en leesbaar is.
-s file ПControleert of het bestand bestaat en niet leeg is.
-w fileControleert of het bestand bestaat en beschrijfbaar is.
-x fileControleert of het bestand bestaat en uitvoerbaar is.
file1 -nt file2 Controleert of het nieuwer is file1dan file2.
file1 -ot file2Controleert of het ouder is file1dan file2.
-O file Controleert of het bestand bestaat en eigendom is van de huidige gebruiker.
-G fileControleert of het bestand bestaat en of het groeps-ID overeenkomt met het groeps-ID van de huidige gebruiker.

Deze commando's, evenals vele andere die vandaag worden besproken, zijn gemakkelijk te onthouden. Hun namen, als afkortingen van verschillende woorden, geven direct de controles aan die zij uitvoeren.

Laten we een van de commando's in de praktijk proberen:

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

Dit script zal voor een bestaande map de inhoud ervan weergeven.

Bash-scripts: het begin
Een overzicht van de inhoud van een map

Wij zijn van mening dat je met de overige commando's zelf kunt experimenteren; ze worden allemaal volgens hetzelfde principe gebruikt.

Resultaten van

Vandaag hebben we gesproken over hoe je aan de slag kunt gaan met het schrijven van bash-scripts en hebben we enkele basiszaken besproken. In feite is het onderwerp bash-programmeren enorm. Dit artikel is een vertaling van het eerste deel van een grote serie van 11 materialen. Als u nu verder wilt gaan, vindt u hier een lijst met de originelen van deze materialen. Voor het gemak is de vertaling die u zojuist heeft gelezen hier opgenomen.

  1. Bash-script stap voor stap — hier hebben we het over hoe je kunt beginnen met het maken van bash-scripts, het gebruik van variabelen wordt overwogen, voorwaardelijke structuren, berekeningen, vergelijkingen van getallen, tekenreeksen en het vinden van informatie over bestanden worden beschreven.
  2. Bash Scripting Deel 2, Bash de geweldige — hier worden de kenmerken van het werken met for- en while-loops onthuld.
  3. Bash Scripting Deel 3, Parameters en opties — dit materiaal is gewijd aan opdrachtregelparameters en sleutels die kunnen worden doorgegeven aan scripts, waarbij wordt gewerkt met gegevens die de gebruiker invoert en die uit bestanden kunnen worden gelezen.
  4. Bash-scripting deel 4, invoer en uitvoer - hier hebben we het over bestandsdescriptors en het werken ermee, over invoer, uitvoer, foutstromen en over het omleiden van uitvoer.
  5. Bash-scripting deel 5, Sighals & Jobs — dit materiaal is gewijd aan Linux-signalen, de verwerking ervan in scripts en het volgens een schema lanceren van scripts.
  6. Bash Scripting Deel 6, Functies — hier kunt u leren over het maken en gebruiken van functies in scripts en het ontwikkelen van bibliotheken.
  7. Bash-scripting deel 7, sed gebruiken - dit artikel is gewijd aan het werken met de sed-streamingteksteditor.
  8. Bash-scripting deel 8, awk gebruiken — dit materiaal is gewijd aan programmeren in de gegevensverwerkingstaal awk.
  9. Bash Scripting Deel 9, Reguliere expressies — hier kun je lezen over het gebruik van reguliere expressies in bash-scripts.
  10. Bash Scripting Deel 10, Praktische voorbeelden — hier zijn technieken voor het werken met berichten die naar gebruikers kunnen worden verzonden, evenals een methode voor schijfmonitoring.
  11. Bash Scripting Deel 11, Verwacht commando — dit materiaal is gewijd aan de Expect-tool, waarmee u de interactie met interactieve hulpprogramma's kunt automatiseren. We hebben het in het bijzonder over verwacht-scripts en hun interactie met bash-scripts en andere programma's.

Wij zijn van mening dat een van de waardevolle kenmerken van deze serie artikelen is dat het, beginnend bij de eenvoudigste, geschikt voor gebruikers van elk niveau, geleidelijk leidt tot behoorlijk serieuze onderwerpen, waardoor iedereen de kans krijgt om vooruitgang te boeken in het maken van Linux-opdrachtregelscripts. .

Beste lezers! We vragen bash-programmeergoeroes om te praten over hoe ze de hoogten van hun meesterschap bereikten, hun geheimen te delen, en we kijken ernaar uit om indrukken te ontvangen van degenen die zojuist hun eerste script hebben geschreven.

Bash-scripts: het begin

Alleen geregistreerde gebruikers kunnen deelnemen aan het onderzoek. Inloggen, Alsjeblieft.

Moet ik de rest van de serie artikelen vertalen?

  • Ja!

  • Nee, geen behoefte

1030 gebruikers hebben gestemd. 106 gebruikers onthielden zich van stemming.

Bron: www.habr.com

Voeg een reactie