Paraméter helyettesítések

Részletes leírás a paraméterhelyettesítés összes lehetséges módjáról:
https://tldp.org/LDP/abs/html/parameter-substitution.html

Egy kivonata a lehetséges helyettesítéséknek:


Példák:

A paraméter helyettesítés formája a következő:

${változó szabály helyettesítő-szó}

Létrehozunk egy változót:

foo=asdf

Azután csinálunk rá egy helyettesítést

echo ${foo}

Ennek az az eredménye, hogy `asdf`

Ha helyettesítő szabályt és helyettesítő szót is használunk akkor az

echo ${foo-bar}

szintén azt adja vissza, hogy `asdf`, mert a - szabály értelmében ha van értéke a változónak, akkor azt kapjuk vissza

Ha létezik a változónk, de nincs értéke

foo=
echo ${foo-bar}

Akkor null értéket kapunk vissza. Ezt könnyebb úgy szemléltetni, hogy ha hozzáírok az echo parancs végéhez még valamit

echo ${foo-bar}valami

és ekkor csak azt kapom vissza, hogy valami, azaz 

Ugyanez a null érték helyettesítés más szabállyal más eredményt ad. Ha a szabály :- akkor a helyettesítő szót kapjuk vissza:

echo ${foo:-bar}

Megkapjuk kimenetnek, hogy bar, de ez egyúttal a foo értéke lett. Azaz most már van a foo-nak értéke, mégpedig az, hogy bar

echo $foo

bar

Próbáljátok ki a fenti táblázat többi szabályát is a fenti példák alapján!


Mit csináunk akkor itt?

echo ${x:=$(ls)}

Az `ls` parancs kimetét rendeljük hozzá az x változóhoz, ha annak nincs értéke, vagy nem is létezik


A bash tud nem létező változó tesztelést egyszerűbben is tesztelni:

if [[ -v ARGUMENT ]]; then ...
A feltétel akkor teljesül, ha az ARGUMENT létezik


Változó érték hosszának megszámolása

Néha szükségünk van rá, hogy megszáoljuk, hogy hány karakter hosszú érték van egy változóban

Egy példa

echo $HOME

A HOME egy a bash által definiált környezeti változó, ami mindig a rendelkezésünkre áll, azt tartalmazza, hogy hol a home könyvtárunk.

echo ${#HOME}

Az így visszaadott szám pedig a karakterek száma a HOME változóban.


Mintázat megvágása a változó végén

${változó%mintázat}

vagy

${változó%%mintázat}

ls *sh

tanulas.sh

x=$(ls *sh)
echo ${x%.sh}

tanulas

Azaz levágtuk a .sh kitejesztést

Ha kicsit másképp adjuk meg a mintázatot akkor érthetővé válik a % és %% közötti különbség:

echo ${x%s*}

Ez csak a "sh"-t vágja le, míg a 

echo ${x%%s*}

tanula

többet vág. Miért? Azért mert a %% használata a leghosszabb vágást jelenti míg a % a legrövidebbet. Azaz ha a mintázat többször is teljesül a stringben, akkor az első vagy utolsó találatot. Figyelem, Ez nem igazűn reguláris kifejezés! Tudjuk hazsnálni a * és ? karaktereket. A * bármennyi bármit jelent, a ? egy darab bármit.


Helyettesítés változóban

${VÁLTOZÓ // mintázat / mire cseréljük /}

MYVAR=h3o02123ware38384you443d34o3434ingtod38384day
MYVAR=${MYVAR//[a-zA-Z]/.}

echo $MYVAR

Látható, hogy itt már tudunk karakter osztályt definiálni, azaz minden betűt tudtunk cserélni.

Ha nem írjuk vissza az eredményt a MYVAR változóba, akkor is működik a dolog

echo ${MYVAR//[0-9]/?}

Kicseréltük a számokat kérdőkjelekre.


MYVAR=h3o02123ware38384you443d34o3434ingtod38384day
Betűk megadása egyszerűbben

echo ${MYVAR//[[:alpha:]]/X} 


Számok megadása egyszerűbben
echo ${MYVAR//[[:digit:]]/N}


hello=h3o02123ware38384you443d34o3434ingto38384day

`d` betűk eltávolítása a karakterláncból. A helyettesítő értékünk null, azaz nincs semmi az utolsó / után
echo ${hello//d/}

Számok eltávolítása 

echo ${hello//[0-9]/}

Rész karakterláncok kiírása 

a=${hello//[0-9]/}

echo ${a:0:3} ${a:3:3} ${a:6:3} ${a:9:5} ${a:14:5}



Számok kiszdése perl regexp helyettesítés használatával:
echo $hello | perl -pe 's/\d//g'


MYVAR=ho02123ware38384you443d34o3434ingtod38384day;
echo $MYVAR | grep -o -E '[0-9]'


Remove Largest Suffix Pattern
Remove Largest Prefix Pattern

x=posix/src/std
echo ${x%%/*}
posix
echo ${x##*/}
std

Utolsó módosítás: 2020. november 23., hétfő, 13:00