A Bash programozási nyelv

Kifejezések, operátorok

Ahogy, fentebb olvashattuk, a nyelv gyengén típusos, de implicit konverzió azért történik. Így különböző „típusú” operátorokról beszélhetünk.

Értékadás

Általános értékadás operátor az „=”-jel. Működik egyaránt string és számértékekre egyaránt. Amire oda kell figyelni, hogy nem megengedett az operátor mögött és előtt a space karakter. Ez talán nehézséget okozhat, ha valaki más nyelvekben megszokta, hogy a tagolás és a jól olvashatóság kedvéért az operátorok és értékek közé space-t szokás tenni.

Aritmetikai operátorok

Matematikai műveletek elvégzésére.

Műveleti jel Művelet Példa Eredmény
+ összeadás a=2+3 5
- kivonás a=5-1 4
* szorzás a=5*2 10
/ egész osztás a=10/3 3
** hatványozás a=2**10 1024
% maradékos osztás (modulo) 10%3 1
+= plusz-egyenlő a+=5 a=a+5
-= mínusz-egyenlő a-=2 a=a-2
*= szor-egyenlő a*=2 a=a*2
/= per-egyenlő a/=4 a=a/4
%= modulo-egyenlő a%=2 a=a%2
++ növelés 1-el a++ a=a+1
-- csökkentés 1-gyel a-- a=a-1

Bitenkénti operátorok

Bitműveletek elvégzésére.

Műveleti jel Művelet Példa Eredmény
<< léptetés jobbra 5<<2 20
<<= léptetés jobbra egyenlő a<<=2 a=a<<2
>> léptetés balra 12>>2 3
>>= léptetés balra egyenlő a>>=3 a=a>>3
& és 5&3 1
&= és egyenlő a&=5 a=a&5
| vagy 5|3 7
|= vagy egynelő a|=2 a=a|2
~ negálás ~5 -6
^ nem vagy 5^3 6
^= nem vagy egyenlős a^=3 a=a^3

Logikai oprátorok

Logikai összehasonlításokhoz.

Operátor Jelentés Példa
! tagadás if [ ! -f $FILENAME ]
&& és if [ $cond1 ] && [ $cond2 ]
|| vagy if [ $cond1 ] || [ $cond2 ]

Összehasonlító operátorok

Integerek

Operátor Jelentés Példa
-eq egyenlőség if [ "$a" -eq "$b" ]
-ne nem egyenlő if [ "$a" -ne "$b" ]
-gt nagyobb if [ "$a" -gt "$b" ]
-ge nagyobb egyenlő if [ "$a" -gt "$b" ]
-lt kisebb if [ "$a" -lt "$b" ]
-le kisebb egyenlő if [ "$a" -le "$b" ]

Stringek

Operátor Jelentés Példa
=, == egyenlő (whitespace kell!) if [ "$a" = "$b" ]
!= nem egyenlő if [ "$a" != "$b" ]
< kisebb (("$a" < "$b"))
<= kisebb egyenlő (("$a" <= "$b"))
> nagyobb (("$a" > "$b"))
>= nagyobb egyenlő (("$a" >= "$b"))
-z null(0 hosszúságú) if [ -z "$String" ]
-n nem null if [ -n "$String" ]

Összetett kifejezések (compound)

Operátor Jelentés Példa
-a logikai és exp1 -a exp2 (igazat ad vissza ha expr1 és expr 2 is igaz)
-o logikai vagy exp1 -o exp2 (igazat ad vissza expr1 vagy expr2 igaz)

Vegyes operátorok

A vessző operátor (,) összekapcsol egy vagy több aritmetikai kifejezést. Az összes aritmetikai kifejezés kiértékelésre kerül egymás után (itt felléphetnek mellékhatások). Leginkább a for ciklusnál alkalmazzák.

let "t1 = ((5 + 3, 7 - 1, 15 - 4))" echo "t1 = $t1" # t1 = 11 # Here t1 is set to the result of the last operation. Why? let "t2 = ((a = 9, 15 / 3))" # Set "a" and calculate "t2". echo "t2 = $t2 a = $a" # t2 = 5 a = 9

File operátorok

