Rabu, 24 April 2013

Contoh Pemrograman Bash Script


SHELL

Shell adalah program yang bekerja di terminal ketika anda login di konsole, atau menjalankan terminal di desktop GUI, dan menampakkan diri pada anda sebagai prompt

nama $
Dalam kondisi itu, shell berada pada model CLI (Command Line Interface), artinya siap menerima perintah yang anda ketikkan baris per baris. Mode lain adalah mode scripting, dimana anda menuliskan serangkaian perintah dalam suatu file teks, dan shell akan menjalangaknnya sekaligus. Mode kedua inilah yang akan jadi fokus latihan kita.
Namun sebelum melangkah lebih jauh, kenali dulu bahwa di Linux ada berbagai program shell, yaitu:
  • BASH (Born Again Shell), inilah shell default yang biasanya dipakai di Linux.
  • CSH (C Shell), ini jenis shell yang perintah-perintahnya mirip bahasa C
  • KSH (Korn Shell),
  • SH, ini shell asli UNIX, moyangnya BASH.
Pada latihan ini akan kita gunakan BASH.



CARA MEMROGRAM

Untuk melakukan pemrograman Bash, yang anda perlukan hanya terminal dan sebuah editor teks untuk mengedit skrip-nya.


Membuat Skrip

Skrip dapat anda buat dengan mengeditnya memakai editor teks, misalnya GEdit (GUI) atau mcedit. Misalnya:
 $ mkdir $HOME/bin
 $ cd $HOME/bin
 $ mcedit hello.sh

Isi Skrip

Ini contoh isi scriptnya.
#!/bin/bash
# Baris pertama script bash harus seperti di-atas
# Selanjutnya baris dengan tanda # di depan adalah komentar
 
# Ini perintah yang akan dijalankan
echo "Hello newbie"
echo "Your shell is speaking here ..."

Menjalankan skrip

Setelah selesai diedit dan disimpan, file tersebut harus diubah modenya menjadi executable, baru dijalankan.
$ chmod +x hello.sh
$ ./hello.sh
 

bashrc

Skrip $HOME/.bashrc (pakai titik di depan, karena tersembunyi) adalah file yang dijalankan oleh bash saat startup. Jadi biasanya dipakai setting bash , misalnya sebagai berikut.
# Atur prompt
set PS1=
set PS1=
 
# Bikin supaya terminal colourfull
eval `dircolors -b` 
 
# Tambah path
export PATH=$PATH:~/bin

PEMROGRAMAN DASAR

Baik, sekarang kita mulai belajar berbahasa BASH.

Output

Pertama, tentu saja bagaimana bisa 'ngomong'. Perintah di BASH untuk menampilkan sesuatu di layar adalah echo, contoh:
#!/bin/bash
# File: bash1.sh
# Macam-macam output
 
# Output string, perhatikan petik dua dan petik satu
echo "Linus said: "
echo -n ' "See, you not only have to be a good coder to create a system like Linux, '
echo 'you have to be a sneaky bastard too ;-)" '
 

Data

Linus, "I will, in fact, claim that the difference between a bad programmer and a good one is whether he considers his code or his data structures more important. Bad programmers worry about the code. Good programmers worry about data structures and their relationships."
Data adalah suatu nilai yang bisa diolah oleh komputer. Asalnya mungkin dari masukan pemakai, dan nantinya akan ditampilkan ke pemakai. Dalam program, data bisa berupa konstanta, yaitu data yang tetap. Sementara itu Variabel adalah simbol yang menyimpan suatu data, dan bisa berubah.

Variabel Program

#!/bin/bash
# File : bash102.sh
 
# Mengisi variabel dengan konstanta
SISOP="Linux"
 
# Tampilkan isinya
echo "Saya suka" $SISOP
 
# Ubah isinya, tampilkan
SISOP="Open Source"
echo "dan semua" $SISOP
 

Environment Variabel

Salah satu keistimeaan BASH adalah, dia punya environment variabel. Anda bisa melihat semua variabel tersebut dengan perintah set
$ set | less
Dan mendefinisikannya dengan perintah export
$ export GELAR="Newbie"

Dalam skrip, variabel tersebut bisa langsung dipakai, misalnya:
#!/bin/bash
 
# Tampilkan variabel environment
echo "Hi " $GELAR $USERNAME

Input

Linus, "The only limiting factor of the Linux operating system is its user."
Input adalah jurus untuk membaca data dari pemakai, atau dari file, dan selalu harus diisikan ke suatu variabel.

Input Pemakai

Untuk menerima masukan dari pemakai, perintahnya adalah read .
#!/bin/bash
echo "Hai, siapa namamu ?
read NAME
echo "Salam kenal" $NAME ", saya " $SHELL!
 

