Bash-scripts: begin

Bash-scripts: begin
Bash-scripts, part 2: loops
Bash-scripts, part 3: parameters and command line keys
Bash-scripts, part 4: input and output
Bash-scripts, part 5: signals, background tasks, script management
Bash-scripts, part 6: functions and library development
Bash-scripts, part 7: sed and text processing
Bash-scripts, part 8: data processing language awk
Bash-scripts, part 9: regular expressions
Bash-scripts, part 10: practical examples
Bash-scripts, part 11: expect and automation of interactive utilities

Today we will talk about bash scripts. This is — command line scripts, written for the bash shell. There are other shells as well, such as — zsh, tcsh, ksh, but we will focus on bash. This material is intended for everyone interested, the only requirement is the ability to work in the command line Linux.

Bash-scripts: begin

Command line scripts are sets of the same commands that can be entered via the keyboard, gathered into files, and united by some common purpose. The results of the commands can represent either standalone value or serve as input data for other commands. Scripts are a powerful way to automate frequently performed actions.

Bash-scripts: begin

So, when it comes to the command line, it allows you to execute multiple commands at once by entering them separated by semicolons:

pwd ; whoami

In fact, if you tried this in your terminal, your first bash script, which involves two commands, is already written. It works like this. First, the command pwd outputs information about the current working directory, then the command whoamishows data about the user you are logged in as.

Using this approach, you can combine as many commands as you want in one line, the limitation is only in the maximum number of arguments that can be passed to the program. This limitation can be determined using the following command:

getconf ARG_MAX

The command line is a great tool, but commands have to be entered every time they are needed. What if you recorded a set of commands in a file and simply called that file for execution? The file we are referring to is called a command line script.

How bash scripts are structured

Create an empty file using the command touchIn de eerste regel moet worden aangegeven welke shell we gaan gebruiken. We zijn geïnteresseerd in bash, dus de eerste regel van het bestand zal er als volgt uitzien:

#!/bin/bash

In de andere regels van dit bestand wordt het hekje gebruikt om opmerkingen aan te geven, die door de shell niet worden verwerkt. Echter, de eerste regel is een uitzondering; hier volgt een hekje, gevolgd door een uitroepteken (deze reeks wordt genoemd shebang) en het pad naar bash, geeft het systeem aan dat het script specifiek is gemaakt voor bash.

Shell-commando's worden gescheiden door een nieuwe regel, opmerkingen worden aangeduid met een hekje. Dit is hoe het eruitziet:

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

Hier, net als in de opdrachtregel, kunnen commando's op één regel worden geschreven, gescheiden door een puntkomma. Maar als je commando's op verschillende regels schrijft, is het bestand gemakkelijker te lezen. Hoe dan ook, de shell zal ze verwerken.

Toegangsmachtigingen instellen voor het scriptbestand

Sla het bestand op met de naam myscript, en het werk aan het maken van het bash-script is bijna afgerond. Het enige wat nog resteert is het uitvoeren van dit bestand, anders krijg je een foutmelding Toegang geweigerd.

Bash-scripts: begin
Proberen het scriptbestand uit te voeren met onjuist ingestelde machtigingen

Laten we het bestand uitvoerbaar maken:

chmod +x ./myscript

Laten we het nu proberen uit te voeren:

./myscript

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

Bash-scripts: begin
Succesvolle uitvoering van het bash-script

Berichten afdrukken

Om tekst naar de Linux-console te sturen, gebruiken we het commando echo. Laten we gebruikmaken van deze kennis en ons script bewerken door uitleg toe te voegen aan de gegevens die al door de bestaande commando's worden afgedrukt:

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

Dit is wat er gebeurt na het uitvoeren van het bijgewerkte script.

Bash-scripts: begin
Berichten vanuit het script

Nu kunnen we verklarende teksten weergeven met behulp van het commando echo. Als je niet weet hoe je het bestand kunt bewerken met behulp van Linux-tools, of als je niet eerder met het commando echobent geconfronteerd, kijk dan op deze materiaal.

Het gebruik van variabelen

