Bash szkriptek: a kezdet

Bash szkriptek: a kezdet
Bash Scripts 2. rész: Loopok
Bash Scripts, 3. rész: Parancssori opciók és kapcsolók
Bash Scripts 4. rész: Bemenet és kimenet
Bash Scripts, 5. rész: Jelek, háttérfeladatok, szkriptkezelés
Bash Scripts, 6. rész: Funkciók és könyvtárfejlesztés
Bash Scripts, 7. rész: sed és szövegszerkesztő
Bash szkriptek, 8. rész: awk adatfeldolgozó nyelv
Bash Scripts 9. rész: Reguláris kifejezések
Bash Scripts 10. rész: Gyakorlati példák
Bash szkriptek, 11. rész: interaktív segédprogramok elvárása és automatizálása

Ma a bash szkriptekről fogunk beszélni. ez - parancssori szkriptek, a bash shellhez írva. Vannak más shell-ek is, 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 feltétel a munkaképesség parancs sor Linux.

Bash szkriptek: a kezdet

A parancssori szkriptek ugyanazon parancsok gyűjteményei, amelyek a billentyűzetről beírhatók, fájlokba gyűjthetők, és egyesíthetők valamilyen közös céllal. Ebben az esetben a csapatok munkájának eredménye vagy független értékű lehet, vagy bemenő adatként szolgálhat más csapatok számára. A szkriptek hatékony módszert jelentenek a gyakran végrehajtott műveletek automatizálására.

Bash szkriptek: a kezdet

Tehát, ha a parancssorról beszélünk, akkor lehetővé teszi több parancs egyidejű végrehajtását, pontosvesszővel elválasztva:

pwd ; whoami

Valójában, ha kipróbáltad ezt a terminálodban, az első, két parancsot tartalmazó bash szkripted már meg van írva. Ez így működik. Csapat az első pwd információkat jelenít meg az aktuális munkakönyvtárról, majd a parancsról whoamiinformációkat jelenít meg arról a felhasználóról, akivel bejelentkezett.

Ezzel a megközelítéssel tetszőleges számú parancsot kombinálhat egy sorban, az egyetlen korlát a programnak átadható argumentumok maximális száma. Ezt a korlátot a következő paranccsal határozhatja meg:

getconf ARG_MAX

A parancssor nagyszerű eszköz, de minden alkalommal be kell írnia a parancsokat, amikor szükség van rájuk. Mi lenne, ha egy parancskészletet írnánk egy fájlba, és egyszerűen meghívnánk azt a fájlt, hogy végrehajtsuk őket? Valójában azt a fájlt, amelyről beszélünk, parancssori szkriptnek hívják.

Hogyan működnek a bash szkriptek

Hozzon létre egy üres fájlt a paranccsal touch. Az első sorában jelezni kell, hogy melyik shell-t fogjuk használni. Érdekel minket a bash, tehát a fájl első sora a következő lesz:

#!/bin/bash

A fájl többi sora a hash szimbólumot használja azon megjegyzések jelzésére, amelyeket a shell nem dolgoz fel. Az első sor azonban egy speciális eset, van egy hash, amelyet egy felkiáltójel követ (ezt a sorozatot ún. ügy) és az elérési út bash, jelezze a rendszernek, amelyre a szkriptet kifejezetten létrehozták bash.

A shell parancsokat soremelés, a megjegyzéseket hash jel választja el. Így néz ki:

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

Itt is, csakúgy, mint a parancssorban, egy sorba írhatunk parancsokat, pontosvesszővel elválasztva. Ha azonban a parancsokat különböző sorokba írja, a fájl könnyebben olvasható. A héj mindenesetre feldolgozza őket.

Parancsfájl-engedélyek beállítása

Mentse el a fájlt, adjon neki nevet myscript, és a bash szkript létrehozásának munkája már majdnem kész. Most már csak az van hátra, hogy ezt a fájlt futtathatóvá tegyük, különben ha megpróbálja futtatni, hibaüzenetet fog kapni Permission denied.

Bash szkriptek: a kezdet
Nem megfelelően konfigurált engedélyekkel rendelkező parancsfájl futtatásának kísérlete

Tegyük futtathatóvá a fájlt:

chmod +x ./myscript

Most próbáljuk meg végrehajtani:

./myscript

Az engedélyek beállítása után minden úgy működik, ahogy kell.

Bash szkriptek: a kezdet
A bash szkript sikeresen fut

Üzenet kimenet

Ha szöveget szeretne kiadni a Linux konzolra, használja a parancsot echo. Használjuk fel ennek a ténynek az ismeretét és szerkesszük a szkriptünket, adjunk magyarázatot a már benne lévő parancsok által kiadott adatokhoz:

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

Ez történik a frissített szkript futtatása után.

Bash szkriptek: a kezdet
Üzenetek kiadása szkriptből

Most magyarázó megjegyzéseket jeleníthetünk meg a paranccsal echo. Ha nem tudja, hogyan szerkeszthet egy fájlt Linux-eszközökkel, vagy még nem látta a parancsot echo, vessünk egy pillantást ezt anyag.

Változók használata

A változók lehetővé teszik az információk, például a parancsok eredményeinek szkriptfájlban történő tárolását más parancsok általi használatra.

Nincs abban semmi baj, ha az egyes parancsokat az eredmények tárolása nélkül hajtjuk végre, de ennek a megközelítésnek a lehetőségei meglehetősen korlátozottak.

A bash szkriptekben kétféle változó használható:

  • Környezeti változók
  • Felhasználói változók

Környezeti változók

Néha a shell parancsoknak működniük kell bizonyos rendszeradatokkal. Íme egy példa az aktuális felhasználó kezdőkönyvtárának megjelenítésére:

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

Kérjük, vegye figyelembe, hogy használhatunk rendszerváltozót $HOME idézőjelben ez nem akadályozza meg a rendszert a felismerésében. Ezt kapja, ha futtatja a fenti forgatókönyvet.

Bash szkriptek: a kezdet
Környezeti változó használata szkriptben

Mi a teendő, ha dollárjelet kell megjeleníteni a képernyőn? Próbáljuk meg ezt:

echo "I have $1 in my pocket"

A rendszer érzékeli a dollárjelet egy idézőjeles karakterláncban, és feltételezi, hogy egy változóra hivatkoztunk. A szkript megpróbálja megjeleníteni egy nem definiált változó értékét $1. Nem erre van szükségünk. Mit kell tenni?

Ebben a helyzetben az escape karakter, a fordított perjel használata a dollárjel előtt segít:

echo "I have $1 in my pocket"

A szkript most pontosan azt adja ki, amit várnak.

Bash szkriptek: a kezdet
Escape szekvencia használata dollárjel nyomtatásához

Felhasználói változók

A környezeti változókon kívül a bash szkriptek lehetővé teszik saját változók meghatározását és használatát a szkriptben. Az ilyen változók addig tartanak értéket, amíg a szkript be nem fejezi a végrehajtást.

A rendszerváltozókhoz hasonlóan a felhasználói változók a dollárjellel érhetők el:
TNW-CUS-FMP - 10% kedvezményt biztosító promóciós kód szolgáltatásainkból, 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"

Ez történik egy ilyen szkript futtatása után.

Bash szkriptek: a kezdet
Egyéni változók egy szkriptben

Parancscsere

A bash szkriptek egyik leghasznosabb funkciója, hogy információkat nyerhet ki a parancskimenetből, és változókhoz rendelheti, így ezeket az információkat bárhol felhasználhatja a szkriptfájlban.

Ezt kétféleképpen lehet megtenni.

  • A "`" backtick használata
  • Tervezés szerint $()

Az első megközelítés alkalmazásakor ügyeljen arra, hogy ne tegyen egyetlen idézőjelet a hátsó tick helyére. A parancsot két ilyen ikonba kell foglalni:

mydir=`pwd`

A második megközelítésben ugyanezt így írják le:

mydir=$(pwd)

A forgatókönyv pedig így nézhet ki:

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

Működése során a parancs kimenete pwdváltozóban lesz elmentve mydir, amelynek tartalma a paranccsal echo, a konzolra kerül.

Bash szkriptek: a kezdet
Egy parancsfájl, amely egy változóba menti a parancs eredményét

Matematikai műveletek

Ha matematikai műveleteket szeretne végrehajtani egy parancsfájlban, használhat hasonló konstrukciót $((a+b)):

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

Bash szkriptek: a kezdet
Matematikai műveletek egy szkriptben

ha-akkor vezérlő konstrukció

Egyes forgatókönyvekben szabályoznia kell a parancsvégrehajtás folyamatát. Például, ha egy bizonyos érték nagyobb, mint öt, akkor egy műveletet kell végrehajtania, ellenkező esetben egy másikat. Ez sok helyzetben alkalmazható, és itt a vezérlési struktúra a segítségünkre lesz if-then. A legegyszerűbb formájában így néz ki:

if команда
then
команды
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ásra kerül pwdsikeresen befejeződik, a konzolon az „it works” szöveg jelenik meg.

Használjuk a rendelkezésünkre álló ismereteket, és írjunk bonyolultabb forgatókönyvet. Tegyük fel, hogy meg kell találnunk egy bizonyos felhasználót /etc/passwd, és ha sikerült megtalálnia, jelentse, hogy létezik.

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

Ez történik a szkript futtatása után.

Bash szkriptek: a kezdet
Felhasználói keresés

Itt a parancsot használtuk grepfelhasználó kereséséhez egy fájlban /etc/passwd. Ha a csapat grepszámodra ismeretlen, leírása megtalálható itt.

Ebben a példában, ha a felhasználó megtalálható, a szkript megjeleníti a megfelelő üzenetet. Mi van, ha a felhasználó nem található? Ebben az esetben a szkript egyszerűen befejezi a végrehajtást anélkül, hogy bármit is mondana nekünk. Szeretnénk, ha erről is mesélne nekünk, így javítani fogjuk a kódot.

ha-akkor-else vezérlő konstrukció

Annak érdekében, hogy a program sikeres keresés és kudarc eredményéről is beszámolhasson, a konstrukciót használjuk if-then-else. Így működik:

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

Ha az első parancs nullát ad vissza, ami azt jelenti, hogy sikeresen végrehajtották, a feltétel igaz lesz, és a végrehajtás nem folytatódik az ág mentén else. Ellenkező esetben, ha a nullától eltérőt ad vissza, ami meghibásodást vagy hamis eredményt jelezne, az utána következő parancsok else.

Írjuk meg a következő 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

Kivégzése a csatornába ment else.

Bash szkriptek: a kezdet
Szkript futtatása if-then-else konstrukcióval

Nos, menjünk tovább, és kérdezzük meg magunkat az összetettebb feltételekről. Mi van, ha nem egy, hanem több feltételt kell ellenőriznie? Például, ha a kívánt felhasználó megtalálható, akkor egy üzenetet kell megjeleníteni, ha más feltétel teljesül, egy másik üzenetet kell megjeleníteni, és így tovább. Ilyen helyzetben a beágyazott feltételek segítenek nekünk. Ez így néz ki:

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

Ha az első parancs nullát ad vissza, ami a sikeres végrehajtást jelzi, akkor az első blokkban lévő parancsok végrehajtásra kerülnek then, ellenkező esetben, ha az első feltétel hamis, és ha a második parancs nullát ad vissza, a második kódblokk végrehajtásra kerül.

#!/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 ilyen szkriptben például új felhasználót hozhat létre a paranccsal useradd, ha a keresés nem hozott eredményt, vagy csináljon valami más hasznosat.

Számok összehasonlítása

A szkriptekben össze lehet hasonlítani a numerikus értékeket. Az alábbiakban a vonatkozó parancsok listája található.

n1 -eq n2Igazat ad vissza, ha n1 jelentése n2.
n1 -ge n2 Igazat ad vissza, ha n1több vagy egyenlő n2.
n1 -gt n2Igazat ad vissza, ha n1 több mint n2.
n1 -le n2Igazat ad vissza, ha n1kisebb vagy egyenlő n2.
n1 -lt n2Igazat ad vissza, ha n1 kisebb, mint n2.
n1 -ne n2Igazat ad vissza, ha n1nem egyenlő n2.

Példaként próbáljuk meg az egyik összehasonlító operátort. Vegye figyelembe, hogy a kifejezés szögletes zárójelben van.

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

Ez az, amit ez a parancs fog kiadni.

Bash szkriptek: a kezdet
Számok összehasonlítása scriptekben

Változó érték val15-nél nagyobb, az ág végrehajtásra kerül thenösszehasonlító operátort, és egy megfelelő üzenet jelenik meg a konzolon.

String összehasonlítás