Input Program

BASH, ternyata juga bisa menerima input dari program lain, dan caranya sangat gampang. Misalkan skrip kita ingin tahu waktu sekarang. Untuk itu sudah ada program bernama date, silahkan dicoba dulu:
$ date
Sun Feb 28 02:34:20 WIT 2010

$ date --help 

$ date +%H:%M:%S
02:36:22

$ date +%d-%m-%Y
28-02-2010
Nah, sekarang mari buat skrip menerima masukan dari program date.
#!/bin/bash
 
 # menerima masukan dari program lain, perhatikan tanda kutipnya
 JAM=`date +%H`
 MENIT=`date +%M`
 echo "Sekarang jam" $JAM:$MENITroot@igos-desktop:~/bin#
 

Operasi

Linus, "Let's put it this way: if you need to ask a lawyer whether what you do is "right" or not, you are morally corrupt. Let's not go there. We don't base our morality on law."
Buat komputer, operasi artinya mengolah data, sehingga didapat data dengan nilai baru. Masalahnya disini, ada berbagai jenis data. Yang paling umum adalah huruf dan angka. Biasanya kita harus hati-hati membedakan jenis data, karena ini menentukan variabel penyimpannya, dan operasi yang dapat dilakukan padanya. Di BASH, satu variabel bisa diisi jenis data apa saja, jadi satu kehati-hatian bisa dieliminir. Namun soal operasi, tetap harus extra hati-hati.

Operasi String

Sebagai bahasa skripting, jenis data string (untaian huruf) adalah makanan utama buat BASH. Karena itu operasinya mudah dan enak ditulis. Contoh:
#!/bash
 
# Beberapa variabel string
DISTRO1="UBuntu"
DISTRO2="Slackware"
DISTRO3="Fedora"
 
# Ini menggabung string, pakai tanda kutip berbeda
S1="$DISTRO1 $DISTRO2 $DISTRO3, semuanya Linux !"
S2='$DISTRO1 $DISTRO2 $DISTRO3, pokoknya Linux !'
 
# Hati-hati kalau nama variabel tersambung tanpa spasi
S3="$DISTRO1-Linux !"
S4="$DISTRO2Linux !"
S5='${DISTRO3}Linux !'
 
echo $S1
echo $S2
echo $S3
echo $S4
echo $S5
 

Operasi Aritmatika

BASH juga bisa berhitung mengolah data angka. Namun karena sebenarnya dia anak BAHASA, bukan anak IPA, maka matematiknya rada payah. Kita jajal yuk.
#!/bin/bash
 
# Ayo berhitung ...
echo "1+1=" 1+1
echo "1+2=" $[2+1]
echo "1*3=" $[1*3]
echo "1/4=" $[1/3]
Pinter tidak si BASH ?
 

Operasi Logika

Data logika adalah data yang nilainya hanya BENAR (true, 1) atau SALAH (false, 0). Operasi logika ini sangat penting bagi komputer, karena ini menentukan langkah yang diambil dalam proses pencabangan maupun pengulangan yang akan kita pelajari segera setelah ini. Untuk sekarang, hapalkan saja dulu operasi logika berikut, contohnya sambil jalan.

Pencabangan

Linus, "The fact is, there aren't just two sides to any issue, there's almost always a range or responses, and "it depends" is almost always the right answer in any big question. "
Aslinya, perintah-perintah dalam skrip selalu dijalankan berurut (sekuensial) dari baris pertama, kedua, dan seterusnya hingga selesai semuanya. Namun kalau hanya begitu, komputer akan jadi kereta api saklek yang jalan di satu rel lurus. Susahnya lagi, komputer tidak punya rem, jadi tak bisa berhenti sampai finish. Hidup kan tidak begitu. Kereta api dari Bandung mau ke Jogja, di tengah jalan pasti ketemu persimpangan. Belok kiri masuk Purwakarta, kalau terus ke Jogja. Pilih mana ?

If

If adalah perintah pencabangan yang akan mengeksekusi blok perintah tertentu, berdasarkan kondisi logika (benar / salah) tertentu. Berikut ini adalah sebuah skrip sederhana yang menerapkan konstruksi di atas :
#!/bin/bash
 
echo -n "Masukkan sebuah password : "
read password
 
if [ $password == eureka ]; then
  echo "you're right."
fi
 
# Kalau mau aman ... gunakan tanda petik pada argumen
if [ "$password" == "eureka" ]; then
  echo "you're right, and so am I."
fi
Tampilan setelah skrip di atas dijalankan adalah sebagai berikut :
Masukkan sebuah password : eureka
you're right.
Coba masukkan password dengan lebih dari dua kata, misal linux oke.
 
Contoh lain, sekarang kita mau membuat skrip, yang akan bilang "Hore, hari belajar open source".
#!/bin/bash
 
echo "Hore, hari belajar open source."
Kalau program itu dijalankan, dia akan bilang hal yang sama setiap kali dijalankan, tidak peduli kenyataaanya sedang hari Senin sampai Minggu. Well, bagus kalau memang begitu. Namun kalau belajarnya cuma hari Sabtu, bagaimana dong ? Here comes the "if".
#!/bin/bash
 
# Hari padepokan, gunakan "Sabtu" kalau locale Indonesia
HARI_PADEPOKAN="Saturday"
 
# Hari ini, tanya pada program date
HARI_INI=`date +%A`
 
echo "Ini hari" $HARI_INI
 
# Pencabangan, periksa apakah HARI_INI sama dengan HARI_PADEPOKAN
if [ $HARI_INI == $HARI_PADEPOKAN ]; then
  # bagian ini hanya akan dijalankan kalau pemeriksaan oleh if BENAR 
  echo "Hore ... saatnya belajar open source !!!"
fi
# kalau SALAH, langsung loncat ke sini
Nah, program di atas sudah lebih pintar. Kita tambah sedikit pintarnya ...
#!/bin/bash
 
# definisi hari, gunakan "Sabtu" dan "Minggu" kalau locale Indonesia
HARI_PADEPOKAN="Saturday"
HARI_LIBUR="Sunday"
 
# Hari ini, tanya pada program date
HARI_INI=`date +%A`
 
echo "Ini hari $HARI_INI"
 
# Pencabangan dengan tiga kasus:
if [ $HARI_INI == $HARI_PADEPOKAN ]; then
  echo "Hore ... hari belajar open source !!!"
elif [ $HARI_INI == $HARI_LIBUR ]; then
  echo "Hari libur :D"
else
  echo "Ayo kerja, semangat !!!"
fi
 

Case

Case adalah pencabangan khusus untuk banyak kondisi pemilihan, yang lebih digunakan dibanding perintah if/elif/else.
Misalkan kita ingin menampilkan musim di Indonesia:
  • Juni - September : musim kemarau
  • Desember - Maret : musim hujan
  • sisanya : musim pancaroba
Artinya, ada 12 kasus pemeriksaan, bayangkan repotnya kalau pakai if/elif/else. Ini kalau pakai case:
#!/bin/bash
 
# Bulan, tanya pada program date
BULAN_INI=`date +%B`
 
echo "Bulan: " $BULAN_INI
 
# Pencabangan pakai case
case $BULAN_INI in
  Ju??|'August'|'September')      # pilihan pertama
      echo "Musim kemarau"
      ;;                          # akhiri dengan dua titik koma
  'December'|*ry|'March')         # pilihan kedua
      echo "Musim hujan"
      ;;
  *)                              # pilihan sisa
      echo "Musim pancaroba"
      ;;
esac
Perhatikan bahwa:
  • setiap baris pilihan harus diberi tanda kurung ), baru aksi
  • tiap pilihan dipisah dengan tanda garis tegak |
  • Pilihan bisa pakai wild card * (contoh *ry), maupun ? (contoh Ju??).
  • setelah semua aksi, diakhiri dengan dua titik koma ;;
 

Pengulangan

Linus, "We all know Linux is great … it does infinite loops in 5 seconds"
Pengulangan adalah jurus pemrograman dimana satu blok perintah bisa dilakukan berulang-ulang. Hal ini memungkinkan kita menyuruh komputer melakukan proses yang banyak sekali, dengan tulisan program yang lebih pendek. Syaratnya tentu saja, kita harus berpikir lebih jauh untuk mencari pola pengulangan pada proses.

For

For adalah pengulangan untuk data yang kita sudah tahu sebelumnya. Misalkan kita akan menulis beberapa distro Linux
#!/bin/bash
#
 
echo "Distro-distro Linux:"
 
# Ini cara tak pakai loop
echo Linux from Scratch
echo Gento
echo Damn Small Linux
echo Puppy
 
# Ini sudah pakai loop for
for DISTRO in Slackware OpenSUSE Fedora UBuntu; do   
   echo $DISTRO
done
# batas blok
 
Bisa juga untuk rentang nilai (angka) tertentu, misalnya kita mau membuat penggaris sepanjang 40 karakter, tiap 10 karakter ada tanda angkanya.
#!/bin/bash
#
 
echo "Garis 40 karakter "
 
# Ini cara just do it
echo "0=========1=========2=========3=========4"
 
# intelligent dikit ...
echo -n '0'
for N in {1..4}; do
   for M in {1..9}; do
      echo -n '-'
   done
   echo -n $N
done
echo
 

While

While adalah pengulangan yang berhentinya berdasar ekspresi logika, cocok untuk suasana dimana kita tidak tahu pasti kapan berhentinya. Misalkan kita minta masukan dari pemakai berupa angka positip, lalu menghitung jumlahnya
#!/bin/bash
#
 
SUM=0
COUNT=0
echo -n "Masukkan angka, akhiri dengan -1 : "
read N
 
# loop pakai while
while [[ N -gt 0 ]]; do
   let SUM=$SUM+$N
   let COUNT=$COUNT+1
   echo -n "Angka : "
   read N
done
# batas blok
echo 
echo "Banyak data = $COUNT"
echo "Jumlah = $SUM"

Subrutin

Linus, "If you need more than 3 levels of indentation, you're screwed anyway, and should fix your program. "
Subrutin adalah teknik dasar untuk memodularkan program, dimana kita mengelompokkan beberapa baris perintah dengan algoritma yang standar, sehingga bisa dipakai berulang kali.
Misal saja kita ingin membuat tampilan pohon sebelah berikut:
*
**
***
****
||
||
Maka program kita:
#!/bin/bash
 
# ini sub rutin menggambar garis
gambar_garis() {
    for N in `seq 1 $1`; do
	echo -n "$2"
    done
    echo
}
 
# rutin utama, menggambar pohon 
# dengan memanggil subrutin gambar_garis
gambar_garis 1 '*'
gambar_garis 2 '*'
gambar_garis 3 '*'
gambar_garis 4 '*'
gambar_garis 2 '|'
gambar_garis 2 '|'
Perhatikan pada subrutin
  • Kita harus memberi nama (dalam hal ini gambar_garis), lalu tanda ().
  • Blok subrutin memakai kurung kurawal { ... }.
  • Subrutin bisa menerima argumen, bernama $1, $2, $3 dan seterusnya.
Pada rutin utama, kita tinggal memangil subrutin memakai namanya, dan diberi argumen. Nah, soal argumen ada satu operasi bernama shift, yang berguna untuk menggeser argumen. Langsung saja contohnya:
#!/bin/bash
 
# sub rutin menggambar garis
gambar_garis() {
    for N in `seq 1 $1`; do
	echo -n '*'
    done
    echo
}
 
# sub rutin menggambar pohon
gambar_pohon() {
    M=$1           # ambil argumen pertama
    while [ "$M" ]; do
	gambar_garis $M
	shift      # geser argumen
	M=$1       # ambil argumen berikutnya 
    done
}
 
# rutin utama
# panggil gambar_pohon dengan banyak argumen
gambar_pohon 1 2 3 4 5 2 2

Array

Array adalah struktur data, dimana banyak data dikelompokkan berderet dan bisa diakses dengan indeks tertentu. Ini sangat banyak gunanya. Sekedar contoh sederhana:
#!/bin/bash 
 
# definisikan array. 
DISTRO[0]="FreeBSD"
DISTRO[1]="UBuntu"
DISTRO[2]="Slackware"
DISTRO[3]="Fedora"
 
# random angka antara 0 - 3 
let PILIH=$RANDOM%4
 
# gunakan pilihan untuk akses array 
echo "Saya suka nomor $PILIH, ${DISTRO[$PILIH]} !"
Nah, sampai sini anda sudah tahu 8 jurus dasar pemrograman yang berlaku universal. Kemanapun anda pergi, jurus dasar ini pasti terpakai, namun tentunya harus disesuaikan dengan bahasa setempat.

PEMROGRAMAN LANJUT

Sekarang kita mulai fitur-fitur pemrograman yang KHAS shell. Bahasa lain belum tentu punya.

Source

Skrip bash bisa memanggil skrip bash lain. Misalkan saja buatlah skrip member.conf berikut
#!/bin/sh

NAMA="Tux"
GELAR="Pinguin of Linux"

echo "Pemanggil : $BOSS"

Perhatikan bahwa isi file ini adalah skrip bash, namun dia juga sebagai file teks berisi konfigurasi. Ini trik yang biasa dipakai di shell programming.
Mari kita buat skrip utama berikut
#!/bin/bash
 
BOSS="Linus"
 
# baca file konfigurasi
source member.conf
 
# tulis
echo "Anggota adalah "
echo "Nama  :" $NAMA
echo "Gelar :" $GELAR
Perhatikan bagaimana variabel saling dikenali di kedua skrip. Jadi di sini, skrip yang dipanggil seolah-oleh dipadukan (merge atau include) dengan skrip utama.

Sub Program

Skrip bash bisa memanggil program lain, termasuk memanggil skrip bash. Misalkan
#!/bin/sh
 
BOSS='Linus'
 
# memanggil program cat untuk membaca file member.conf
echo "Isi member.conf"
cat member.conf
 
# memanggil program 
echo "================"
echo "Menjalankan program member.conf"
./member.conf
 
# tulis
echo "Setelah menjalankan member.conf"
echo "Nama  :" $NAMA
echo "Gelar :" $GELAR
Pada program terakhir ini, mengapa Nama dan Gelar kosong ? Demikian pula kenapa skrip member.conf tidak menampilkan pemanggil ? Bagaimana memperbaikinya ?

Input Redirection

Biasanya, suatu program menerima masukan dari keyboard. Di shell, kita bisa mengganti keyboard ini dengan file. Coba buat skrip berikut:
#!/bin/bash
# cat-var.sh
# program yang menerima masukan baris-baris string
# lalu mencetaknya kalau baris mengandung tanda =
 
while read LINE; do 
    if [[ "$LINE" == *=* ]]; then
	echo $LINE
    fi
done
Simpan file tersebut dengan nama cat-var.sh, lalu panggil sebagai berikut
$ cat member.conf
$ ./cat-var.sh < member.conf

Output Redirection

Pasangan dengan Input redirection, shell memungkinkan output dari suatu program langsung masuk ke file, bukan ditampilkan ke layar. Jadi coba saja panggil
$ ./cat-var.sh < member.conf > member.out
$ cat member.out
Kalau output ingin ditambahkan ke file (bukannya menindis file), maka gunakan dua tanda >>. Misalnya:
$ ./cat-var.sh < member.conf > member.out
$ cat member.out
$ ./cat-var.sh < member.conf >> member.out
$ cat member.out

Pipe

Pipe adalah redirection dari program ke program (bukan dari file ke program). Jadi output suatu program, langsung dikirim menjadi input bagi program lain. Coba saja lah, biar jelas.
$ cat member.conf
$ cat member.conf | cat-var.sh

PROGRAM BANTU

Bash saja tidak akan terlalu banyak gunanya, namun dengan adanya redirection dan pipe, the power of shell programming datang dari berbagai utilitas kecil, yang bisa disambung-sambung. Untuk latihan ini, kita akan pakai salinan file /etc/passwd
$ cp /etc/passwd .
$ cat passwd
Isinya kira-kira:
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
kocil:x:500:500:Kocil:/export/home/kocil:/bin/bash
admin:x:501:501:Administrator:/export/home/admin:/bin/bash
Seperti kita ketahui bersama (kalau belum pura-pura tahu saja), file /etc/passwd adalah daftar dari semua pemakai di Linux. Formatnya adalah:
nama_user : x (password) : user_id : group_id : nama_lengkap : home : shell 


Cat, Head, Tail

Tiga program kucing, kepala, dan ekor ini beguna untuk melihat isi file. Coba saja:
$ head -n 2 passwd
$ tail -n 3 passwd
dalam skrip bisa kita manfaatkan seperti contoh berikut:
#!/bin/bash
# periksa.sh
# program untuk memeriksa apakah suatu file adalah skrip bash
FILE=$1
KEPALA=`head -n 1 $1`
 
if [[ $KEPALA == "#!/bin/bash" ]]; then
   echo "File $1 adalah skrip BASH"
else
   echo "Bukan skrip bash"
fi
Coba gunakan skrip tersebut:
$ ./periksa.sh  passwd
$ ./periksa.sh  member.conf

Cut

Cut adalah program untuk memisahkan kolom-kolom pada sebuah baris. Coba panggil
$ tail -n 1 passwd
$ tail -n 1 passwd | cut -f 1 - d ':'
$ tail -n 1 passwd | cut -f 5 - d ':'
Artinya, program tail akan mengirim baris terakhir lewat pipe ke program cut. Selanjutnya program cut menampilkan luaran sesuai option-nya, yaitu:
  • f : nomor field (kolom)
  • d : delimiter (pemisah) kolom
Mari kita pakai untuk membuat program yang membuat tabel user dengan bagus.
#!/bin/bash                                                                     
# list-passwd.sh                                                                  
# Menampilkan user dari file /etc/passwd dengan rapi                            
# hanya yang shell-nya bash                                                     
 
# Untuk memformat kolom dengan bagus, pakai jurus output printf                                           
FORMAT="%-16s %s\n"                                                                               
printf "$FORMAT" "Login" "Nama Lengkap"                                         
 
while read LINE; do                                                             
   SH=`echo $LINE | cut -f 7 -d ':'`                                            
   if [[ $SH == /bin/bash ]]; then                                              
     LOGIN=`echo $LINE | cut -f 1 -d ':'`                                       
     NAMA=`echo $LINE | cut -f 5 -d ':'`                                        
     printf "$FORMAT" "$LOGIN" "$NAMA"                                          
   fi                                                                           
done
Program ini kita panggil
$ list_passwd.sh < passwd

Grep

Grep adalah program bantu untuk mencari isi file teks tertentu. Silahkan dicoba dulu:
$ grep "/bin/bash" < passwd
Nampak bahwa grep menerima masukan lewat input redirection, dan membacanya baris per baris. Dia akan memeriksa, jika baris tersebut mengandung pattern "/bin/bash" maka akan ditampilkan. Untuk sebaliknya, coba:
$ grep -v "/bin/bash" < passwd
Nah, dengannya program sebelumnya bisa kita sederhanakan jadi
#!/bin/bash                                                                     
# ls-passwd.sh                                                                  
# Menampilkan user dari file /etc/passwd dengan rapi                            
# hanya yang shell-nya bash                                                     
 
FORMAT="%-16s %s\n"                                                             
 
printf "$FORMAT" "Login" "Nama Lengkap"                                         
grep bin/bash | while read LINE; do                                             
   LOGIN=`echo $LINE | cut -f 1 -d ':'`                                         
   NAMA=`echo $LINE | cut -f 5 -d ':'`                                          
   printf "$FORMAT" "$LOGIN" "$NAMA"                                            
done
Mencobanya sama seperti sebelumnya:
$ grep_passwd.sh < passwd

Awk

[Awk] itu nama yang aneh. Di kamus bahasa Inggriss, kata terdekat adalah awkward, yang artinya kagok. Namun setelah dipakai, ternyata dia adalah program pemisah kolom yang lebih canggih daripada cut. Coba saja:
awk -F: '{print ($1,  " = ", $5);}' < passwd 
Di sini:
  • Option -F mendefinisikan pemisah (delimiter)
  • '{print ($1, " = ", $5);}' adalah perintah yang akan dijalankan untuk semua baris masukan (yaitu file passwd)