Variabelen stellen je in staat om informatie in het scriptbestand op te slaan, bijvoorbeeld de resultaten van commando-uitvoeringen voor gebruik door andere commando's.

Er is niets mis mee om afzonderlijke commando's uit te voeren zonder de resultaten ervan op te slaan, maar de mogelijkheden van deze aanpak zijn zeer beperkt.

Er zijn twee soorten variabelen die je kunt gebruiken in bash-scripts:

  • Omgevingsvariabelen
  • Gebruikersvariabelen

Omgevingsvariabelen

Soms moet je in shell-commando's werken met bepaalde systeemgegevens. Hier is bijvoorbeeld hoe je de home-directory van de huidige gebruiker kunt weergeven:

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

Let op dat we de systeemvariabele $HOME in dubbele aanhalingstekens kunnen gebruiken, dit voorkomt niet dat het systeem deze herkent. Dit is wat je krijgt als je het bovenstaande script uitvoert.

Bash-scripts: begin
Het gebruik van een omgevingsvariabele in een script

En wat als je het dollarteken op het scherm wilt weergeven? Laten we het zo proberen:

echo "I have $1 in my pocket"

Het systeem zal het dollarteken in de string, omringd door aanhalingstekens, detecteren en besluiten dat we naar een variabele verwijzen. Het script zal proberen de waarde van een ongedefinieerde variabele op het scherm weer te geven $1. Dat is niet wat we nodig hebben. Wat te doen?

In een dergelijke situatie helpt het om het bestuursteken, de terugwaartse schuine streep, voor het dollarteken te gebruiken:

echo "I have $1 in my pocket"

Nu zal het script precies datgene weergeven wat we verwachten.

Bash-scripts: begin
Het gebruik van een escape-sequentie om het dollarteken weer te geven

Gebruikersvariabelen

In aanvulling op omgevingsvariabelen stellen bash-scripts je in staat om je eigen variabelen te definiëren en te gebruiken in het script. Deze variabelen behouden hun waarde zolang het script draait.

Net als bij systeemvariabelen kun je gebruikersvariabelen aanroepen met behulp van het dollarteken:
TNW-CUS-FMP — een kortingscode voor 10% korting op onze diensten, beschikbaar voor activatie binnen 7 dagen

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

Dit is het resultaat na het uitvoeren van zo'n script.

Bash-scripts: begin
Gebruiksvriendelijke variabelen in het script

Command Substitution

Een van de handigste mogelijkheden van bash-scripts is dat je informatie kunt extraheren uit de uitvoer van commando's en deze kunt toekennen aan variabelen, waardoor je deze informatie overal in het script kunt gebruiken.

