Ma a bash-scriptekről fogunk beszélni. Ez — , amelyeket a bash kabinettekhez írtak. Vannak más kabinettek is, mint például — zsh, tcsh, ksh, de mi a bash-ra fogunk összpontosítani. Ez az anyag mindenki számára készült, az egyetlen követelmény a Linux.
A parancssori szkriptek olyan parancsok halmaza, amelyeket be lehet írni a billentyűzeten, fájlokba gyűjtve és egy közös célra összevonva. Ezen parancsok működésének eredménye önálló értékkel bírhat, vagy más parancsok bemeneteként szolgálhat. A szkriptek erőteljes módja a gyakran végzett műveletek automatizálásának.
Tehát, ha a parancssorra gondolunk, lehetővé teszi több parancs egyidejű végrehajtását, ha pontosvesszővel adja meg őket:
pwd ; whoami Valójában, ha ezt kipróbáltad a terminálodban, az első bash-scripted, amely két parancsot használ, már meg is íródott. Így működik. Először a parancs pwd megmutatja a jelenlegi munkakönyvtár adatait, majd a parancs whoamimegmutatja a bejelentkezett felhasználó adatait.
Egy hasonló megközelítéssel annyi parancsot kombinálhatsz egy sorban, amennyit csak akarsz, a korlátozás csupán a maximális argumentum szám, amelyet a programnak átadhatsz. Ezt a korlátozást a következő parancs segítségével határozhatod meg:
getconf ARG_MAXA parancssor nagyszerű eszköz, de a parancsokat minden alkalommal be kell írni, amikor szükség van rájuk. Mi lenne, ha egy parancsot egy fájlba írnál, és egyszerűen ezt a fájlt idéznéd elő a végrehajtáshoz? Valójában az a fájl, amiről beszélünk, a parancssori szkript.
Hogyan működnek a bash-scriptek
Hozz létre egy üres fájlt a következő parancs használatával: touchA fájl első sorában meg kell adni, hogy pontosan milyen környezetet fogunk használni. Minket a bashérdekel, így a fájl első sora a következőképpen fog kinézni:
#!/bin/bash A fájl többi sorában a hashtagek megjegyzéseket jelölnek, amelyeket a környezet nem dolgoz fel. Azonban az első sor különleges eset, itt a hashtag után egy felkiáltójel áll (ezt a sorozatot hívjuk ), és a bashúton keresztül jelzik a rendszernek, hogy a szkript kifejezetten érte készült. bash.
A parancsokat sortörés választja el, a megjegyzéseket hashtag jelöléssel kiemeljük. Így néz ki:
#!/bin/bash
# This is a comment
pwd
whoamiItt, akárcsak a parancssorban, parancsokat is írhatunk egy sorba, pontosvesszővel elválasztva. Azonban ha a parancsokat külön sorokban írjuk, a fájl könnyebben olvasható. Bárhogy is legyen, a környezet feldolgozza őket.
A szkript fájl jogosultságainak beállítása
Mentse el a fájlt a következő néven: myscript, és a bash-szkript létrehozása szinte befejeződött. Most már csak annyit kell tennie, hogy végrehajthatóvá teszi a fájlt, különben, ha megpróbálja futtatni, hibaüzenettel fog találkozni: Permission denied.

A szkript fájl futtatásának megkísérlése helytelenül beállított jogosultságokkal
Tegyük a fájlt végrehajthatóvá:
chmod +x .\/myscriptMost próbáljuk meg végrehajtani:
.\/myscriptA jogosultságok beállítása után minden úgy működik, ahogyan kell.

Sikeresen futó bash-szkript
Üzenetek megjelenítése
A szöveg kiírásához a Linux konzolba az echoparancsot használjuk. Éljünk a tudásunkkal, és szerkesszük meg szkriptünket, hozzáadva magyarázatokat a már meglévő parancsok által kiírt adatokhoz:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiÍgy fog kinézni a frissített szkript futtatása után.