Rahasia pemakaian awak ada di perintah. Terlihat bahwa perintahnya adalah
  • print, artinya mencetak sesuatu
  • $1 dan $5, ternyata adalah nomor kolom (yang telah dipisah-pisah oleh awk, berdasar delimiter
  • " = " adalah string biasa
Awk juga kenal printf, jadi kita bisa buat keluaran mirip seperti program sebelumnya hanya dengan perintah:
awk -F: '{printf("%-20s %-40s", $1, $5);}' < passwd 
Wah masih kurang headernya. Jangan nyepelein awk. Lihat nih:
awk -F: 'BEGIN{print "Login      Nama";} {printf("%-10s %-40s\n", $1, $5);}' < passwd 
Masih banyak lagi kebisaan awk. Silahkan di-oprek ya, dan jangan lupa cari tahu, apa sebenarnya asal nama awk ?

Sed

Sed, kependekan dari stream editor, adalah program yang mampu mengubah isi file teks. Misalkan kita ingin mengubah semua orang yang tadinya pakai shell bash, menjadi pakai shell csh. Perintahnya adalah:
$ sed 's!/bin/bash!bin/csh!' passwd
Lihat baik-baik keluarannya. Apakah masih ada yang pakai shell bash ? Tak ada kan. Namun apa artinya argumen 's!/bin/bash!bin/csh!' ? Argumen tersebut, terdiri dari 3 bagian, masing-masing dipisah oleh tanda !. Bagian pertama (s) adalah perintah subtitusi (ganti). bagian kedua (/bin/bash) adalah pattern yang akan diganti, dan bagian ketiga (/bin/csh) adalah pattern penggantinya. Singkat kata, cara kerjanya adalah search dan replace ALL. Semua baris akan diubah, perhatikan itu !
Lebih dari itu, sesungguhnya sed sangat powerfull. Sangat dianjurkan untuk mempelajarinya lebih jauh.

Dialog

Sejauh ini, tampilah program bash hanya berdasar jurus output echo yang .... plain. Program bantu [dialog], akan mengubah hal itu. Mari kita coba (install dulu kalau belum ada)
sudo apt-get install dialog
dialog --title "Dialog" --msgbox "Hallo dunia" 5 20
Contoh lebih lanjut, lihat bagian aplikasi.

Aplikasi

Nah, sekarang kita coba beberapa aplikasi bash yang (semoga) menarik.

Sysinfo

Ada beberapa program di Linux yang bisa menampilkan informasi sistem, misalnya uname, vmstat, dmesg, lspci, dll. Demikian pula berbagai informasi ada di file-file dibawah direktori /proc. Coba saja satu per satu
$ uname -a
$ vmstat
$ lspci
$ cat /proc/cpuinfo
$ cat /proc/meminfo
Nah, kalau mau tahu informasi komputer dengan cepat dan kompak, buat skrip berikut:
#!/bin/bash
 
echo "Informasi Sistem"                                                         
 
# informasi perangkat keras                                                     
# Pada Linux bisa dibaca dari file-file dibawah /proc                           
echo "++ Perangkat keras "                                                      
CPU=`grep "model name" /proc/cpuinfo | head -n 1 | cut -f 2 -d ':'`             
RAM=`grep "MemTotal" /proc/meminfo | cut -f 2 -d ':'`                           
 
echo " |- CPU : " $CPU                                                          
echo " |- RAM : " $RAM                                                          
 
echo "++ Sistem Operasi "                                                       
# informasi sistem operasi                                                      
OS=`uname -sr`                                                                  
 
echo " |- OS : " $OS                                                            
echo " |- Shell : " $SHELL

Terminal Warna Random

Coba baca dulu artikel Terminal_ATerm. Skrip berikut meluncurkan aterm dengan warna random.
#!/bin/bash 
 
# definisikan array. 
WARNA[0]="red"
WARNA[1]="green"
WARNA[2]="yellow"
WARNA[3]="blue"
WARNA[4]="magenta"
WARNA[5]="cyan"
 
# random angka antara 0 - 3 
let PILIH=$RANDOM%6
 
# luncurkan aterm dengan LANG=C  agar mc bekerja benar (bug di Ubuntu)
LANG=C aterm -tint ${WARNA[$PILIH]}

Terminal Warna Urut

Sekarang kita ingin aterm-nya muncul dengan warna berurut. Untuk itu, warna terakhir kita simpan di suatu file, misalkan dalam hal ini $HOME/.terminal.conf
Versi pertama, pakai source dan redirection saja.
#!/bin/bash 
 
# definisikan array. 
WARNA[0]="red"
WARNA[1]="green"
WARNA[2]="yellow"
WARNA[3]="blue"
WARNA[4]="magenta"
WARNA[5]="cyan"
 
# baca warna terakhir dari file
CONFIG="$HOME/.terminal.conf"
PILIH=1
if [ -f $CONFIG ]; then
   source $CONFIG
fi
 
let PILIH=$PILIH+1
 
LANG=C aterm -tint ${WARNA[$PILIH]}
 
# rekam warna terakhir
echo "PILIH=$PILIH" > $CONFIG
Cara diatas cukup ampuh, kalau file konfigurasi kita isinya memang hanya sebaris "PILIH=...". Kalau ada baris lain, maka gunakan sed.
#!/bin/bash 
 
# definisikan array. 
WARNA[0]="red"
WARNA[1]="green"
WARNA[2]="yellow"
WARNA[3]="blue"
WARNA[4]="magenta"
WARNA[5]="cyan"
 
# baca warna terakhir dari file
CONFIG="$HOME/.terminal.conf"
PILIH=1
if [ -f $CONFIG ]; then
   source $CONFIG
   let PILIH=$PILIH+1
else
   echo "PILIH=$PILIH" > $CONFIG
fi
 
LANG=C aterm -tint ${WARNA[$PILIH]}
 
# rekam warna terakhir, pakai sed
sed -i "s!PILIH=.*!PILIH=$PILIH!" $CONFIG

Pesan Pada Group

Misalkan kita punya sebuah server yang sering di-remote pakai SSH oleh banyak user. Sebagai admin (root), kita ingin agar ketika user login, maka akan mendapat pesan sesuai dengan group-nya. Group dari seorang user, bisa dilihat dengan perintah id, sementara menambahkan user ke group dilakukan dengan perintah usrmod
$ id nama_user
$ sudo /usr/sbin/usermod -a -G wheel kocil
Untuk itu tempat pesan, siapkan sebuah direktori (misal /var/msg). Lalu tinggal buat file pesan sesuai nama group (misal wheel, video, dll).
Nah, sekarang tinggal buat skrip /etc/profile.d/message.sh seperti ini:
# Display message for specific groups
MSGDIR=/var/messages
cd $MSGDIR
for F in *; do
   if id $USER | grep $F &> /dev/null; then
      echo "======== Message for $F group member ========="
      cat $F
   fi   
done

Console Music Player

Ok, ini contoh yang rada besar, yaitu aplikasi untuk memainkan musik dari konsole. Untuk itu, siapkan dulu file-file musiknya pada suatu struktur direktori berikut:
$HOME
  +- Music
      +- Album1
      |   +- Musik1
      |   +- Musik2
      |   +- Musik3  
      +- Album2
Aplikasi kita akan:
  • Menampilkan isi folder $HOME/Music, yaitu album-album. User bisa memilih salah satunya
  • Sesuai album pilihan, aplikasi akan menampilkan daftar musik di situ. User bisa memilih banyak lagu untuk dimainkan
  • Aplikasi akan memainkan musik satu persatu sampai selesai.
Ini dia aplikasinya. Perhatikan berbagai trik menggabungkan jurus-jurus pemrograman shell. Dare to be a hacker eh ?
#!/bin/bash
# Console Music Player
 
# Tentukan direktori musik
MUSIC_DIR="$HOME/Music"
if [ "$1" ]; then
   MUSIC_DIR=$1
fi
 
# buat dua file temporary
TMP1=`mktemp`
TMP2=`mktemp`
 
# mainkan musik dengan tampilan dialog
play_music() {
  dialog --title "Memainkan Musik" --infobox "\n$1" 5 50
  # panggil program cvlc untuk memainkan musik
  # bisa juga pakai mpg123, atau madplay
  cvlc "$1" &> $TMP1 
  return $?
}
 
# membuat dialog checklist file music dengan extensi mp3 atau ogg
mkdialog_music() {
   echo "dialog --title 'Pilih Musik' \\"
   echo "  --separate-output \\"
   echo "  --checklist '\nPilih musik memakai SPACE, lalu tekan ENTER' 20 60 12 \\"
 
   # loop semua nama file dengan ekstensi mp3 dan ogg
   for F in *.mp3 *.ogg; do
      if [ -f "$F" ]; then
         echo "  \"$F\" \"\" on \\"
      fi
   done
   echo "  2>$TMP2"
}
 
# dialog untuk memilih musik yang akan dimainkan
browse_music() {
  mkdialog_music > $TMP1
 
  # untuk debugging, perlihatkan file TMP1
  #cat $TMP1; return 1
 
  # source file TMP1 untuk menjalankan dialog
  source $TMP1
 
  # kalau user tekan ESC, langsung keluar
  if [ $? != 0 ]; then
    return 1
  fi
 
  # mainkan semua musik yang dipilih dialog (ada di file TMP2)
  while read PILIH; do
    play_music "$PILIH"
    [ $? != 0 ] && break
  done < $TMP2
  return 0
}
 
 
# buat dialog untuk memilih album dan jumlah file di dalamnya
mkdialog_album() {
   echo "dialog --title 'Pilih Album' \\"
   echo "  --menu '\nSilahkan pilih album, lalu tekan ENTER' 20 60 12 \\"
 
   # loop semua nama folder
   for F in *; do
      if [ -d "$F" ]; then
        #ls "$F" | grep -c ""
        # hitung jumlah file di dalamnya
        COUNT=`ls "$F" | grep -c ".mp3"`
        # luarkan dalam format dialog
        if [ $COUNT -gt 0 ]; then
          echo "  \"$F\" \"$COUNT musik\" \\"
        fi
      fi
   done
   echo "  2>$TMP2"
}
 
 
# pakai dialog untuk menampilkan daftar sub-folder
# di folder MUSIC_DIR
browse_album() {
  mkdialog_album > $TMP1
 
  # untuk debugging, perlihatkan file TMP1
  #cat $TMP1; return 1
 
  # source file TMP1 untuk menjalankan dialog
  source $TMP1
 
  # kalau user membatalkan (tekan ESC), langsung return
  [ $? != 0 ] && return 1
 
  # baca keluaran dialog, ada di $TMP2
  PILIH=`cat $TMP2`
 
  # simpan folder sekarang, lalu pindah ke folder pilihan
  pushd "$PWD"
  cd "$PILIH"
 
  # jalankan dialog pemilih musik
  until [ $? != 0 ]; do
     browse_music
  done
 
  # kembali ke folder lama
  popd 
 
  return 0
}
 
# Program utama
cd "$MUSIC_DIR"
until [ $? != 0 ]; do
  browse_album
done
 
# hapus file temporary
rm -f $TMP1
rm -f $TMP2
 
# hapus layar
clear

 

6 komentar:

  1. Keren sangat gan...
    buat reff tugas Kuliah

    BalasHapus
  2. Keren gan,, Sangat bermanfaat

    BalasHapus
  3. Ehhh maaf gan ane Mau nanya untuk penggunaan shell inikan harus connection or server jika ane pake 2 OS bisa ga yah... atau ada solusi lain gan

    BalasHapus