Bekerja dengan Array di Linux Shell Scripting – Bagian 8


Kita tidak bisa membayangkan sebuah bahasa pemrograman tanpa konsep array. Tidak masalah bagaimana penerapannya dalam berbagai bahasa. Sebaliknya array membantu kita dalam mengkonsolidasikan data, serupa atau berbeda, di bawah satu nama simbolis.

Karena kita prihatin tentang skrip shell, artikel ini akan membantu Anda bermain-main dengan beberapa skrip shell yang menggunakan konsep array ini.

Inisialisasi dan Penggunaan Array

Dengan versi bash yang lebih baru, ia mendukung array satu dimensi. Sebuah array dapat dideklarasikan secara eksplisit dengan shell bawaan deklarasi.


declare -a var  

Namun tidak perlu mendeklarasikan variabel array seperti di atas. Kita dapat memasukkan elemen individual ke array secara langsung sebagai berikut.


var[XX]=<value>

di mana 'XX' menunjukkan indeks array. Untuk melakukan dereferensi elemen array gunakan sintaks braket keriting, yaitu.


${var[XX]}

Catatan: Pengindeksan array selalu dimulai dengan 0.

Cara lain yang mudah untuk menginisialisasi seluruh array adalah dengan menggunakan sepasang tanda kurung seperti yang ditunjukkan di bawah ini.


var=( element1 element2 element3 . . . elementN )

Masih ada cara lain untuk memberikan nilai pada array. Cara inisialisasi ini merupakan subkategori dari metode yang telah dijelaskan sebelumnya.


array=( [XX]=<value> [XX]=<value> . . . )

Kita juga dapat membaca/menetapkan nilai ke array selama waktu eksekusi menggunakan shell bawaan read.


read -a array

Sekarang setelah menjalankan pernyataan di atas di dalam skrip, ia menunggu beberapa masukan. Kita perlu menyediakan elemen array yang dipisahkan oleh spasi (dan bukan carriage return). Setelah memasukkan nilai, tekan enter untuk mengakhiri.

Untuk melintasi elemen array kita juga bisa menggunakan for loop.


for i in “${array[@]}”
do
	#access each element as $i. . .
done 

Skrip berikut merangkum isi bagian khusus ini.


#!/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

Berbagai Operasi pada Array

Banyak operasi string standar yang berfungsi pada array. Lihatlah contoh skrip berikut yang mengimplementasikan beberapa operasi pada array (termasuk operasi string).


#!/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

Berikut adalah output yang dihasilkan dari eksekusi skrip di atas.


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

Saya rasa tidak ada gunanya menjelaskan skrip di atas secara detail karena sudah cukup jelas. Jika perlu saya akan mendedikasikan satu bagian dalam seri ini secara eksklusif pada manipulasi string.

Substitusi Perintah dengan Array

Substitusi perintah menetapkan output dari sebuah perintah atau beberapa perintah ke dalam konteks lain. Di sini, dalam konteks array kita dapat memasukkan output perintah sebagai elemen individual dari array. Sintaksnya adalah sebagai berikut.


array=( $(command) )

Secara default, konten dalam output perintah yang dipisahkan oleh spasi dimasukkan ke dalam array sebagai elemen individual. Skrip berikut mencantumkan isi direktori, yaitu file dengan izin 755.


#!/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

Mensimulasikan Array Dua Dimensi

Kita dapat dengan mudah merepresentasikan matriks 2 dimensi menggunakan array 1 dimensi. Dalam elemen representasi urutan utama baris di setiap baris matriks disimpan secara bertahap dalam indeks array secara berurutan. Untuk matriks mXn, rumusnya dapat ditulis sebagai.


matrix[i][j]=array[n*i+j]

Lihat contoh skrip lain untuk menjumlahkan 2 matriks dan mencetak matriks yang dihasilkan.


#!/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 

Meskipun ada keterbatasan untuk mengimplementasikan array di dalam skrip shell, ini berguna dalam beberapa situasi, terutama ketika kita menangani substitusi perintah. Dilihat dari sudut pandang administratif, konsep array membuka jalan bagi pengembangan banyak skrip latar belakang dalam sistem GNU/Linux.