Üzenetek kiírása a szkriptből
Most már magyarázó feliratokat is kiírhatunk a echoparancs használatával. Ha nem tudja, hogyan kell módosítani egy fájlt a Linux eszközeivel, vagy nem találkozott még a echoparanccsal, nézze meg a fordalmat.
Változók használata
A változók lehetővé teszik, hogy szkript-fájlokban tároljunk információt, például parancsok végrehajtásának eredményeit, hogy más parancsok is felhasználhassák azokat.
Nincs semmi rossz abban, ha külön parancsokat hajtunk végre anélkül, hogy a végrehajtásuk eredményét tárolnánk, de ennek a megközelítésnek a lehetőségei meglehetősen korlátozottak.
Két típusú változó létezik, amelyeket bash-szkriptekben használhatunk:
- Környezeti változók
- Felhasználói változók
Környezeti változók
Időnként a shell csapatokban szükség van bizonyos rendszeradatok kezelésére. Például így tudjuk megjeleníteni a jelenlegi felhasználó home könyvtárát:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Vegyük figyelembe, hogy a rendszer változót használhatjuk $HOME dupla idézőjelek között, ez nem akadályozza meg a rendszer felismerését. Íme, mi történik, ha végrehajtjuk a fenti scriptet.

Környezeti változó használata a scriptben
És mi van, ha a dollárjelet kell megjeleníteni a képernyőn? Próbáljuk így:
echo "I have $1 in my pocket" A rendszer észleli a dollárjelet az idézőjelek közötti szövegben, és úgy dönt, hogy egy változóra hivatkozunk. A script megpróbálja kiírni egy nem definiált változó értékét $1. Ez nem az, amire szükségünk van. Mit tegyünk?
Ilyen helyzetben segíthet a vezérlőszimbólum, a visszafelé dőlt vonal használata a dollárjel előtt:
echo "I have $1 in my pocket"Most a script pontosan az vártat fogja kiírni.

Vezérlő szekvencia használata a dollárjel megjelenítésére
Felhasználói változók
A környezeti változók mellett a bash-script-ek lehetővé teszik saját változók létrehozását és használatát a scriptben. Ezek a változók megőrzik értéküket, amíg a script végrehajtása be nem fejeződik.
A rendszer változókhoz hasonlóan a felhasználói változókra is a dollárjellel hivatkozhatunk:
TNW-CUS-FMP — egy promóciós kód, amellyel 10% kedvezményt kap a szolgáltatásainkra, 7 napon belül aktiválható.
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Ilyen eredmény keletkezik, ha elindítjuk ezt a scriptet.

Felhasználói változók a scriptben
Parancs behelyettesítése
A bash-szkriptek egyik leghasznosabb lehetősége a parancsok kimenetéről információk kiemelése és változókhoz rendelése, ami lehetővé teszi az információk bárhol való felhasználását a script fájlban.
Ezt két módon lehet megtenni.
- A visszafelé aposztróf "`" használatával
- A konstrukcióval
$()
Az első megközelítésnél figyeljen arra, hogy a visszafelé aposztróf helyett ne vezessen be egy egyszeres idézőjelet. A parancsot két ilyen jel közé kell zárni:
mydir=`pwd`A második megközelítésnél ugyanazt így írják:
mydir=$(pwd)A script végül így nézhet ki:
#!/bin/bash
mydir=$(pwd)
echo $mydir Futása során a parancs kimenete pwdel lesz tárolva a mydirváltozóban, amelynek tartalma a echoparancs segítségével

