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.
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.
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.
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.
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.
Ü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.
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.
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.
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.
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)):
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.
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.
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.
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.
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.
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.
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ű.
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.
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.
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.
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.
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ó.
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.
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.
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.
A felmérésben csak regisztrált felhasználók vehetnek részt. Bejelentkezés, kérem.