BASH SCRIPT SHELL JEGYZETEK 1
TARTALOM Paraméterek... 4 Változók... 4 Környezeti változók... 4 Szűrők... 4 grep... 4 sed... 5 cut... 5 head, tail... 5 Reguláris kifejezések... 6 *... 6 +... 6?... 6 {m,n}... 6 (elemi_kifejezes_1 elemi_kifej_2)... 6 Vezérlési szerkezetek... 6 if... 6 case... 7 for... 8 while... 8 until... 8 Egyéb parancsok... 8 expr... 8 wc... 9 sort... 9 Megoltt feladatok... 9 until menü... 9 Online felhasználók kiírása... 10 2
Számjegyek összeadása... 10 Faktoriális kiszámító... 11 E-mail készítő... 11 3
PARAMÉTEREK #echo $1 $2 $3 echo "Paraméterek száma:" $# echo "Összes paraméter:" $@ #i=8 #echo "az $i-ik paraméter ${!i}" VÁLTOZÓK echo -n "Adja meg a változó értékét: " read VALTOZO echo A változó értéke $VALTOZO KÖRNYEZETI VÁLTOZÓK echo $HOME #A HOME könyvtárad elérési útját írja ki echo $PATH #A PATH változó azt tárolja, hogy milyen abszolút #útvonalakon keresse a Linux a futtatható állományokat echo $PWD #Az aktuális könyvtár elérési útvonala echo $USER #Az aktuális felhasználó echo $TERM #A terminális típusa echo $SHELL #A shell típusát tárolja SZŰRŐK GREP A grep parancs segítségével fájlokban vagy könyvtárakban kereshetünk megatt szavakat, szórészleteket. KAPCSOLÓK -c Kiírja az illeszkedést mutató sorok számát. -num -eminta -ffáj Az illeszkedést mutató sorok környezetükkel együtt lesznek kinyomatatva, azaz ezen sorok előtt és utáni num számú sor is nyomtatásra kerül. A mintá-t használja mintának. Hasznos, ha a minta-jellel kezdődik. A mintát a fájl-ból veszi. -i Nem különbözteti meg a kis- és nagybetűket sem a mintá-ban, sem a bemeneti fájlban. 4
-L Elhagyja a szokásos kimenetet, és csak azon fájlok neveit adja meg, amelyekből nem származna kimenet. -l Elhagyja a szokásos kimenetet, és csak azon fájlok neveit adja meg, amelyekből származna kimenet. -v Megfordítja az illeszkedés értelmét: a mintához nem illeszkedő sorokat választja ki. -w Csak azokat a sorokat választja ki, amelyekben az illeszkedés teljes szavakból származik. Azaz az illeszkedést mutató szövegrész előtt és után nem állhat betű, szám vagy aláhúzásjel. -x Csak teljes sorokkal való illeszkedést vizsgál. SED Stream editor, azaz folyamszerkesztő. A bemenetet a kimenetre másolja, de közben egy parancsokat tartalmazó szkriptnek megfelelően megszerkeszti. A leggyakrabban cserére használjuk, ilyenkor így kell megadni: sed 's/mit/mire/g' sed 's/mit/mire/g' fajl # a bemeneten bejön, kicseréli, a kimenetre kerül az eredmény # a fájlt olvassa be, kicseréli és a kimenetre kerül az eredmény KAPCSOLÓK sed 's/mit/mire/i' sed 's/mit/mire/gi' sed 's/mit/mire/' sed 's/mit/mire/g' # Kis- és nagybetűk között nincs különbsé, minden sorban legfeljebb egyszer cserél # Kis- és nagybetűk között nincs különbség, a teljes sorban akár többször is cserél # Van különbség a kis- és nagybetűk között; minden sorban legfeljebb egyszer cserél # Van különbség a kis- és nagybetűk között; a teljes sorban akár többször is cserél CUT A bemenet (standard input) vagy a paraméterben megatt fájlok minden sorának egy att részét vágja ki. $ cut -f2 # 2. mező (határolójel: tabulátor karakter) $ cut -f4,2 # 2.,4. mező - sorrend nem számít $ cut -f-4,6- # 4. mezőig és a 6.-tól Mező kivágása, a mezőelválasztó karakter megadásával: $ cut -f2 -d: # 2. mező, kettőspont az elválasztó $ cut -f2,6- -d' ' # szóköz az elválasztó karakter Oszlopok kivágása $ cut -c-3,6- # pontosan úgy, mint a -f opcióval, minden sor 3. karakteréig aztán a 6.-tól HEAD, TAIL A head a kapott szöveg elejét, a tail a végét adja tovább. head -n10 fájl cat fajl tail -n 10 # kiírja a fájl első 10 sorát # kiírja a fájl utolsó 10 sorát 5
REGULÁRIS KIFEJEZÉSEK Egy olyan, bizonyos szintaktikai szabályok szerint leírt kifejezés, amivel meghatározható szövegek egy halmaza. * Az elemi_egyseg egymás utáni 0, 1, 2,... előfordulása. A 0* reguláris kifejezésnek az üres szöveg vagy egy akárhány nullából álló jelsorozat felel meg. + Az elemi_egyseg egymás utáni 1, 2,... előfordulása a + reguláris kifejezésnek egy vagy több egymás utáni a betű felel meg. A + jel a kiterjesztett reguláris kifejezés karakterek közé tartozik, a grep parancs nem ismeri.? Az elemi_egyseg egymás utáni 0 vagy 1 előfordulása a -?28 reguláris kifejezésnek a 28 és a -28 sztringek felelnek meg. A? jel a kiterjesztett reguláris kifejezés karakterek közé tartozik, a grep parancs nem ismeri. {M,N} Az elemi_egyseg egymás utáni, legalább m-szeres, legfeljebb n-szeres előfordulása. Ha m=n, akkor elég {m} -et írni. Ha n nincs megadva (de a vessző igen), akkor végtelen. A log (sajnos) nem egységes, ugyanis előfordulnak olyan regkif megvalósítások, amikben a { és } helyett a \{ és \} párokat kell használni. (ELEMI_KIFEJEZES_1 ELEMI_KIFEJ_2) A () zárójelek között az elemi kifejezések (amelyek száma végtelen is lehet) csoportot alkot. Ezeket jellel szokás elkülöníteni egymástól melynek jelentése vagy, azaz vagy az egyik elemi_kifejezes vagy a másik elemi_kifejezes teljesül. MEGJEGYZÉS [] belsejében elvesztik speciális jelentésüket az egyéb, a reguláris kifejezés speciális jelei. A [.*] regkif-nek (csak) egy pont vagy egy csillag felel meg. VEZÉRLÉSI SZERKEZETEK IF # Beolvasunk egy számot, és eldönti a script, hogy kisebb, nagyobb vagy # egyenlő-e 10-zel. echo -n "Adjon meg egy számot: " read N if [ $N -lt 10 ] then 6
echo "$N kisebb 10-nél." else if [ $N -eq 10 ] then echo "$N egyenlő 10-zel." else echo "$N nagyobb 10-nél." fi fi MŰVELETI JELEK -eq -ne -lt -le -gt -ge equal (egyenlő) not equal (nem egyenlő) less than (kevesebb mint) less than or equal kevesebb (mint vagy egyenlő) greater than (nagyobb mint) greater than or equal (nagyobb mint vagy egyenlő) = equal string (két szöveg megegyezik)!= not equal string (két szöveg nem egyezik)! not (a kifejezés eredményének negáltja) -a and (és) -o or (vagy) CASE case $1 in "-d") date ;; "-w") who ;; "-l") ls ;; *) echo "Rossz paraméterrel futtatod." esac 7
FOR # 5-ször írja ki, hogy Hajrá Csepel! for i in {1..5} # vagy for i in `seq 5` echo "Hajrá Csepel!" ne WHILE # 5-ször kiírja, hogy Hajrá Csepel! i=1 while [ $i -le 5 ] echo "Hajrá Csepel!" i=$(( $i + 1 )) #i=`expr $i + 1` ne UNTIL # 5-ször kiíratunk valami szöveget i=1 until [ $i -gt 5 ] # until [! $i -lt 5 ] echo "Hajrá Csepel!" i=`expr $i + 1` ne EGYÉB PARANCSOK EXPR Matematikai műveletek elvégzése echo `expr 5 + 3` # Eredmény: 8 MŰVELETI JELEK + Összeadás 8
- Kivonás \* Szorzás \/ Osztás \% Osztási maradék WC Megszámolja a bemenetben lévő karakterek/szavak/sorok számát. KAPCSOLÓK -m A fájlban lévő karakterek száma. -c A fájlban lévő bájtok száma. -w A fájlban lévő szavak száma. -l A fájlban lévő sorok száma. $ echo "egy kettő három" wc w #Eredmény: 3 SORT Rendezi a bemenetét. KAPCSOLÓK -r Rendezi a fájl sorait fordított sorrendben -n A sorok elején álló számok szerint rendezi -u Az azonos sorokat csak egyszer írja ki MEGOLDOTT FELADATOK UNTIL MENÜ # Menürendszer készítése until ciklussal until clear echo "Válasszon az alábbi menüpontok közül!" echo echo "1. Másolás" echo "2. For ciklus példa" echo "3. While ciklus példa" 9
echo "4. Until ciklus példa" echo "0. Kilépés" echo echo -n "Adja meg a megfelelő számot: " read szam [ $szam -eq 0 ] case $szam in 1)./masol.sh ;; 2)./hajra_for.sh ;; 3)./hajra_while.sh ;; 4)./hajra_until.sh ;; *) echo "Ejnye-bejnye, rossz menüpontot adtál meg." esac sleep 3 ne echo "Örültem, hogy engem választott!" ONLINE FELHASZNÁLÓK KIÍRÁSA # Írjuk ki az éppen bejelentkezett felhasználókat! for i in `who cut -f1 -d" " sort -u` echo "$i bejelentkezett!" ne SZÁMJEGYEK ÖSSZEADÁSA # Bekér egy számot, majd összeadja a számjegyeket. echo -n "Írjon be egy számot: " read n sum=0 while [ $n -gt 0 ] sum=`expr $sum + \( $n \% 10 \)` n=`expr $n \/ 10` ne echo "A számjegyek összege: $sum." 10
FAKTORIÁLIS KISZÁMÍTÓ # Kiírja egy szám faktoriálisát. A szám paraméter. 0!=1 i=$1 faktorialis=1 while [ $i -gt 0 ] faktorialis=`expr $faktorialis \* $i` i=`expr $i - 1` ne echo "A $1 szám faktoriálisa: $faktorialis." E-MAIL KÉSZÍTŐ cat $1 sed 's/[ _]kukac[ _]/@/g; s/[ _]nospam[ _]/@/g; s/[ _]at[ _]/@/g; s/[ _]pont[ _]/./g; s/[ _]t[ _]/./g;' 11