Haut schwätze mir iwwer Bash Scripten. Dëst - Kommando Linn Scripten, geschriwwen fir d'Bash Shell. Et ginn aner Muschelen wéi zsh, tcsh, ksh, awer mir fokusséieren op Bash. Dëst Material ass fir jiddereen geduecht, déi eenzeg Konditioun ass d'Fäegkeet ze schaffen Kommandozeil Linux
Kommandozeil Scripte sinn Sammlunge vun deene selwechte Kommandoen, déi vun der Tastatur agefouert kënne ginn, an Dateien gesammelt an duerch e gemeinsame Zweck vereenegt ginn. An dësem Fall kënnen d'Resultater vun der Aarbecht vun den Teams entweder vun onofhängege Wäert sinn oder als Inputdaten fir aner Teams déngen. Scripte sinn e mächtege Wee fir dacks duerchgefouert Aktiounen ze automatiséieren.
Also, wa mir iwwer d'Kommandozeil schwätzen, erlaabt et Iech e puer Kommandoen gläichzäiteg auszeféieren andeems se se vun engem Semikolon getrennt aginn:
pwd ; whoami
Tatsächlech, wann Dir dëst an Ärem Terminal probéiert hutt, ass Ären éischte Bash Skript mat zwee Kommandoen scho geschriwwe ginn. Et funktionnéiert esou. Equipe éischt pwd weist Informatioun iwwer den aktuellen Aarbechtsverzeechnes, dann de Kommando whoamiweist Informatioun iwwer de Benotzer wéi Dir ageloggt sidd.
Mat dëser Approche kënnt Dir esou vill Kommandoen kombinéieren wéi Dir wëllt op enger Zeil, déi eenzeg Limit ass déi maximal Unzuel vun Argumenter déi un de Programm weidergeleet kënne ginn. Dir kënnt dës Limit mat dem folgenden Kommando definéieren:
getconf ARG_MAX
D'Kommandozeil ass e super Tool, awer Dir musst Kommandoen anzeginn all Kéier wann Dir se braucht. Wat wa mir eng Rei vun Kommandoen an eng Datei schreiwen an einfach dës Datei nennen fir se auszeféieren? Tatsächlech gëtt d'Datei iwwer déi mir schwätzen e Kommandozeil Skript genannt.
Wéi Bash Scripte funktionnéieren
Erstellt eng eidel Datei mat dem Kommando touch. Seng éischt Zeil muss uginn wéi eng Shell mir wäerte benotzen. Mir sinn interesséiert bash, also déi éischt Zeil vun der Datei wäert sinn:
#!/bin/bash
Aner Zeilen an dëser Datei benotzen den Hash-Symbol fir Kommentarer unzeginn déi d'Shell net veraarbecht. Wéi och ëmmer, déi éischt Zeil ass e spezielle Fall, et gëtt en Hash gefollegt vun engem Ausrufezeeche (dës Sequenz gëtt genannt schaarf) an de Wee zu bash, gitt de System un fir deen de Skript speziell erstallt gouf bash.
Shell Kommandoen sinn duerch eng Linn fidderen getrennt, Kommentaren sinn vun engem Hash Zeechen getrennt. Dëst ass wéi et ausgesäit:
#!/bin/bash
# This is a comment
pwd
whoami
Hei, genee wéi op der Kommandozeil, kënnt Dir Kommandoen op enger Zeil schreiwen, getrennt duerch Semikolonen. Wéi och ëmmer, wann Dir d'Befehle op verschiddene Linnen schreift, ass d'Datei méi einfach ze liesen. Op alle Fall wäert d'Schuel se veraarbecht.
Astellung vun Skriptdatei Permissiounen
Späichert d'Datei en Numm myscript, an d'Aarbecht fir de Bash-Skript ze kreéieren ass bal fäerdeg. Elo bleift et just fir dës Datei ausféierbar ze maachen, soss, wann Dir probéiert se ze lafen, stitt Dir op e Feeler Permission denied.
Probéiert eng Skriptdatei mat falsch konfiguréierten Permissiounen auszeféieren
Loosst eis d'Datei ausféierbar maachen:
chmod +x ./myscript
Loosst eis elo probéieren et auszeféieren:
./myscript
Nodeems Dir d'Permissiounen agestallt hutt, funktionnéiert alles wéi et soll.
Bash Skript erfollegräich lafen
Message Ausgang
Fir Text op d'Linux Konsole auszeginn, benotzt de Kommando echo. Loosst eis d'Wësse vun dëser Tatsaach benotzen an eis Skript änneren, Erklärungen bäidroen fir d'Donnéeën, déi duerch d'Befehle schonn dra sinn:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
Dëst ass wat geschitt nodeems de aktualiséierte Skript leeft.
Output Messagen aus engem Skript
Elo kënne mir Erklärungsnotizen mat dem Kommando weisen echo. Wann Dir net wësst wéi Dir eng Datei mat Linux Tools z'änneren, oder Dir hutt de Kommando nach net gesinn echo, kuckt op dat Material.
Benotzt Variablen
Variablen erlaaben Iech Informatioun an enger Skriptdatei ze späicheren, sou wéi d'Resultater vun de Kommandoen, fir vun anere Kommandoen ze benotzen.
Et ass näischt Falsches fir eenzel Kommandoen auszeféieren ouni hir Resultater ze späicheren, awer dës Approche ass zimlech limitéiert a senge Fäegkeeten.
Et ginn zwou Zorte vu Variabelen déi a Bash Scripte benotzt kënne ginn:
Ëmfeld Variablen
Benotzer Variablen
Ëmfeld Variablen
Heiansdo musse Shellbefehle mat e puer Systemdaten schaffen. Hei ass e Beispill wéi een den aktuellen Benotzer säin Heemverzeichnis weist:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
Maacht weg datt mir eng Systemvariabel benotze kënnen $HOME an duebel Zitater, dëst wäert net verhënneren datt de System et erkennt. Dëst ass wat Dir kritt wann Dir den uewe genannte Szenario leeft.
Benotzt eng Ëmfeld Variabel an engem Skript
Wat wann Dir en Dollar Zeechen um Écran muss weisen? Loosst eis dëst probéieren:
echo "I have $1 in my pocket"
De System wäert en Dollar Zeechen an engem zitéierten String entdecken an unhuelen datt mir eng Variabel referenzéiert hunn. De Skript probéiert de Wäert vun enger ondefinéierter Variabel ze weisen $1. Dëst ass net wat mir brauchen. Wat kann een maachen?
An dëser Situatioun, mat der Flucht Charakter, e Réckschnëtt, ier den Dollar Zeechen hëlleft:
echo "I have $1 in my pocket"
De Skript wäert elo genau erausginn wat erwaart gëtt.
Benotzt eng Fluchsequenz fir en Dollar Zeechen ze drécken
Benotzer Variablen
Zousätzlech zu Ëmweltvariablen, bash Scripten erlaben Iech Är eege Variablen am Skript ze definéieren an ze benotzen. Esou Variablen halen e Wäert bis de Skript d'Ausféierung ofgeschloss huet.
Wéi mat Systemvariablen, kënnen d'Benotzervariablen mat dem Dollar Zeechen zougänglech sinn:
TNW-CUS-FMP - Promo Code fir eng Remise vun 10% op eise Servicer, verfügbar fir Aktivéierung bannent 7 Deeg
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"
Dëst ass wat geschitt nodeems Dir esou e Skript leeft.
Benotzerdefinéiert Variablen an engem Skript
Kommando Ersatz
Ee vun de nëtzlechsten Features vu Bash Scripten ass d'Fäegkeet fir Informatioun aus dem Kommandoausgang ze extrahieren an et un Variablen ze ginn, wat Iech erlaabt dës Informatioun iwwerall an der Skriptdatei ze benotzen.
Dëst kann op zwou Weeër gemaach ginn.
Benotzt de Backtick "`"
Duerch Design $()
Wann Dir déi éischt Approche benotzt, passt virsiichteg net op eng eenzeg Zitatmark an der Plaz vum Backtick. De Kommando muss an zwou sou Ikonen zougemaach ginn:
mydir=`pwd`
An der zweeter Approche gëtt datselwecht geschriwwen:
mydir=$(pwd)
An de Skript kéint um Enn esou ausgesinn:
#!/bin/bash
mydir=$(pwd)
echo $mydir
Wärend senger Operatioun ass d'Ausgab vum Kommando pwdgëtt an enger Variabel gespäichert mydir, den Inhalt vun deem, de Kommando benotzt echo, wäert op d'Konsol goen.
E Skript deen d'Resultater vun engem Kommando an enger Variabel späichert
Mathematesch Operatiounen
Fir mathematesch Operatiounen an enger Skriptdatei auszeféieren, kënnt Dir e Konstrukt benotzen wéi $((a+b)):
An e puer Szenarie musst Dir de Flux vun der Kommandoausféierung kontrolléieren. Zum Beispill, wann e bestëmmte Wäert méi wéi fënnef ass, musst Dir eng Aktioun maachen, soss eng aner. Dëst gëllt a ville Situatiounen, an hei hëlleft d'Kontrollstruktur eis if-then. A senger einfachster Form gesäit et esou aus:
if команда
then
команды
fi
Hei ass en funktionéiert Beispill:
#!/bin/bash
if pwd
then
echo "It works"
fi
An dësem Fall, wann de Kommando ausgefouert gëtt pwderfollegräich ofgeschloss gëtt, gëtt den Text "et funktionnéiert" an der Konsole ugewisen.
Loosst eis d'Wëssen benotzen déi mir hunn an e méi komplexe Skript schreiwen. Loosst eis soen datt mir e bestëmmte Benotzer musse fannen /etc/passwd, a wann Dir gelongen et ze fannen, Rapport datt et existéiert.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
Dëst ass wat geschitt nodeems Dir dëse Skript leeft.
Benotzer Sich
Hei hu mir de Kommando benotzt grepfir e Benotzer an enger Datei ze sichen /etc/passwd. Wann d'Equipe greponbekannt fir Iech, seng Beschreiwung kann fonnt ginn hei.
An dësem Beispill, wann de Benotzer fonnt gëtt, weist de Skript eng entspriechend Noriicht. Wat wann de Benotzer net fonnt ka ginn? An dësem Fall wäert de Skript einfach d'Ausféierung komplett maachen ouni eis eppes ze soen. Mir hätte gären, datt hien eis och doriwwer erzielt, also wäerte mir de Code verbesseren.
wann-dan-soen Kontroll Konstruktioun
Fir datt de Programm fäeg ass souwuel d'Resultater vun enger erfollegräicher Sich a Versoen ze berichten, benotze mir d'Konstruktioun if-then-else. Hei ass wéi et funktionnéiert:
if команда
then
команды
else
команды
fi
Wann den éischte Kommando Null zréckkënnt, dat heescht datt et erfollegräich ausgefouert gouf, ass d'Konditioun richteg an d'Ausféierung geet net laanscht d'Branche else. Soss, wann eppes anescht wéi Null zréckgeet, wat e Feeler oder e falscht Resultat bedeit, ginn d'Befehle no else.
Loosst eis de folgende Skript schreiwen:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi
Seng Hiriichtung ass an den Drain gaangen else.
Lafen e Skript mat engem if-thann-else Konstrukt
Gutt, loosst eis weidergoen an eis iwwer méi komplex Konditiounen froen. Wat wann Dir musst net eng Bedingung kontrolléieren, awer e puer? Zum Beispill, wann de gewënschten Benotzer fonnt gëtt, soll ee Message ugewisen ginn, wann eng aner Konditioun erfëllt ass, soll en anere Message ugewisen ginn, a sou weider. An esou enger Situatioun wäerten nestéiert Konditiounen eis hëllefen. Et gesäit esou aus:
if команда1
then
команды
elif команда2
then
команды
fi
Wann den éischte Kommando Null zréckkënnt, wat seng erfollegräich Ausféierung ugeet, ginn d'Befehle am éischte Block ausgefouert then, soss, wann déi éischt Conditioun falsch ass a wann den zweeten Kommando Null gëtt, gëtt den zweete Codeblock ausgefouert.
#!/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
An esou engem Skript kënnt Dir zum Beispill en neie Benotzer mat dem Kommando erstellen useradd, wann d'Sich keng Resultater produzéiert huet, oder soss eppes nëtzlech maachen.
Verglach vun Zuelen
A Skripte kënnt Dir numeresch Wäerter vergläichen. Drënner ass eng Lëscht vun relevante Kommandoen.
n1 -eq n2Gëtt richteg wann n1 gläicht n2. n1 -ge n2 Gëtt richteg wann n1méi oder gläich n2. n1 -gt n2Gëtt richteg wann n1 méi wéi n2. n1 -le n2Gëtt richteg wann n1manner oder gläich n2. n1 -lt n2Gitt richteg zréck wann n1 manner ass wéi n2. n1 -ne n2Gëtt richteg wann n1net gläich n2.
Als Beispill, loosst eis ee vun de Vergläichsbedreiwer probéieren. Bedenkt datt den Ausdrock a véiereckege Klammeren ageschloss ass.
#!/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
Dëst ass wat dëse Kommando wäert erausginn.
Verglach vun Zuelen an Scripten
Variabel Wäert val1méi wéi 5, d'Branche schlussendlech ausgefouert thenVergläichsbedreiwer an e entspriechende Message gëtt an der Konsole ugewisen.
String Verglach
Scripte kënnen och Stringwäerter vergläichen. Vergläichsbedreiwer kucken ganz einfach aus, awer Stringvergleichoperatioune hu verschidde Funktiounen, déi mir hei ënnen beréieren. Hei ass eng Lëscht vun den Opérateuren.
str1 = str2 Testt Strings fir Gläichheet, gitt richteg zréck wann d'Saiten identesch sinn.
str1 != str2Gitt richteg zréck wann d'Saiten net identesch sinn. str1 < str2Gëtt richteg wann str1manner wéi str2. str1 > str2 Gëtt richteg wann str1méi wéi str2. -n str1 Gëtt richteg wann Längt str1Iwwer null. -z str1Gëtt richteg wann Längt str1gläich op null.
Hei ass e Beispill fir Strings an engem Skript ze vergläichen:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fi
Als Resultat vun der Ausféierung vum Skript kréien mir déi folgend.
Vergläicht Strings a Skripte
Hei ass eng Feature vum Stringverglach déi derwäert ass ze ernimmen. Nämlech mussen d'">" an "<" Bedreiwer mat engem Réckschnëtt entkommen sinn, soss funktionnéiert de Skript net richteg, obwuel keng Fehlermeldungen erschéngen. De Skript interpretéiert d'">" Zeechen als Ausgangsvirdeelungskommando.
Hei ass wéi d'Aarbecht mat dësen Opérateuren am Code ausgesäit:
#!/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
Hei sinn d'Resultater vum Skript.
String Verglach, Warnung gëtt
Notéiert w.e.g. datt de Skript, obwuel ausgefouert gëtt, eng Warnung erausginn:
./myscript: line 5: [: too many arguments
Fir vun dëser Warnung lass ze kommen, schléissen mir $val2 an duebel Zitater:
#!/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
Elo funktionnéiert alles wéi et soll.
String Verglach
Eng aner Fonktioun vun den ">" an "<" Bedreiwer ass wéi se mat grousse Buschtawen a klengen Zeechen funktionnéieren. Fir dës Feature ze verstoen, loosst eis eng Textdatei mat dem folgenden Inhalt virbereeden:
Likegeeks
likegeeks
Loosst eis et retten andeems Dir et en Numm gëtt myfile, fuert dann de folgende Kommando am Terminal:
sort myfile
Et wäert d'Linnen aus der Datei esou sortéieren:
likegeeks
Likegeeks
Equipe sort, par défaut sortéiert d'Strings an opsteigend Uerdnung, dat heescht, de klenge Buschtaf an eisem Beispill ass méi kleng wéi de grousse Buschtaf. Loosst eis elo e Skript virbereeden deen déiselwecht Saiten vergläicht:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
Wann Dir et leeft, stellt sech eraus datt alles ëmgedréint ass - de klenge Buschtaf ass elo méi grouss wéi de grousse Buschtaf.
D'Sort Kommando a vergläichen Strings an enger Skriptdatei
Am Verglach Kommandoen sinn grouss Buschtawen méi kleng wéi kleng Buschtawen. String Verglach hei gëtt gemaach andeems Dir d'ASCII Coden vun de Charaktere vergläicht, d'Sortuerdnung hänkt also vun de Charaktercoden of.
Equipe sort, am Tour, benotzt der Zort Uerdnung an de System Sprooch Astellunge uginn.
Fichier Kontrollen
Vläicht ginn déi folgend Kommandoen am meeschten a Bash Scripte benotzt. Si erlaben Iech verschidde Konditioune betreffend Dateien ze kontrolléieren. Hei ass eng Lëscht vun dëse Kommandoen.
-d fileKontrolléiert ob e Fichier existéiert an e Verzeechnes ass. -e fileKontrolléiert ob de Fichier existéiert. -f file Kontrolléiert ob e Fichier existéiert an eng Datei ass. -r fileKontrolléiert ob d'Datei existéiert a liesbar ass. -s file ПKontrolléiert ob de Fichier existéiert an net eidel ass. -w fileKontrolléiert ob d'Datei existéiert a schreiwen ass. -x fileKontrolléiert ob d'Datei existéiert an ausführbar ass. file1 -nt file2 Kontrolléiert ob et méi nei ass file1wéi file2. file1 -ot file2Schecken wann eeler file1wéi file2. -O file Kontrolléiert ob d'Datei existéiert an am Besëtz vum aktuelle Benotzer ass. -G fileIwwerpréift ob d'Datei existéiert an ob seng Grupp ID mat der Grupp ID vum aktuelle Benotzer entsprécht.
Dës Kommandoen, wéi och vill anerer, déi haut diskutéiert ginn, sinn einfach ze erënneren. Hir Nimm, déi Ofkierzunge vu verschiddene Wierder sinn, weisen direkt d'Kontrollen déi se ausféieren.
Loosst eis ee vun de Kommandoen an der Praxis probéieren:
#!/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
Dëst Skript, fir en existent Verzeechnes, weist säin Inhalt.
Oplëschtung den Inhalt vun engem Verzeechnes
Mir gleewen datt Dir mat de verbleiwen Kommandoen selwer experimentéiere kënnt; si ginn all nom selwechte Prinzip benotzt.
Resultater
Haut hu mir geschwat wéi mir ufänken Bash Scripten ze schreiwen an e puer grondleeënd Saachen ofgedeckt hunn. Tatsächlech ass d'Thema vun der Bash Programméierung enorm. Dësen Artikel ass eng Iwwersetzung vum éischten Deel vun enger grousser Serie vun 11 Materialien. Wann Dir elo wëllt weiderfueren, hei ass eng Lëscht vun den Originaler vun dëse Materialien. Fir d'Bequemlechkeet ass d'Iwwersetzung vun där Dir just gelies hutt hei abegraff.
Bash Script Schrëtt fir Schrëtt - Hei schwätze mir iwwer wéi Dir Bash-Skripte ufänken ze kreéieren, d'Benotzung vu Variablen gëtt berücksichtegt, bedingungsstrukturen, Berechnungen, Vergläicher vun Zuelen, Strings, an Informatioun iwwer Dateien erausfannen.
Bash Scripting Part 3, Parameteren & Optiounen - dëst Material ass gewidmet fir Kommandozeilparameter a Schlësselen déi op Skripte weidergeleet kënne ginn, schafft mat Daten déi de Benotzer aginn an déi aus Dateien gelies kënne ginn.
Bash Scripting Part 4, Input & Output - hei schwätze mir iwwer Dateideskriptoren a mat hinnen ze schaffen, iwwer Input, Output, Fehlerstreamen, an iwwer Output Viruleedung.
Bash Scripting Part 5, Sighals & Jobs - dëst Material ass fir Linux Signaler gewidmet, hir Veraarbechtung a Skripte, a Start Skripte op engem Zäitplang.
Bash Scripting Deel 6, Funktiounen - Hei kënnt Dir léieren iwwer d'Erstelle an d'Benotzung vu Funktiounen a Skripte a Bibliothéiken z'entwéckelen.
Bash Scripting Deel 11, Erwaart Kommando - dëst Material ass dem Erwaart-Tool gewidmet, mat deem Dir Interaktioun mat interaktiven Utilities automatiséiert. Besonnesch schwätze mir iwwer Erwaard Scripten an hir Interaktioun mat Bash Scripten an aner Programmer.
Mir gleewen datt ee vun de wäertvollen Fonctiounen vun dëser Serie vun Artikelen ass, datt aus dem einfachsten, gëeegent fir Benotzer vun all Niveau, et lues a lues zu zimlech sérieux Themen féiert, déi jidderengem d'Chance ginn an der Schafung vun Linux Kommando Linn Scripten. .
Léif Lieser! Mir froen Bash Programméierungsguruen ze schwätzen iwwer wéi se d'Héichte vun hirer Meeschterschaft erreecht hunn, hir Geheimnisser deelen, a mir freeën eis Impressioune vun deenen ze kréien déi just hiren éischte Skript geschriwwen hunn.
Nëmme registréiert Benotzer kënnen un der Ëmfro deelhuelen. Umellen, wann ech glift.
Soll ech de Rescht vun der Serie vun Artikelen iwwersetzen?
Jo!
Nee brauch net
1030 Benotzer hunn gestëmmt. 106 Benotzer hu sech enthalen.