Dit kan op twee manieren worden gedaan.

  • Met het teruggekeerde accentteken «`»
  • Met de constructie $()

Gebruik bij de eerste benadering het teruggekeerde accentteken en schrijf geen enkele aanhalingstekens. De opdracht moet in twee van dergelijke tekens worden geplaatst:

mydir=`pwd`

Bij de tweede benadering wordt hetzelfde als volgt geschreven:

mydir=$(pwd)

En het script kan er uiteindelijk zo uitzien:

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

Tijdens de uitvoering van dit script pwdzal de uitvoer van de opdracht worden opgeslagen in de variabele, waarvan de inhoud met behulp van het commando echo, naar de console zal worden gestuurd.

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

Wiskundige bewerkingen

Voor het uitvoeren van wiskundige bewerkingen in een scriptsbestand kan de constructie van het type worden gebruikt $((a+b)):

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

Bash-scripts: begin
Wiskundige bewerkingen in het script

Besturingsconstructie if-then

In sommige scripts is het nodig om de stroom van commando's te beheren. Bijvoorbeeld, als een bepaalde waarde groter is dan vijf, moet een handeling worden uitgevoerd; anders een andere. Dit is toepasbaar in veel situaties, en hier helpt de besturingsconstructie if-then. In de meest eenvoudige vorm ziet deze er als volgt uit:

if command
then
commands
fi

Hier is een werkvoorbeeld:

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

In dit geval, als de uitvoering van het commando pwdsuccesvol is, zal de tekst "it works" naar de console worden geschreven.

Laten we onze bestaande kennis gebruiken en een complexer script schrijven. Stel dat we een bepaalde gebruiker moeten vinden in /etc/passwd, en als we hem gevonden hebben, moeten we melden dat hij bestaat.

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

Dit is wat er gebeurt na het uitvoeren van dit script.

Bash-scripts: begin
Zoeken naar gebruiker

Hier hebben we de opdracht grepgebruikt om de gebruiker in het bestand /etc/passwdte zoeken. Als het commando grepje onbekend is, kun je de beschrijving ervan vinden hier.

In dit voorbeeld, als de gebruiker wordt gevonden, geeft het script een overeenkomstige boodschap weer. Maar als het niet lukt om de gebruiker te vinden? In dit geval stopt het script gewoon zonder ons iets te vertellen. We zouden willen dat het ons daar ook iets over vertelt, dus laten we de code verbeteren.

Besturingsconstructie if-then-else

Om ervoor te zorgen dat het programma zowel het resultaat van een succesvolle zoektocht als dat van een mislukking kan melden, gebruiken we de constructie if-then-else. Dit is hoe het is opgebouwd:

if command
then
commands
else
commands
fi

Als het eerste commando nul teruggeeft, wat betekent dat het succesvol is uitgevoerd, zal de voorwaarde waar zijn en zal de uitvoering niet naar de tak elsegaan. In het andere geval, als iets dat anders is dan nul wordt teruggegeven, wat een mislukking of een foutief resultaat betekent, worden de commando's die na else.

komen, uitgevoerd.

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

Laten we zo'n script schrijven: else.

Bash-scripts: begin
Het uitvoeren van het script ging via de tak

Laten we verder gaan en de vraag stellen over complexere voorwaarden. Wat als we niet één voorwaarde, maar meerdere moeten controleren? Bijvoorbeeld, als de gewenste gebruiker is gevonden, moeten we één bericht weergeven, als een andere voorwaarde waar is - nog een bericht, enzovoort. In een dergelijke situatie helpen geneste voorwaarden ons. Dit ziet er als volgt uit:

if command1
then
commands
elif command2
then
commands
fi

Als de eerste opdracht nul retourneert, wat aangeeft dat deze met succes is uitgevoerd, worden de opdrachten in het eerste blok uitgevoerd. then, anders, als de eerste voorwaarde onjuist blijkt te zijn, en als de tweede opdracht nul retourneert, wordt het tweede blok code 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 een dergelijk script kun je bijvoorbeeld een nieuwe gebruiker aanmaken met de opdracht useradd, als de zoekopdracht geen resultaten opleverde, of iets anders nuttigs doen.

Getallen vergelijken

In scripts kunnen numerieke waarden met elkaar worden vergeleken. Hieronder vind je een lijst van de bijbehorende opdrachten.

n1 -eq n2Geeft waar terug als n1 gelijk is aan n2.
n1 -ge n2 Geeft waar terug als n1groter of gelijk aan n2.
n1 -gt n2Geeft waar terug als n1 groter n2.
n1 -le n2Geeft waar terug als n1kleiner of gelijk aan n2.
n1 -lt n2Geeft waar terug als n1 kleiner is dan n2.
n1 -ne n2Geeft waar terug als n1niet gelijk aan n2.

Als voorbeeld zullen we een van de vergelijkingsoperatoren testen. Let op dat de expressie tussen 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 weergeeft.

Bash-scripts: begin
Getallen vergelijken in scripts

De waarde van de variabele val1is groter dan 5, waardoor de tak van de vergelijkingsoperator wordt uitgevoerd en het overeenkomstige bericht naar de console wordt weergegeven. thenStrings vergelijken

In scripts kunnen ook stringwaarden met elkaar worden vergeleken. De vergelijkingsoperatoren zijn vrij eenvoudig, maar stringvergelijkingen hebben bepaalde bijzonderheden waar we hieronder op ingaan. Hier is een lijst van de operatoren.

str1 = str2

Controleert of de strings gelijk zijn, retourneert waar als de strings identiek zijn. s
str1 != str2Geeft waar terug als de strings niet identiek zijn.str1 < str2
Geeft waar terug alsstr1 minder is danstr2 str1 > str2.
groter is dan str1 minder is dan-n str1 str1 > str2.
Geeft waar terug als de lengte groter dan nul is. minder is dan-z str1
gelijk is aan nul.groter dan nul is. minder is danHier is een voorbeeld van stringvergelijking in een script:

Na uitvoering van het script krijgen we het volgende.

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

Strings vergelijken in scripts

Bash-scripts: begin
Strings vergelijken in scripts

Hier is een kenmerk van stringvergelijkingen dat het vermelden waard is. De operators ">" en "" als een opdracht voor uitvoeromleiding.

Dit is hoe het werken met deze operators in de code eruitziet:

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

Dit zijn de resultaten van het script.

Bash-scripts: begin
Stringvergelijking, waarschuwing weergegeven

Let op dat, hoewel het script wordt uitgevoerd, het een waarschuwing geeft:

.\/myscript: regel 5: [: te veel argumenten

Om deze waarschuwing te verwijderen, plaatsen 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: begin
In scripts kunnen ook stringwaarden met elkaar worden vergeleken. De vergelijkingsoperatoren zijn vrij eenvoudig, maar stringvergelijkingen hebben bepaalde bijzonderheden waar we hieronder op ingaan. Hier is een lijst van de operatoren.

Een ander kenmerk van de operators ">" en "<" betreft hoe ze werken met hoofdlettergevoelige en niet-hoofdlettergevoelige tekens. Om dit kenmerk te begrijpen, bereiden we een tekstbestand voor met de volgende inhoud:

Likegeeks
likegeeks

We zullen het opslaan onder de naam myfile, waarna we in de terminal de volgende opdracht uitvoeren:

sort myfile

Het zal de regels uit het bestand als volgt sorteren:

likegeeks
Likegeeks

Opdracht sort, sorteert standaard de regels oplopend, dat wil zeggen dat een kleine letter in ons voorbeeld minder is dan een hoofdletter. Laten we nu een script voorbereiden dat dezelfde regels 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 we dit uitvoeren, blijkt dat het omgekeerd is — de kleine letter is nu groter dan de hoofdletter.

Bash-scripts: begin
De opdracht sort en stringvergelijking in het script

In vergelijking is een hoofdletter kleiner dan een kleine letter. De stringvergelijkingen worden uitgevoerd door de ASCII-codes van de tekens te vergelijken, waardoor de sorteervolgorde afhankelijk is van de codes van de tekens.

Opdracht sort, dat op zijn beurt de sorteervolgorde gebruikt die is ingesteld in de systeemtaalinstellingen.

Bestandscontroles

Waarschijnlijk worden de onderstaande opdrachten het vaakst gebruikt in bash-scripts. Ze stellen ons in staat om verschillende voorwaarden met betrekking tot bestanden te controleren. Hier is een lijst van deze opdrachten.

-d bestandControleert of het bestand bestaat en of het een map is.
-e bestandControleert of het bestand bestaat.
-f bestand Controleert of het bestand bestaat en of het een bestand is.
-r bestandControleert of het bestand bestaat en of het leesbaar is.
-s bestandControleert of het bestand bestaat en of het niet leeg is.
-w bestandControleert of het bestand bestaat en of het beschrijfbaar is.
-x bestandControleert of het bestand bestaat en of het uitvoerbaar is.
bestand1 -nt bestand2 Controleert of bestand1, nieuwer dan bestand2.
bestand1 -ot bestand2Controleert of bestand1, nieuwer dan bestand2.
-O bestand Controleert of het bestand bestaat en of de huidige gebruiker de eigenaar is.
-G bestandControleert of het bestand bestaat en of de groep-ID overeenkomt met die van de huidige gebruiker.

Deze commando's, evenals vele andere die vandaag zijn besproken, zijn niet moeilijk te onthouden. Hun namen, als afkortingen van verschillende woorden, geven duidelijk de uitgevoerde controles aan.

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

#!/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 directory, de inhoud ervan weergeven.

Bash-scripts: begin
Inhoud van de directory weergeven

We gaan ervan uit dat je met de andere commando's zelf kunt experimenteren; ze worden allemaal op dezelfde manier toegepast.

Conclusies

Vandaag hebben we besproken hoe je kunt beginnen met het schrijven van bash-scripts en enkele basisaspecten bekeken. Het onderwerp bash-programmering is in feite enorm. Dit artikel is een vertaling van het eerste deel van een grote serie van 11 materialen. Als je nu wilt doorgaan — hier is de lijst met de oorspronkelijke materialen. Voor het gemak is ook degene inbegrepen waarvan je zojuist de vertaling hebt gelezen.

  1. Bash Script Stap Voor Stap — dit gaat over hoe je kunt beginnen met het maken van bash-scripts, het gebruik van variabelen, conditionele constructies, berekeningen, vergelijkingen van getallen, strings, en het verkrijgen van informatie over bestanden.
  2. Bash Scripting Deel 2, Bash de geweldige — hier worden de nuances van de werking met for- en while-lussen besproken.
  3. Bash Scripting Deel 3, Parameters & opties — dit materiaal is gewijd aan de parameters van de commandoregel en de sleutels die aan de scripts kunnen worden doorgegeven, aan de omgang met gegevens die door de gebruiker worden ingevoerd en die vanuit bestanden kunnen worden gelezen.
  4. Bash Scripting Deel 4, Invoer & Uitvoer — hier wordt gesproken over bestandsdescriptoren en hoe deze te gebruiken, over invoer-, uitvoer- en foutstromen, en over outputomleiding.
  5. Bash Scripting Deel 5, Signalen & Taken — dit materiaal is gewijd aan Linux-signalen, hun verwerking in scripts en het plannen van het uitvoeren van scripts.
  6. Bash Scripting Deel 6, Functies — hier kun je leren hoe je functies in scripts kunt maken en gebruiken en hoe je bibliotheken ontwikkelt.
  7. Bash Scripting Deel 7, Sed gebruiken — dit artikel is gewijd aan het werken met de stroomteksteditor sed.
  8. Bash Scripting Deel 8, Awk gebruiken — dit materiaal is gewijd aan programmeren in de dataverwerkings-taal awk.
  9. Bash Scripting Deel 9, Reguliare Expressies — hier kun je lezen over het gebruik van reguliere expressies in bash-scripts.
  10. Bash-scripting Deel 10, Praktische Voorbeelden — hier worden technieken gepresenteerd voor het werken met berichten die naar gebruikers kunnen worden verzonden, evenals de methodologie voor schijfmonitoring.
  11. Bash-scripting Deel 11, Expect Opdracht — dit materiaal is gewijd aan de tool Expect, waarmee je de interactie met interactieve hulpprogramma's kunt automatiseren. Het gaat met name om expect-scripts en hun interactie met bash-scripts en andere programma's.

Wij geloven dat een van de waardevolle eigenschappen van deze reeks artikelen is dat het, te beginnen met de eenvoudigste onderwerpen die geschikt zijn voor gebruikers van elk niveau, geleidelijk leidt naar behoorlijk serieuze thema's, waardoor iedereen de kans krijgt om zich te verdiepen in het schrijven van Linux-opdrachtregelscripts.

Beste lezers! We vragen de bash-programmeer-guru's om te vertellen hoe ze de toppen van meesterlijkheid hebben bereikt en hun geheimen te delen, terwijl we van degenen die net hun eerste script hebben geschreven, hun indrukken verwachten.

Bash-scripts: begin

Alleen geregistreerde gebruikers kunnen deelnemen aan de enquête. Log in, alstublieft.

Zullen we de overige delen van de artikelcyclus vertalen?

  • Ja!

  • Nee, dat is niet nodig

1030 gebruikers hebben gestemd. 106 gebruikers hebben zich onthouden.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster