A Bash programozási nyelv

Nyelvi elemek

Jelkészlet

A Bash egy rendszerbe ágyazott nyelv. Éppen ezért a futtatható kód jelkészlete mindig az éppen aktuális rendszer jelkészlete. Mivel az azonosítók leírására speciális szabályok vonatkoznak, így maximum a program kimenetének karakterkódolásával adódhat problémánk, a futásával azonban nem.

Nevek

A Bash különbséget tesz kis és nagy betű között, erre az azonosítók létrehozásánál különösképpen figyelni kell, ugyanis észre vehetetlen hibák származhatnak belőle.

Azonosítók

A nyelv 3 fajta változót különböztet meg: globális (környezeti), lokális és felhasználó által definiált.

Globális vagy másnevén környezeti változók nevei csupa nagybetűsek. Ezeket env vagy printenv utasításokkal jeleníthetjük meg. Ezek az utasítások az sh-utils csomag részei.

$ printenv SHELL=/bin/bash HISTSIZE=1000 SSH_TTY=/dev/pts/1 HOME=/root LOGNAME=root CVS_RSH=ssh

Lokális változók kizárólag az aktuális shell-ben érhetőek el. A set beépített utasítás (mindenféle paraméter nélkül) az összes változót megjeleníti (beleértve a környezeti változókat). A kimenet az aktuális lokalizáció szerint lesz sorrendezve egy újrafelhasználható formában.

local lvar="Local content" echo -e "Local variable value with in the function"

Felhasználó által definiált változókat szokás a fentiektől eltérően csupa kisbetűvel írni. Ez azonban csak ajánlás használhatunk kis és nagy betűket vegyesen. Változók nevei tartalmazhatnak számokat, de nem kezdődhetnek számmal.

declare option variablename

Eljárás- és függvénynevek

Nem tartalmazhatnak egyéb karaktert betűk, számok és aláhúzáson kívül, valamint nem kezdődhetnek számmal. Ha érvénytelen függvénynevet delarálunk fatal error hibát kapunk „non-interactive” shell-ben.

#!/bin/bash function quit { exit } function hello { echo Hello! } hello quit echo foo

Literálok

Escape karakter

Az idéző jel mentes '\' jel a Bash-ben az escape karakter, tehát az új sor kivételével megörzi az utána lévő karakter literális értékét. Ha a \newline –t használunk, és a backslash maga nem idézőjelek között szerepel, a \newline sorfolytatást jelent.

Szimpla idézőjel

Szimpla idézőjelek közé tett karakterek (''') megőrzik literál értéküket. A szimpla idézőjel nem jelenik meg a szimpla idézőjelek között, ha csak nem használunk előtte escape karaktert.

Dupla idézőjel

Dupla idézőjelek közé tett karakterek ("'") mindegyike megőrzi literál értékét a '$', '`', '\' karakterek kivételével. Tehát a '$' és '`' karakterek megőrzik eredeti jelentésüket. A '\'csak akkor őrzi meg eredeti jelentését ha a következő karakterek valamelyike követi: '$', '`', '"', '\', vagy newline. Dupla időzőjelek közé tett backlash-t tehát ha a fenti karakterek valamelyike követ, akkor az nem jelenik meg a szövegben. A dupla idéző jelek között dupla idézőjelet csak escape karakter segítségével tehetünk be.

ANSI C speciális karakterek

Lehetőség nyílik speciális vezérlő karakterek beillesztésére is. Ezek rendszerint a konzolnak jelentenek plusz információt. Felsorolunk pár ilyen speciális karaktert. Ezek mindegyike escape karakterrel kezdődik.

\n Új sor \r Kocsivissza \t Tabulátor \v Vertikális tabulátor \b Backspace \a "alert" (beep or flash) \0xx Oktális karakter ASCII megfelelője \" Apostrof \$ Dollár jel \\ Backslash \a alert (bell) \b backspace \e Egy escape karakter (nem ANSI C) \f form feed \t horizontal tab \' Szimplaidézőjel \nnn 8-bites karakter, melynek octális értéke nnn \xHH 8-bites karakter, melynek hexadecimális értéke értéke xHH \cx control-x karakter

Lokalizáció specifikus fordítás

A dupla idézőjelek közé tett dollár jel ('$') azt eredményezi, hogy a string lokálisra fordul le (tehát az éppen aktuális nyelvre). Ha a jelenlegi lokális C vagy POSIX, a dollár jel nem kerül értelmezésre.

Egyes rendszerek az LC_MESSAGES válozó által tárolt katalógusokat használják a fordításhoz. Mások a TEXTDOMAIN shell változó tartalma alapján generálnak katalógust. Ha a TEXTDOMAIN változót használjuk, akkor be kell állítani a TEXTDOMAINDIR változót oda ahol a katalógus fájlunk található és '.mo' végződéssel kell ellátni a filet. Pl.: TEXTDOMAINDIR/LC_MESSAGES/LC_MESSAGES/TEXTDOMAIN.mo.

Argumentumok

Lehetőségünk van a scriptjeinknek kezdeti paramétereket átadni. Ezt úgy tehetjük meg, hogy indításkor a script neve után szókzzel elválasztva felsoroljuk a paramétereket. Ezeket a paramétereket a scriptben a $ jel valamint a paraméter sorszámának leírásával tudjuk elérni az átadás sorrendjében, tehát a $1, $2,…, $n rendre az 1, 2,…, n-edik kapott paraméter (a paraméterek számozása 1-el kezdődik).

Az argumentumokat elérhetjük egy speciális módon is a args=("$@") egy tömböt hoz létre, az argumentumokról. Erről bővebben a típus fejezetben olvashatunk.

FILE1=$1 wc $FILE1 for FILE1 in "$@" do

Megjegyzések

Az úgynevezett „non-interactive” shell-ben vagy egy „interactive shell”-ben - ahol az interactive_comments opció engedélyezve van – ha egy sorban '#' karakter van akkor a '#' után lévő összes karaktert a sorban az értelmező figyelmen kívül hagyja. Ha a fent említett opció nincs engedélyezve, akkor a '#' karakter nem kerül értelmezésre. Ez a beállítás alapértelmezettként be van állítva, tehát a kommenteket használhatjuk, azonban kikapcsolhatóak.

#This is a common comment