a konzolra kerül.
Matematikai műveletek
A matematikai műveletek végrehajtásához a script fájlban a következő felépítést lehet használni: $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Matematikai műveletek a szkriptben
If-then vezérlési struktúra
Bizonyos szkriptekben szükség van a parancsok végrehajtásának folyamatának irányítására. Például ha egy érték nagyobb mint öt, akkor egy műveletet kell végrehajtani, különben egy másikat. Ez sok helyzetben alkalmazható, és ebben segít nekünk a vezérlési struktúra. if-then. A legegyszerűbb formája így néz ki:
if parancs
then
parancsok
fiÍme egy működő példa:
#!/bin/bash
if pwd
then
echo "It works"
fi Ebben az esetben, ha a parancs végrehajtása pwdsikeresen befejeződik, a konzolra a "it works" szöveg kerül kiírásra.
Használjuk fel a rendelkezésünkre álló tudást, és írjunk egy bonyolultabb szkriptet. Mondjuk, meg kell keresni egy felhasználót a /etc/passwd, és ha sikerült megtalálni, értesíteni kell arról, hogy létezik.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiÍme, mi történik a szkript futtatása után.

Felhasználó keresése
Itt a grepparancsot használtuk a felhasználó keresésére a fájlban. /etc/passwd. Ha a parancs grepnem ismerős, annak leírását megtalálhatja .
Ebben a példában, ha a felhasználó megtalálható, a szkript megfelelő üzenetet ír ki. De mi történik, ha nem tudjuk megtalálni a felhasználót? Ebben az esetben a szkript egyszerűen befejezi a végrehajtást, anélkül, hogy bármit mondana. Szeretnénk, ha ezt is megmondaná nekünk, ezért javítjuk a kódot.
If-then-else vezérlési struktúra
Annak érdekében, hogy a program mind a sikeres keresés, mind a kudarc eredményeit közölni tudja, a következő felépítést fogjuk használni: if-then-else. Íme, hogyan van felépítve:
if parancs
then
parancsok
else
parancsok
fi Ha az első parancs nulla értéket ad vissza, ami a sikeres végrehajtást jelenti, a feltétel igaz lesz, és a végrehajtás nem megy át az else. Ebben az esetben, ha valami nem nullát ad vissza, ami kudarcnak vagy hamis eredménynek számít, a következő parancsok végrehajtásra kerülnek. else.
Írjunk egy ilyen szkriptet:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi Az végrehajtás az else.

If-then-else struktúrával indított szkript futási ágán haladt.
Nos, folytassuk a következő lépésekkel, és tegyük fel a kérdést a bonyolultabb feltételekről. Mi van, ha nem egy, hanem több feltételt kell ellenőrizni? Például, ha a szükséges felhasználót megtaláltuk, egy üzenetet kell megjeleníteni, ha egy másik feltétel is teljesül — egy másik üzenet, és így tovább. Ilyen helyzetben segítenek nekünk a beágyazott feltételek. Így néz ki:
if parancs1
then
parancsok
elif parancs2
then
parancsok
fi Ha az első parancs nullát ad vissza, ami a sikeres végrehajtására utal, az első blokk parancsai fognak végrehajtódni. then, különben, ha az első feltétel hamis lesz, és ha a második parancs nullát ad vissza, a második kódblokk fog végrehajtódni.
#!/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 Egy hasonló scriptben például új felhasználót hozhatunk létre a parancs segítségével useradd, ha a keresés nem adott eredményt, vagy tehetünk valami egyéb hasznosat.
Számok összehasonlítása
A scriptekben összehasonlíthatók a numerikus értékek. Az alábbiakban a megfelelő parancsok listáját találja.
n1 -eq n2Igaz értéket ad vissza, han1egyenlőn2.
n1 -ge n2Igaz értéket ad vissza, han1nagyobb vagy egyenlőn2.
n1 -gt n2Igaz értéket ad vissza, han1nagyobbn2.
n1 -le n2Igaz értéket ad vissza, han1kisebb vagy egyenlőn2.
n1 -lt n2Igaz értéket ad vissza, ha n1 kisebbn2.
n1 -ne n2Igaz értéket ad vissza, han1nem egyenlőn2.
Példaként próbáljuk ki az egyik összehasonlító operátort. Figyeljen arra, hogy a kifejezés négyzetes zárójelek közé van zárva.
#!/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"
fiEz a parancs kimenete.