Operátor Teszteset
-e Létezik-e fájl
-f Reguláris-e a file
-d A fájl könyvtár
-h A fájl szimbólikus link
-L A fájl szimbólikus link
-b A fájl egy block device
-c A fájl egy karakter device
-p A fájl egy pipe
-S A fájl egy socket
-s A fájl nem 0 méretű
-r A fájl olvasási engedéllyel rendelkezik
-w A fájl írási engedéllyel rendelkezik
-x A fájl futtatási engedéllyel rendelkezik
-g sgid flag be van állítva
-u suid flag be van állítva
-k "sticky bit" be van állítva
-t A fájl hozzá van rendelve a terminálhoz
-N A fájl módosítva lett az utolsó olvasás óta
-O Saját magam vagyok a fájl tulajdonosa
-G A csoport id megegyezik a sajátommal
F1 -nt F2 Az F1 fájl újabb mint az F2
F1 -ot F2 Az F1 fájl régebbi mint az F2
F1 -ef F2 Az F1 és F2 fájlok hard linkek ugyanarra a fájlra
! Tagadás, invertálja a fenti teszteseteket

Reguláris kifejezések

Reguláris kifejezések és vezérlő karakterek

A reguláris kifejezés (regular expression) egy olyan, bizonyos szintaktikai szabályok szerint leírt string, amivel meghatározható stringek egy halmaza. Nevének rövidítésére gyakran aregexp vagy regex kifejezés használatos.Az ilyen kifejezés valamilyen minta szerinti szöveg keresésére (esetleg cseréjére) használható.

A bash is támogatja reguláris kifejezések használatát, egy reguláris kifejezés egy vagy több részt tartalmazhat a következőkből:

A gyakorlatban főleg string manipulációra és keresésre használhatjuk fel a reguláris kifejezéseket. Nézzünk pár gyakran használ jelet és példát.

Jel Illeszkedés Példa
* minden szám szoros előfordulásra, beleértve a zéró előfordulást "1133*" illeszkedik a 11 + egy vagy több 3-asra
. bármilyen karakterre, kivéve az újsor karaktert "13." illeszkedik a 13 + legalább egy bármilyen karakterre, de a 13-ra (tehát amikor hiányzik a bármilyen karakter).
$ a reguláris kifejezés végén meghatározza, hogy ez kell hogy legyen a találat vége "^$" az üres sorokra illeszkedik.
^ sor elejére, de néha a kontextustól függően jelentheti egy karakterhalmaz negáltját is "^a*" az a-val kezdődőekre illeszkedik
[] közrezár egy meghatározott karaktersorozatot, melyből valamelyiknek illeszkednie kell "[xyz]" illeszkedik a x, y, vagy z karakterek egyikére.
"[c-n]" ileszkedik a c-től az n-ig bármelyik karakterre.
\ escape karakter, amely azt jelenti, hogy a karaktert eredeti jelentése szerint kell vizsgálni A "\$" a dollár jelet mint karakter értelmezi, nemmint speciális karakter
<...\> szóvég határokat jelöl "\" illeszkedik a „the” szóra, de csak és kizárólag arra
? nulla vagy egy előfordulásra az előző reguláris kifejezésből "?a" maximum 1 db a-t tartalmaz
+ legalább egy előfordulásra az előző reguláris kifejezésből "?b" legalább egy b-t tartalmaz
\{n\} pontosan n-db előfordulásra az előző reguláris kifejezésből "c{3}" pontosan az "aaa"-ra illeszkedik
( ) közrezárnak reguláris kifejezés csoportokat kifejezésekben hasznos
| vagy-nak felel meg alternatívákban használatos (a|b|c)

POSIX karakter osztályok

Ez egy alternatív megadása mintáknak, melyekre a reguláris kifejezésünknek illeszkednie kell. Sokkal beszédesebb és áttekinthető reguláris kifejezést eredményez a használatuk. Általában a gyakran használt kifejezések helyettesítésére lettek létrehozva.

[:alnum:] alfabetikus karakterek és számok. Megegyezik az A-Za-z0-9 kifejezéssel.
[:alpha:] csak alfabetikus karakterek. Megegyezik az A-Za-z kifejezéssel.
[:blank:] space és tabulátor karakterek.
[:cntrl:] kontroll karakterek.
[:digit:] decimális számok. Megegyezik a 0-9 kifejezéssel.
[:graph:] grafikus nyomtatható karakterek. ASCII 33 – 126 tartományú karakterekre illeszkedik. Megegyezik a [:print:] kifejezéssel, de nem fogadja el a space karaktert
[:lower:] kisbetűs alfabetikus karakterek. Megegyezik az a-z kifejezéssel.
[:space:] whitespace karakterek(space és horizontális tab).
[:upper:] nagybetűs alfabetikus karakterek. Megegyezik az A-Z kifejezéssel.
[:xdigit:] hexadecimális számok. Megegyezik a 0-9A-Fa-f kifejezéssel.