Bash programozás
# A parancsértelmező által ismert parancsok fűzhetőek össze egy "programba" vagy más néven shell script-be. (lásd .bat)
# A program első sorában minden esetben meg kell adni a futtató programot (shell-t), jelen esetben a bash-t.
# Tehát a fájl kezdete legyen bash esetén:
#!/bin/bash
# Felkiáltójel nélkül más futtató program (parancsértelmező) is megadható a program első sorában.
# Futtatási jog nélkül nem futtatható, ezért
chmod +x programnev
# Program futtatásához a lehetséges parancs(ok)
./programnev
sh programnev
bash programnev
Írásjelek
\ Escape-karakter:
# Bourne Again Shell escape-karaktere. Többek között ezzel a jellel lehet elérni,
# hogy az őt követő speciális karakter elveszítse módosító hatását.
$ Dollárjel
# Segítségével változó neve és értéke között tudunk különbséget tenni.
# Ha $valtozo-t írunk, az a változónk értékét fogja visszaadni.
" " Kétszeres idézőjel
# Az idézőjelek arra valók, hogy egyes karakterek vagy lefoglalt szavak speciális
# jellegét feloldják.
' ' Egyszeres idézőjel
# Megakadályozza a héjat (shell), hogy a $-t a változók jelzésének tekintse
[] Szögletes zárójel
# Intervallumok megadására szolgáló eszköz
? Kérdőjel
# Egy elem helyettesítésére szolgáló jel
* Csillag
# Joker karakter, bármennyi karakter helyettesítésére
` Felsővessző: (jobbra tartó - AltGr + 7)`
# Operátor, mely a két ` ` között lévő jelsort végrehajtja, és a kimenetét adja vissza
# úgy, hogy az új sor karakter helyére szőközt rak.
# Kettőskereszt
# Kommentezés eszköze. (megjegyzés)
& And jel
# Parancsok háttérbeli futtatására szolgáló eszköz.
# Pl.: updatedb &
&& Kettős And jel
# Parancsok futtathatóak egymás után.
# && esetén csak akkor fut le a második parancs, ha az első sikeres volt, azaz visszatérési értéke 0
# Pl.: cp -R /var/www /home/backup && shutdown -h now
; Pontosvessző
# Parancsok futtathatóak egymás után.
# ; esetén a második parancs futása nem függ az első visszatérési értékétől, tehát
Dedikált környezeti változók
BASH : aktuális shell
BASHPID : aktuális bash PID-je
EUID : effektív user uid
EDITOR : Az alapértelmezett szövegszerkesztő
HOME : Aktuális felhasználói könvvtár elérési útvonala
MAIL : Beérkező emailek alapértelmezett könyvtára
PATH : Azok az elérési útvonalak, melyekben a shell futtatható állományokat keres
OSTYPE : Az operációs rendszer típusa
PAGER : Az alapértelmezett file nézegető elérési útvonalát kell tartalmaznia
PWD : Az éppen aktuális munkakönyvtár (Szimbólikus linknél nem egyezik meg a pwd kimenetével!)
DIRSTACK: szintén
OLDPWD : Előző munkakönyvtár elérése
SHELL : A jelenleg futó shell teljes elérési útvonala
TERM : A terminál típusát tartalmazza
IFS : internal field separator
RANDOM : random szám generátor
SSH_CONNECTION : aktív SSH kapcsolat(ok) megadása "SRC SRCPORT DST DSTPORT" formában
Ezek értékeinek kiíratására a következő parancs használható:
echo $VALTOZO_NEV
Shell változók
Értékadó utasítással.:
valtozo=érték : a változónk értéke legyen "ertek"
valtozo=$(echo 2+3 | bc) : a változónk értéke legyen 2+3, bc-vel kiszámolva.
export valtozo : shell változó környezeti változóvá alakítása
# Amennyiben szükséges permanens beállítás, úgy:
# az /etc/profile -ba is szükséges felvenni
unset valtozo : ha már nincs szükség rá, mint környezeti változó.
Belső változók
echo $0
# A futó program neve
echo $$
# A futó program PID-je
echo $?
# A legutolsó parancs visszatérési értéke
# Ha 0 : igaz (true)
# Ha 1 vagy több : hamis (false)
echo $_
# a legutóbbi begépelt parancs legutolsó argumentuma
# pl echo macilaci esetén macilaci
Csővezetékek (pipe-ok)
# " | " segítségével lehet egy program kimenetét (stdout) egy másik program
bemenetére (stdin) csatolni. pl.:
ps aux | grep iceweasel
# Az összes folyamat listázásának kimenetét a grep szűrő bemenetére irányítja, amely az iceweasel-t keresi.
# stdin - standard input, jele : fd0 (alapértelmezett bemenet, pl.: billentyűzet)
# stdout - standard output, jele : fd1 (alapértelmezett kimenet, pl.: monitor)
# stderr - standard error, jele : fd2 (alapértelmezett hibacsatorna)
./program 2> hiba.txt
# program lefuttatása és az esetleges hibacsatorna (stderr) hiba.txt-be irányítása
# az stdout helyett.
./program 1> kimenet.txt 2>&1
# program lefuttatását követően a kimenetet (stdout) a kimenet.txt be menti, valamint
# az esetleges hibák (stederr) hozzáfűzésre kerülnek a txt-hez.
cat file1 | sort | wc -w > file2
# file1-et tartalmát a sort-nak adja át, az rendezi, majd átadja a wc-nek, majd a wc
# kimenete a file2-be íródik
Néhány egyszerű példa.:
#!/bin/bash
echo Hello World!
# A szokásos Hello World kiírása, a program futtatásakor.
#!/bin/bash
STR="Hello World"
echo $STR
# Az STR változó deklarálása, majd értékének kiíratása.
#!/bin/bash
tar -cZf /var/backup.tgz /home/user
# /home/user tartalmát menti és tömöríti a /var/backup-ba.
#!/bin/bash
OF= /home/user/$(date +%Y%m%d).tgz
tar -cZf $OF /home/user/sajt
# Egyszerű backup script, mely a /hme/user/sajt tartalmát, napi dátummal
# ellátva egy .tgz állományba tömörítve menti.
#!/bin/bash
if ["foo" = "foo1" ]; then
echo "a feltétel igaz"
else
echo "a feltétel hamis"
fi
# Egyszerű if-else szerkezet
Egyszerű szerkezetek.: if, while, until, for
-if szerkezet.:
---------------
#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" = "$T2" ]; then
echo "a feltetel igaz"
else
echo "a feltetel hamis"
fi
# eldönti T1 és T2 értékéről, hogy egyenlőek e.
#!/bin/bash
if [ -f /etc/passwd ]
then
echo "letezik!"
else
echo "nem letezik!"
fi
# eldönti, hogy /etc/passwd file létezik-e vagy sem.
# Blokkos eszköz (pl. pendrive) esetén -b kapcsolót kell használni!
#!/bin/bash
test -f /etc/passwd && echo "letezik" || echo "nem letezik"
# A egyel feljebb levő probléma másik megoldása.
# Blokkos eszköz (pl. pendrive) esetén -b kapcsolót kell használni!
-File szintű kapcsolók
if [ -a file ] then ...
-a : igaz, ha létező file
-e : igaz, ha létező file
-b : igaz, ha blokkos eszköz (pl /dev/sda)
-c : igaz, ha "karakterspeciális" file Pl.: (/dev/ttyACM0 - ez egy nokia telefon.)
-d : igaz, ha könyvtár
-f : igaz, ha regular file
-G : igaz, ha a futtató user csoportjáé a file
-N : igaz, ha módosították az utolsó olvasás óta
-O : igaz, ha a futtató useré a file
-r : igaz, ha olvasható?
-L : igaz, ha symbolic link
-s : igaz, hogy nem üres
-z : igaz, hogy üres
-w : igaz, ha írható a scriptet futtató user számára
# Tagadás mindenhol használható, azaz.:
! -f : nem regular file?
-Változó szintű kapcsolók
if [ file == file2 ] then ...
file1 == file2 igaz hogy egyenlőek?
file1 != file2 igaz hogy nem egyenlőek?
# Például:
if [ "$(echo Tibi)" != "$(echo Peti)" ]; then
echo "Tibi nem Peti! :)"
exit 1 # Stop!
fi
-Szám szintű kapcsolók
if [ $foo -eq 3 ] then ...
$foo -eq 3 : igaz, ha foo értéke egyenlő 3-al (Equal)
$foo -ne 3 : igaz, ha foo értéke nem egyenlő 3-al (Not-Equal)
$foo -gt 3 : igaz, ha foo értéke nagyobb 3-nál (Greater Than)
$foo -ge 3 : igaz, ha foo értéke nagyobb egyenlő 3-al (Greater or Equal)
$foo -lt 3 : igaz, ha foo értéke kisebb 3-nál (Less than)
$foo -le 3 : igaz, ha foo értéke kisebb egyenlő 3-al (Less or Equal)
"$foo" == "10" foo értéke 10?
# Dupla zárójellel használhatóak ==, !=, >=, >, <, <=..
(($foo <= 3)) foo értéke nagyobb egyenlő 3-nál
-while szerkezet.:
------------------
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo a szamlalo erteke: $COUNTER
let COUNTER=COUNTER+1
done
# COUNTER változót 1-el növeli addíg, amíg el nem éri a 10-et.
-until szerkezet.:
------------------
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo a szamlalo erteke: $COUNTER
let COUNTER-=1
done
# COUNTER változót 20-as kezdőértékről 1-el csökkenti, amíg el nem éri a 10-et.
-for ciklus (C szerű)
---------------------
#!/bin/bash
for i in `seq 1 10`;do
echo $i
done
# az i változó felveszi 1-től 10-ig az értékeket, majd ki is írja a képernyőre
-for ciklus (a könyvtár elemeire)
---------------------------------
#!/bin/bash
for i in $( ls );do
echo a konyvtar elemei: $i
done
# kiírja a képernyőre az aktuális könyvtár elemeit
Egyszerű függvények.:
#!/bin/bash
function quit {
exit
}
function hello {
echo Hello!
}
hello
quit
echo foo
# Egyszerű fv. deklarálás, majd az értékek kiíratása ( a 10. sor sosem fut le!)
#!/bin/bash
function quit {
exit
}
function e {
echo $1
}
e Hello
e World
quit
echo foo
# Egyszerű fv. deklarálás, majd az értékek kiíratása ( a 11. sor sosem fut le!)
Aritmetikai műveletek.:
expr
expr 10 + 30
echo $(expr 10 + 30)
echo `expr 10 + 30`
# egyszerű összeadások több formában, kimenetük 40
expr 20 - 30
echo $(expr 20 - 30)
echo `expr 20 - 30`
# egyszerű kivonások, kimenetük -10
expr 10 \* 20
echo $(expr 10 \* 20)
# egyszerű szorzás, kimenet 200
# a * jelet escape-elni "\" kell bash-ban!
expr 30 / 10
# egész osztás, kimenete 3
expr 30 / 16
# egész osztás, kimenete 1
expr 40 % 20
# maradékos osztás, kimenete 0
expr 40 % 25
# maradékos osztás, kimenete 15
let
let val1=10*4
echo $val1
# szorzás, kimenete 40
let "val2 = 8 / 3"
echo $val2
# egész osztás, kimenete 2
let val3=10-3
echo $val3
# kivonás, kimenete 2
#!/bin/bash
let "val5=50+$1"
echo $val5
# hello.sh néven elmentjük, futtatva:
./hello.sh 10
# összeadás paraméterrel, kimenete 60
bash
echo $((3+9))
# egyszerű összeadás kimenet 12
echo $((10*5+15))
# szorzás és összeadás kombinációja, kimenet 65
echo $((27 / 9))
# egész osztás, kimenete 3
echo $((27 / 10))
# egész osztás, kimenete 2
echo $((60 % 20))
# maradékos osztás, kimenete 0
echo $((50 % 45))
# maradékos osztás, kimenete 5
bc
echo 3+2 | bc
# összeadás bc-vel, kimenete 5
echo 3+2*4/2-2 | bc
# összeadás, szorzás, osztás, kivonás kombinációja, kimenete 5
echo "55/3" | bc
echo "55/3" | bc -l
echo "scale=2; 55/3" | bc
# osztás bc-vel, kimenetük rendre:
# 18
# 18.33333333333333333333
# 18.33