A számok összehasonlítása a scriptekben
A változó értéke val1nagyobb, mint 5, ezért a megfelelő üzenet kerül a konzolra. thenaz összehasonlító operátor ágában.
Szövegek összehasonlítása
A szkriptekben szöveges értékek is összehasonlíthatók. Az összehasonlító operátorok viszonylag egyszerűek, azonban a szöveges összehasonlításoknak vannak bizonyos sajátosságai, amelyekre később kitérünk. Íme az operátorok listája.
str1 = str2Összehasonlítja a szövegeket egyenlőség szempontjából, igazat ad vissza, ha a szövegek azonosak.
str1 != str2Igazat ad vissza, ha a szövegek nem azonosak.
str1 < str2Igazat ad vissza, hastr1kisebb, mintstr2.
str1 > str2Igazat ad vissza, hastr1nagyobb, mintstr2.
-n str1Igazat ad vissza, ha a hosszastr1nagyobb, mint nulla.
-z str1Igazat ad vissza, ha a hosszastr1nullával egyenlő.
Íme egy példa a szövegek összehasonlítására a szkriptben:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiA script végrehajtásának eredményeként a következőt kapjuk.

Szövegek összehasonlítása a scriptekben
Itt van egy sor összehasonlításának egy jellemzője, amelyről érdemes beszélni. Nevezetesen, a „>” és „” jelet kimeneti átirányítási parancsként értelmezi.
Itt van, hogyan néz ki ezekkel az operátorokkal való munka kódban:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiItt vannak a szkript eredményei.

