Tömbök használata Linux Shell Scriptingben – 8. rész
Nem tudunk elképzelni egy programozási nyelvet a tömbök fogalma nélkül. Nem számít, hogyan valósítják meg ezeket a különböző nyelveken. Ehelyett a tömbök segítenek bennünket abban, hogy egy szimbolikus név alatt összevonjuk a hasonló vagy eltérő adatokat.
Mivel a shell szkriptek miatt aggódunk, ez a cikk segít néhány olyan shell szkripttel való játékban, amelyek a tömbök ezen koncepcióját használják.
Tömb inicializálása és használata
A bash újabb verzióival támogatja az egydimenziós tömböket. Egy tömb kifejezetten deklarálható a beépített declare shell-el.
declare -a var
De nem szükséges a tömbváltozókat a fentiek szerint deklarálni. Az egyes elemeket közvetlenül beilleszthetjük a tömbbe az alábbiak szerint.
var[XX]=<value>
ahol az „XX” a tömb indexét jelöli. A tömbelemek hivatkozásának megszüntetéséhez használja a göndör zárójeles szintaxist, azaz.
${var[XX]}
Megjegyzés: A tömbindexelés mindig 0-val kezdődik.
Egy másik kényelmes módja a teljes tömb inicializálásának a zárójelpár használata az alábbiak szerint.
var=( element1 element2 element3 . . . elementN )
Van még egy módja annak, hogy értékeket rendeljünk a tömbökhöz. Az inicializálásnak ez a módja a korábban ismertetett módszer egy alkategóriája.
array=( [XX]=<value> [XX]=<value> . . . )
A végrehajtási idő alatt is beolvashatunk/rendelhetünk értékeket a tömbhöz a beépített read shell használatával.
read -a array
Most, amikor végrehajtja a fenti utasítást egy szkripten belül, vár némi bevitelre. A tömbelemeket szóközzel elválasztva kell megadnunk (és nem kocsivissza). Az értékek megadása után nyomja meg az entert a befejezéshez.
A tömb elemeinek áthaladásához használhatjuk a for ciklust is.
for i in “${array[@]}”
do
#access each element as $i. . .
done
A következő szkript összefoglalja ennek a szakasznak a tartalmát.
#!/bin/bash
array1[0]=one
array1[1]=1
echo ${array1[0]}
echo ${array1[1]}
array2=( one two three )
echo ${array2[0]}
echo ${array2[2]}
array3=( [9]=nine [11]=11 )
echo ${array3[9]}
echo ${array3[11]}
read -a array4
for i in "${array4[@]}"
do
echo $i
done
exit 0
Különféle műveletek tömbökön
A szabványos karakterlánc-műveletek közül sok működik tömbökön. Tekintse meg a következő példaszkriptet, amely néhány műveletet valósít meg tömbökön (beleértve a karakterlánc-műveleteket is).
#!/bin/bash
array=( apple bat cat dog elephant frog )
#print first element
echo ${array[0]}
echo ${array:0}
#display all elements
echo ${array[@]}
echo ${array[@]:0}
#display all elements except first one
echo ${array[@]:1}
#display elements in a range
echo ${array[@]:1:4}
#length of first element
echo ${#array[0]}
echo ${#array}
#number of elements
echo ${#array[*]}
echo ${#array[@]}
#replacing substring
echo ${array[@]//a/A}
exit 0
Az alábbiakban látható a fenti szkript végrehajtása során előállított kimenet.
apple
apple
apple bat cat dog elephant frog
apple bat cat dog elephant frog
bat cat dog elephant frog
bat cat dog elephant
5
5
6
6
Apple bAt cAt dog elephAnt frog
Szerintem nincs jelentősége annak, hogy a fenti szkriptet részletesen elmagyarázzuk, mivel az magától értetődő. Ha szükséges, ebből a sorozatból egy részt kizárólag a húrmanipulációknak szentelek.
Parancshelyettesítés tömbökkel
A parancshelyettesítés egy parancs vagy több parancs kimenetét egy másik kontextushoz rendeli. Ebben a tömbök kontextusában beilleszthetjük a parancsok kimenetét a tömbök egyedi elemeiként. A szintaxis a következő.
array=( $(command) )
Alapértelmezés szerint a parancs kimenetének szóközökkel elválasztott tartalma különálló elemként tömbbe kerül. A következő szkript egy könyvtár tartalmát sorolja fel, amelyek 755 engedéllyel rendelkező fájlok.
#!/bin/bash
ERR=27
EXT=0
if [ $# -ne 1 ]; then
echo "Usage: $0 <path>"
exit $ERR
fi
if [ ! -d $1 ]; then
echo "Directory $1 doesn't exists"
exit $ERR
fi
temp=( $(find $1 -maxdepth 1 -type f) )
for i in "${temp[@]}"
do
perm=$(ls -l $i)
if [ `expr ${perm:0:10} : "-rwxr-xr-x"` -eq 10 ]; then
echo ${i##*/}
fi
done
exit $EXT
Kétdimenziós tömbök szimulálása
Könnyen ábrázolhatunk egy 2-dimenziós mátrixot egy 1-dimenziós tömb segítségével. A sor fő sorrendjében a mátrix minden sorában az ábrázolási elemeket a rendszer fokozatosan tömbindexekben tárolja, szekvenciálisan. Egy mXn mátrixhoz ugyanennek a képlete a következőképpen írható fel.
matrix[i][j]=array[n*i+j]
Nézzen meg egy másik minta szkriptet 2 mátrix hozzáadásához és a kapott mátrix kinyomtatásához.
#!/bin/bash
read -p "Enter the matrix order [mxn] : " t
m=${t:0:1}
n=${t:2:1}
echo "Enter the elements for first matrix"
for i in `seq 0 $(($m-1))`
do
for j in `seq 0 $(($n-1))`
do
read x[$(($n*$i+$j))]
done
done
echo "Enter the elements for second matrix"
for i in `seq 0 $(($m-1))`
do
for j in `seq 0 $(($n-1))`
do
read y[$(($n*$i+$j))]
z[$(($n*$i+$j))]=$((${x[$(($n*$i+$j))]}+${y[$(($n*$i+$j))]}))
done
done
echo "Matrix after addition is"
for i in `seq 0 $(($m-1))`
do
for j in `seq 0 $(($n-1))`
do
echo -ne "${z[$(($n*$i+$j))]}\t"
done
echo -e "\n"
done
exit 0
Annak ellenére, hogy a tömbök shell-szkripteken belüli megvalósításának vannak korlátai, ez néhány esetben hasznossá válik, különösen, ha parancshelyettesítéssel kezeljük. Adminisztratív szempontból a tömbök koncepciója megnyitotta az utat számos háttérszkript fejlesztéséhez a GNU/Linux rendszerekben.