A szkriptek a karakterláncok értékeit is összehasonlíthatják. Az összehasonlító operátorok meglehetősen egyszerűnek tűnnek, de a karakterlánc-összehasonlítási műveleteknek vannak bizonyos jellemzői, amelyeket az alábbiakban érintünk. Itt található az operátorok listája.

str1 = str2 Ellenőrzi a karakterláncok egyenlőségét, és igaz értéket ad vissza, ha a karakterláncok azonosak.
str1 != str2Igaz értéket ad vissza, ha a karakterláncok nem azonosak.
str1 < str2Igazat ad vissza, ha str1kevesebb, mint str2.
str1 > str2 Igazat ad vissza, ha str1több mint str2.
-n str1 Igazat ad vissza, ha hosszúság str1Nulla felett.
-z str1Igazat ad vissza, ha hosszúság str1egyenlő nullával.

Íme egy példa a karakterláncok összehasonlítására egy szkriptben:

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

A szkript végrehajtása eredményeként a következőket kapjuk.

Bash szkriptek: a kezdet
Stringek összehasonlítása szkriptekben

Íme a karakterlánc-összehasonlítás egyik jellemzője, amelyet érdemes megemlíteni. Ugyanis a ">" és a "<" operátorokat fordított perjellel kell eltávolítani, különben a szkript nem fog megfelelően működni, bár hibaüzenet nem jelenik meg. A szkript a ">" jelet kimenet átirányítási parancsként értelmezi.

Így néz ki a kódban ezekkel az operátorokkal való munka:

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

Íme a forgatókönyv eredményei.

Bash szkriptek: a kezdet
String összehasonlítás, figyelmeztetés adott

Kérjük, vegye figyelembe, hogy a szkript, bár végrehajtva, figyelmeztetést ad ki:

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

Hogy megszabaduljunk ettől a figyelmeztetéstől, levonjuk a következtetést $val2 idézőjelben:

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

Most minden úgy működik, ahogy kell.

Bash szkriptek: a kezdet
String összehasonlítás

A ">" és "<" operátorok másik jellemzője, hogy hogyan működnek a kis- és nagybetűkkel. A funkció megértése érdekében készítsünk egy szöveges fájlt a következő tartalommal:

Likegeeks
likegeeks

Mentsük el úgy, hogy nevet adunk neki myfile, majd futtassa a következő parancsot a terminálban:

sort myfile

Így rendezi a sorokat a fájlból:

likegeeks
Likegeeks

Csapat sort, alapértelmezés szerint növekvő sorrendbe rendezi a karakterláncokat, vagyis a példánkban szereplő kisbetű kisebb, mint a nagy. Most készítsünk egy szkriptet, amely összehasonlítja ugyanazokat a karakterláncokat:

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

Ha lefuttatja, kiderül, hogy minden fordítva van - a kisbetű most nagyobb, mint a nagybetű.

Bash szkriptek: a kezdet
A rendezési parancs és a karakterláncok összehasonlítása egy parancsfájlban

Az összehasonlító parancsokban a nagybetűk kisebbek, mint a kisbetűk. A karakterlánc-összehasonlítás itt a karakterek ASCII kódjainak összehasonlításával történik, a rendezési sorrend tehát a karakterkódoktól függ.

Csapat sort, viszont a rendszer nyelvi beállításaiban megadott rendezési sorrendet használja.

Fájlellenőrzések

Talán a következő parancsokat használják leggyakrabban bash szkriptekben. Lehetővé teszik a fájlokkal kapcsolatos különféle feltételek ellenőrzését. Itt található ezeknek a parancsoknak a listája.

-d fileEllenőrzi, hogy létezik-e fájl, és az egy könyvtár.
-e fileEllenőrzi, hogy a fájl létezik-e.
-f file Ellenőrzi, hogy létezik-e fájl, és fájl-e.
-r fileEllenőrzi, hogy a fájl létezik és olvasható-e.
-s file ПEllenőrzi, hogy a fájl létezik-e, és nem üres-e.
-w fileEllenőrzi, hogy a fájl létezik-e és írható-e.
-x fileEllenőrzi, hogy a fájl létezik-e és végrehajtható-e.
file1 -nt file2 Ellenőrzi, hogy újabb file1mint file2.
file1 -ot file2Ellenőrzi, hogy régebbi-e file1mint file2.
-O file Ellenőrzi, hogy a fájl létezik-e, és az aktuális felhasználó tulajdonában van-e.
-G fileEllenőrzi, hogy a fájl létezik-e, és hogy a csoportazonosítója megegyezik-e az aktuális felhasználó csoportazonosítójával.