Számsor összehasonlítva, figyelmeztetés megjelenítve
Vegye figyelembe, hogy a szkript, bár végrehajtódik, figyelmeztetést ad:
./myscript: 5. sor: [: túl sok argumentum Annak érdekében, hogy megszabaduljunk ettől a figyelmeztetéstől, zárjuk $val2 dupla idézőjelek közé:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiMost már minden úgy működik, ahogy kell.

Szövegek összehasonlítása
A „>” és „<” operátoroknak van egy másik jellemzője is, hogy hogyan működnek a nagy- és kisbetűkkel. Ennek megértéséhez készítsünk egy szöveges fájlt a következő tartalommal:
Likegeeks
likegeeks Mentjük el, a nevét megadva myfile, majd a terminálban hajtsunk végre egy ilyen parancsot:
sort myfileEz a fájlban található sorokat az alábbiak szerint fogja rendezni:
likegeeks
Likegeeks A parancs sort, alapértelmezés szerint a sorokat növekvő sorrendbe rendezi, tehát a kisbetűs betű a mi példánkban kisebb, mint a nagybetűs. Most készítsünk egy szkriptet, amely összehasonlítja ezeket a sorokat:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiHa futtatjuk, kiderül, hogy éppen fordítva van – a kisbetűs betű most nagyobb, mint a nagybetűs.

A sort parancs és a sorok összehasonlítása a szkript fájlban
Az összehasonlító parancsokban a nagybetűk kisebbek, mint a kisbetűk. Az összehasonlítás itt az ASCII karakterek kódjaival történik, így a rendezési sorrend a karakterek kódjától függ.
A parancs sort, a maga részéről, az aktuális nyelvi beállításokban meghatározott rendezési sorrendet használja.
Fájlok ellenőrzése
Valószínűleg az alábbi parancsokat a bash-szkriptekben a leggyakrabban használják. Ezek lehetővé teszik különböző fájlra vonatkozó feltételek ellenőrzését. Itt található ezeknek a parancsoknak a listája.
-d fájlEllenőrzi, hogy a fájl létezik-e és könyvtár-e.
-e fájlEllenőrzi, hogy a fájl létezik-e.
-f fájlEllenőrzi, hogy a fájl létezik-e és fájl-e.
-r fájlEllenőrzi, hogy a fájl létezik-e és olvasható-e.
-s fájlEllenőrzi, hogy a fájl létezik-e és nem üres.
-w fájlEllenőrzi, hogy a fájl létezik-e és írható-e.
-x fájlEllenőrzi, hogy a fájl létezik-e és végrehajtható-e.
file1 -nt file2Ellenőrzi, hogy újabb-efile1, mintfile2.
file1 -ot file2Ellenőrzi, hogy régebbi-efile1, mintfile2.
-O fileEllenőrzi, hogy létezik-e a fájl, és hogy a jelenlegi felhasználó-e a tulajdonosa.
-G fileEllenőrzi, hogy létezik-e a fájl, és hogy a csoportazonosítója megegyezik a jelenlegi felhasználó csoportazonosítójával.
Ezek a parancsok, mint ahogy sok másik is, amit ma átbeszéltünk, könnyen megjegyezhetők. Neveik, amelyek a különböző szavak rövidítései, közvetlenül utalnak az általuk végzett ellenőrzésekre.
Próbáljunk ki egy parancsot a gyakorlatban:
#!/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"
fiEz a szkript a létező könyvtár tartalmát fogja kiírni.

A könyvtár tartalmának kiírása
Feltételezzük, hogy a többi parancsot önállóan is ki tudja próbálni, mindegyikük ugyanazzal az elvvel működik.
Összegzés
Ma arról beszéltünk, hogyan kezdjük el a bash-szkriptek írását, és áttekintettük néhány alapvető dolgot. A bash-programozás témája valójában hatalmas. Ez a cikk a nagy, 11 anyagból álló sorozat első részének fordítása. Ha szeretné, hogy azonnal folytassuk, itt van az eredeti anyagok listája. A kényelem kedvéért ide került az a cikk is, amelynek fordítását éppen olvasta.
- — itt arról van szó, hogyan kezdjük el a bash-szkriptek írását, a változók használatának áttekintése, a feltételes szerkezetek, a számok és szövegek összehasonlítása, valamint a fájlokkal kapcsolatos információk megismerése.
- — itt a for és while ciklusok működését tárgyaljuk.
- — ez az anyag a parancssori paraméterekről és azokról a kulcsokról szól, amelyeket a szkripteknek át lehet adni, a felhasználó által bevitt adatok kezeléséről és a fájlokból olvasott információkról.
- — itt a fájldeszkiptorokról és azok használatáról van szó, a bemeneti, kimeneti és hibafolyamokról, valamint a kimenet átirányításáról.
- — ez az anyag a Linux jeleivel foglalkozik, azok feldolgozásával a szkriptekben, valamint a szkriptek ütemezett futtatásával.
- — itt megtudhatja, hogyan kell függvényeket létrehozni és használni a szkriptekben, valamint könyvtárakat fejleszteni.
- — ez a cikk a sed folyó szövegszerkesztő használatával foglalkozik.
- — ez az anyag a dátummal dolgozó awk programozásról szól.
- — itt olvashat arról, hogyan használhatók a reguláris kifejezések bash-scriptekben.
- — itt olyan módszerek találhatók, amelyeket üzenetek küldésére alkalmazhatunk felhasználóknak, valamint a lemezmonitorozás módszere.
- — Ez az anyag az Expect eszközről szól, amely lehetővé teszi interaktív programokkal való automatizált interakciót. Különösen az expect-scriptek és azok bash-scriptekkel, valamint más programokkal való együttműködéséről lesz szó.
Úgy gondoljuk, hogy ennek a cikksorozatnak az egyik értékes tulajdonsága, hogy a legegyszerűbb, bármilyen szintű felhasználók számára megfelelő tartalomról indulva fokozatosan vezet a komolyabb témákhoz, lehetőséget adva mindenkinek a Linux parancssoros scriptek fejlesztésében való előrelépésre.
Kedves olvasók! Kérjük a bash-programozás guruait, hogy meséljenek arról, hogyan érték el a mesterség csúcsait, osszák meg titkaikat, és várjuk azoktól is, akik most írták meg első scriptjüket, hogy mit tapasztaltak.
Csak a regisztrált felhasználók vehetnek részt a szavazáson. , kérem.
Fordítsuk le a cikkek ciklusának további részeit?
Igen!
Nem, nem szükséges
1030 felhasználó szavazott. 106 felhasználó tartózkodott.
Forrás: habr.com