Ezek a parancsok, valamint sok más ma tárgyalt parancs könnyen megjegyezhető. Nevük, mivel különböző szavak rövidítései, közvetlenül jelzik az általuk végzett ellenőrzéseket.

Próbáljuk ki az egyik 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"
fi

Ez a szkript egy meglévő könyvtárhoz megjeleníti a tartalmát.

Bash szkriptek: a kezdet
Egy könyvtár tartalmának listázása

Úgy gondoljuk, hogy a fennmaradó parancsokkal saját maga is kísérletezhet, mindegyik ugyanazon elv szerint történik.

Eredményei

Ma arról beszéltünk, hogyan kezdjünk neki bash szkriptek írásának, és néhány alapvető dologról beszéltünk. Valójában a bash programozás témája óriási. Ez a cikk egy 11 anyagból álló nagy sorozat első részének fordítása. Ha most szeretné folytatni, itt található ezen anyagok eredeti példányainak listája. A kényelem kedvéért az imént olvasott fordítást itt találjuk.

  1. Bash Script lépésről lépésre — itt arról van szó, hogyan kezdjünk hozzá bash szkriptek létrehozásához, szóba kerül a változók használata, leírjuk a feltételes struktúrákat, számításokat, számok, karakterláncok összehasonlítását, valamint a fájlok információinak megismerését.
  2. Bash Scripting 2. rész, Bash the awesome — itt feltárulnak a for és while ciklusokkal való munkavégzés jellemzői.
  3. Bash Scripting 3. rész, Paraméterek és beállítások — ez az anyag a parancssori paramétereknek és a parancsfájloknak átadható kulcsoknak szól, amelyek a felhasználó által beírt és fájlokból kiolvasható adatokkal dolgoznak.
  4. Bash Scripting 4. rész, Bemenet és kimenet - itt a fájlleírókról és a velük való munkavégzésről, a bemenetről, a kimenetről, a hibafolyamokról és a kimeneti átirányításról van szó.
  5. Bash Scripting 5. rész, Sighals & Jobs — ez az anyag a Linux-jeleknek, azok szkriptekben való feldolgozásának és a szkriptek ütemezett indításának szentelve.
  6. Bash Scripting 6. rész, Funkciók — itt megismerheti a szkriptekben lévő függvények létrehozását és használatát, valamint a könyvtárak fejlesztését.
  7. Bash Scripting 7. rész, A sed használata — ezt a cikket a sed streaming szövegszerkesztővel való együttműködésnek szenteljük.
  8. Bash Scripting 8. rész, Az awk használata — ezt az anyagot az awk adatfeldolgozó nyelven történő programozásnak szentelték.
  9. Bash Scripting 9. rész, Reguláris kifejezések — itt olvashat a reguláris kifejezések használatáról bash szkriptekben.
  10. Bash Scripting 10. rész, gyakorlati példák — itt vannak technikák a felhasználóknak küldhető üzenetekkel való munkavégzéshez, valamint egy módszer a lemezfigyeléshez.
  11. Bash Scripting 11. rész, Expect Command — ez az anyag az Expect eszköznek szól, amellyel automatizálhatja az interaktív segédprogramokkal való interakciót. Különösen az elvárt szkriptekről és azok bash szkriptekkel és más programokkal való interakciójáról beszélünk.

Véleményünk szerint ennek a cikksorozatnak az egyik értékes tulajdonsága, hogy a legegyszerűbbtől kezdve, bármilyen szintű felhasználó számára alkalmas, fokozatosan egészen komoly témákhoz vezet, így mindenkinek esélye van előrelépni a Linux parancssori szkriptek létrehozásában. .

Kedves olvasóink! Megkérjük a bash programozó gurukat, hogy beszéljenek arról, hogyan jutottak el mesterségük csúcsaira, osszák meg titkaikat, és várjuk az első forgatókönyvet megírók benyomásait.

Bash szkriptek: a kezdet

A felmérésben csak regisztrált felhasználók vehetnek részt. Bejelentkezés, kérem.

Fordítsam le a cikksorozat többi részét?

  • Igen!

  • Nincs szükség

1030 felhasználó szavazott. 106 felhasználó tartózkodott.

Forrás: will.com

Hozzászólás