Shell Scripts


Salah satu kata pepatah yang sering saya dengar atau baca adalah ikatlah ilmu dengan menulisnya. Nah, ketika lagi searching masalah Shell Scripting tidak sengaja menemukan tulisan menarik dari Mas Rio Astamal, dari pada hanya di download terus lupa dimana file-nya mending di tulis di Blog, jadi suatu saat bisa dilihat kembali. Berikut isi tulisan yang luar biasa tersebut :

------------------------
1.0 APA ITU SHELL SCRIPT
------------------------
   Dalam lingkungan unix, kata 'shell' mengacu pada semua program yang dapat 
   dijalankan pada command line. Jadi secara sederhana shell script merupakan
   kumpulan perintah yang disimpan pada suatu file. Extensi umum yang digunakan
   untuk shell script adalah '.sh', sebenarnya hal ini tidak mutlak karena
   pada dasarnya unix mengabaikan extensi file.
   
   Shell juga dapat mengacu pada program yang menangani command line itu 
   sendiri dalam sistem operasi UNIX program tersebut adalah Bourne Shell
   (1978 - Steve Bourne) disingkat sh. Dalam sistem operasi GNU/Linux shell yang 
   menjadi standar adalah Bourne Again Shell(bash). Bash merupakan shell yang
   kompatibel dengan sh dan memiliki lebih banyak fitur.
   
   Jika anda ingin menguasai shell script tentu anda harus tahu dan hafal
   sedikit banyak perintah dasar command line, seperti mengkopi file(cp),
   merename file(mv), mencetak string (echo), melihat file(cat), dan beberapa
   perintah dasar lainnya.
   
   Shell script juga menyediakan beberapa fitur yang tersedia pada bahasa
   pemrograman tingkat tinggi seperti variabel, percabangan dan perulangan. 
   Berikut ini adalah contoh sederhana penggunakan shell script:
   
   lug@stikom.edu:~$ nano hello.sh
   #!/bin/sh
   echo 'HELLO WORLD'
   
   Untuk menjalankan ada dua cara, pertama melalui program shell itu sendiri
   
   lug@stikom.edu:~$ sh hello.sh
   
   Kedua adalah mengeksekusinya secara independen, untuk melakukan hal tersebut
   anda harus memberi permission 'execute' pada file.
   
   lug@stikom.edu:~$ chmod +x hello.sh
   lug@stikom.edu:~$ ./hello.sh
   HELLO WORLD
   
   Baris pertama #!/bin/sh adalah MUTLAK diperlukan dan HARUS diletakkan pada
   BARIS PERTAMA agar file yang anda buat dikenali sistem sebagai shell script. 
   Tanda '#!' sering disebut 'shebang' operator. Tanda tersebut menandakan 
   bahwa file tersebut adalah shell script. Sisanya misal '/bin/sh' adalah
   lokasi file binari atau program. Dalam contoh kita menggunakan program
   bash '/bin/sh' atau '/bin/bash'.
   
   Tanda # jika tidak terletak pada baris dan kolom paling awal akan dianggap
   sebagai komentar oleh shell.
   
------------
1.1 Variabel
------------
   Pemberian variabel pada shell script bersifat 'dynamic typing' karena
   shell script tidak mengenal adanya tipe data. Pada shell script dikenal
   dua istilah variabel yaitu SYSTEM VARIABLE(SV) dan USER DEFINED VARIABLE 
   (UDV). SV adalah kumpulan variabel yang telah dideklarasikan secara otomatis
   oleh shell, sedangkan UDV adalah variabel yang kita buat sendiri. Contoh dari
   variabel SV adalah HOME, SHELL, RANDOM, OSTYPE, dan masih banyak yang lain.
   
   Dalam membuat variabel ada beberapa aturan yang harus dipenuhi agar variabel
   tersebut dianggap valid oleh shell, syntax untuk penamaan variabel adalah:
   
   nama_variabel=NILAI
   
   Perhatikan bahwa tidak ada spasi antara nama_variabel dengan tanda '=' juga
   dengan NILAI. Ini adalah suatu KEHARUSAN. Berikut adalah beberapa aturan
   tentang penamaan variabel:
   
   1. Variabel HARUS diawali ABJAD atau _ (tidak dapat diawali angka)
   2. Variabel dapat terdiri dari karakter alphanumeric dan _
   3. Variabel bersifat CaSe SeNsItIvE
   4. Jika isi variabel mengandung spasi sebaiknya apit dengan tanda petik (')
      atau (").
   5. Gunakan escape character (\) untuk karakter non-literal 
      seperti (\', \$, \?, dll)
   
   Untuk mencetak nilai dari suatu variabel digunakan tanda dollar ($) didepan
   nama variabel, contoh:
   
   lug@stikom.edu:~$ a='Hello '
   lug@stikom.edu:~$ b='World!'
   lug@stikom.edu:~$ echo $a$b
   Hello World!
   lug@stikom.edu:~$ echo ${a}${b}
   Hello World!
   
   Cara yang terakhir adalah cara yang disarankan untuk menghindari kesalahan
   dalam melakukan concat string.
   
   Jika anda ingin menyimpan output dari suatu perintah kedalam suatu variabel 
   gunakan tanda backtick (`). Contoh, kita akan melihat isi direktori home
   lalu menyimpannya dalam variabel isi_home.
   
   lug@stikom.edu:~$ isi_home=`ls /home`
   lug@stikom.ecu:~$ echo $isi_home
   
   Dalam shel juga terdapat SPECIAL VARIABEL untuk mendapatkan exit status dari
   suatu program. Pada UNIX setiap program dinyatakan selesai TANPA error 
   apabila exit statusnya SAMA DENGAN 0. Selain itu maka program tersebut
   selesai tapi dengan error. Variabel tersebut adalah "$?".
   
   lug@stikom.edu:~$ ls /home
   lug@stikom.edu:~$ echo $?
   0
   lug@stikom.edu:~$ ls /file/ngawur
   lug@stikom.edu:~$ echo $?
   2
   
   Angka 2(TIDAK SAMA DENGAN 0) menunjukkan bahwa program ls keluar dengan
   status terjadi error. Penggunaan exit sangat penting saat kita membuat
   shell script yang kompleks, dimana didalamnya kita banyak menggunakan
   program lain.
   
------------------------------
1.2 Command Line dan Argument
------------------------------
   Ketika berbicara shell script kita pasti berhubungan dengan command line. 
   Apabila berbicara tentang command line pasti berhubungan dengan argument.
   Apaliba berbicara tentang argument.....cukup....cukup.... nanti malah sampai
   sejarah kerajaan majapahit nantinya :)
   
   Perintah-perintah command line umumnya memerlukan minimal satu buah argumen
   agar dapat mengerjakan tugasnya secara optimal. Apa itu argument? secara
   sederhana argumen adalah text/character yang ditempatkan setelah nama program
   dengan pemisah minimal satu spasi. 
   
   Contoh berikut mengilustrasikan pemberian dua argument pada perinta copy file
   `cp`. Perintah cp memerlukan dua argument yaitu 1)lokasi file awal
   2)lokasi file tujuan
   
   lug@stikom.edu:~$ cp /foo/bar /tmp/bar
                            ^       ^
                      argument-1  argument-2
   
   Pada sistem Linux dikenal dua istilah argument short style(UNIX style) dan
   long style(GNU Style). Hampir setiap program command line pada linux
   menyediakan dua opsi tersebut saat memberikan argument. Penulisan argument 
   UNIX style biasanya hanya terdiri dari satu huruf contoh '-l' pada perintah
   `ls`. 
   
   lug@stikom.edu:~$ ls -l
   
   Sedangkan GNU style umumnya terdiri dari minimal sebuah kata contoh
   '--all' pada perintah `ls`.
   
   lug@stikom.edu:~$ ls --all
   
   Untuk membaca argument dalam shell script digunakan special variabel yaitu
   $0, $1, $2,...$9. Variabel $0 adalah nama program itu sendiri.
   
   CATATAN:
   Untuk mengetahui jumlah argument yang diinputkan user gunakan variabel $#,
   sedangkan untuk mendapatkan seluruh argument gunakan variabel $*.
   
   LATIHAN:
   Buat sebuah shell script untuk menampilkan nama user, nama tersebut 
   diinput melalui argument ke-1
   
   JAWAB:
   lug@stikom.edu:~$ nano nama.sh
   #!/bin/sh
   nama=$1
   echo 'Halo '$nama', selamat datang!'
   
   lug@stikom.edu:~$ chmod +x nama.sh
   lug@stikom.edu:~$ ./nama.sh STIKOM
   Halo STIKOM, selamat datang!
   lug@stikom.edu:~$ ./nama.sh STIKOM SURABAYA
   Halo STIKOM, selamat datang!
   lug@stikom.edu:~$ ./nama.sh 'STIKOM SURABAYA'
   Halo STIKOM SURABAYA, selamat datang!
   
   CATATAN: 
   Untuk menyimpan file pada nano Tekan CTRL-O lalu jika ingin keluar tekan 
   CTRL-X.

--------------------------
1.3 Perhitungan Aritmatik
--------------------------
   Untuk melakukan perhitungan aritmatik, shell tidak memiliki kemampuan
   built-in, tetapi meminta bantuan program lain yaitu `expr`. Program expr
   berfungsi untuk mengevaluasi suatu expresi baik itu perbandingan string
   atau operasi aritmatik sederhana.
   
   Operator aritmatik yang disediakan expr antaran lain:
   +-----------+-----------------------------------------------------------+
   | Operator  | KETERANGAN                                                |
   +-----------+-----------------------------------------------------------+
   |     +     | Operator Penjumlahan contoh: expr 1 + 1                   |
   +-----------+-----------------------------------------------------------+
   |     -     | Operator Pengurangan contoh: expr 10 - 9                  | 
   +-----------+-----------------------------------------------------------+
   |     *     | Operator Perkalian contoh: expr 10 \* 10                  |
   +-----------+-----------------------------------------------------------+
   |     /     | Operator Pembagian contoh: expr 10 / 2                    |
   +-----------+-----------------------------------------------------------+
   |     %     | Operator Modulus contoh: expr 15 % 3                      |
   +-----------+-----------------------------------------------------------+
   
   Selain digunakan untuk perhitungan aritmatik, perintah `expr` juga cukup
   handal untuk melakukan manipulasi string, untuk lebih jelas silahkan lihat
   halaman manual dari expr dengan mengetikkan `man expr`.
   
   LATIHAN:
   Buatlah sebuah shell script untuk menghitung nilai dari argument-1 dikali
   argument-2 ditambah argument-3!
   
   JAWABAN:
   Secara matematis perhitungannya adalah 
   
   (argument-1 + argument-2) + argument-3. 
   
   Tidak seperti bahasa tingkat tinggi, pada shell script untuk memberi 
   prioritas pada suatu perhitungan kita menggunakan tanda $[ ... ]. Jadi 
   perhitungannya menjadi
   
   $[ argument-1 + argument-3 ] + argument-3
   
   Keuntungan lain ketika kita menggunakan tanda $[...] adalah kita tidak perlu
   melakukan escaping character pada tanda perkalian(*). Berikut ini adalah 
   shell scriptnya.
   
   lug@stikom.edu:~$ nano hitung.sh
   #!/bin/sh

   bil1=$1
   bil2=$2
   bil3=$3

   echo -n "HASIL DARI $bil1 * $bil2 + $bil3 = "
   echo `expr $[ $bil1 * $bil2 ] + $bil3`
   lug@stikom.edu:~$ chmod +x hitung.sh
   lug@stikom.edu:~$ ./hitung.sh 10 10 10
   HASIL DARI 10 * 10 + 10 = 110
   
---------------
1.4 User Input
---------------
   Selain melalui argument pada command line, cara lain untuk mendapatkan input
   dari user adalah melalui STANDARD INPUT (STDIN). Dimana user langsung 
   mengetikkan isi dari suatu nilai yang program inginkan.
   
   Untuk mendapatkan input dari user dapat digunakan perintah `read`. Perintah
   read tidak begitu berguna jika kita tidak menyimpan hasil inputan tersebut
   kedalam sebuah variabel. Untuk menyimpan hasil inputan kita harus memberi
   satu argument pada perintah read. Argument inilah yang akan menyimpan nilai
   yang diinputkan. Contoh,
   
   lug@stikom.edu:~$ read a
   10
   lug@stikom.edu:~$ read b
   5
   lug@stikom.edu:~$ expr $a \* $b
   50
   
   LATIHAN:
   Sama dengan latihan sebelumnya, hanya saja kali ini gunakan perintah read
   untuk membaca setiap bilangan yang diinputkan user.
   
   JAWABAN:
   lug@stikom.edu:~$ nano hitung2.sh
   #!/bin/sh

   # deklarasikan variabel dengan nilai NULL
   bil1=
   bil2=
   bil3=

   echo -n 'Masukkan bilangan-1: '
   read bil1
   echo -n 'Masukkan bilangan-2: '
   read bil2
   echo -n 'Masukkan bilangan-3: '
   read bil3

   echo ''
   echo -n "Hasil dari $bil1 * $bil2 + $bil3 = "
   echo `expr $[ $bil1 * $bil2 ] + $bil3`
   lug@stikom.edu:~$ chmod +x hitung2.sh
   lug@stikom.edu:~$ ./hitung2
   Masukkan bilangan-1: 10
   Masukkan bilangan-2: 10
   Masukkan bilangan-3: 10

   Hasil dari 10 * 10 + 10 = 110
   
----------   
1.5 Piping
----------
   Piping merupakan penggabungan dua atau lebih perintah dimana output dari
   perintah sebelumnya digunakan sebagai input untuk perintah selanjutnya. 
   Simbol yang digunakan untuk membatasi perintah yang satu dengan yang lain
   adalah tanda pipe "|". Berikut adalah beberapa contoh sederhana penggunaan
   piping pada command line.
   
   lug@stikom.edu:~$ cat /etc/passwd | wc -l
   lug@stikom.edu:~$ cat /etc/passwd | sort -r
   lug@stikom.edu:~$ cat /etc/passwd | grep "/bin/sh/" | wc -l

---------------
1.6 Redirection
---------------
   Secara umum jika kita ingin mengambil inputan maka kita mengambil dari
   STANDARD INPUT (STDIN) yaitu keyboard. Sedangkan hasil output program yang
   tercetak di layar monitor kita disebut STANDARD OUTPUT (STDOUT). Hampir sama 
   dengan STDOUT, error yang dihasilkan program juga ditampilkan lewat monitor 
   biasa disebut STANDARD ERROR (STDERR). Setiap standard mempunyai kode file 
   descriptor sendiri-sendiri diantaranya:
   
   - STDIN => File Descriptor: 0
   - STDOUT => File Descriptor: 1
   - STDERR => File Descriptor: 2
   
   Dengan mengetahui file descriptor tersebut kita dapat melakukan redirection
   (pengalihan), misal dari dari STDOUT menjadi STDERR atau sebaliknya. 
   Terdapat tiga simbol untuk melakukan redirection diantarnya:
   
   1.
   Simbol: ">"
   Keterangan: Simbol tersebut akan meredirect output ke dalam suatu file. Jika
               file tersebut belum ada maka akan buat secara otomatis, jika 
               file sudah ada ada maka isinya akan di-overwrite/ditimpa.
   
   2.
   Simbol: ">>"
   Keterangan: Hampir sama dengan ">" hanya saja jika file sudah ada, maka file
               isi tersebut tidak dioverwrite tetapi ditambah.
   
   3.
   Simbol: "<"
   Keterangan: Simbol "<" artinya input tidak diambil dari STDIN melainkan dari
               sebuah file.
   
   Sebagai contoh sederhana, ketika anda mengetikkan perintah `ls /nama/dir`
   maka secara default program ls akan menampilkan output ke STDOUT yaitu
   layar monitor. Jika kita ingin meredirect output yang dihasilkan kedalam
   sebuah file maka kita dapat menggunakan simbol ">" atau ">>". Intinya segala
   STDOUT dapat dilakukan redirect.
   
   lug@stikom.edu:~$ echo 'DAFTAR ISI FOLDER LUG' > /tmp/data.txt
   lug@stikom.edu:~$ ls /home/lugstikom >> /tmp/data.txt
   
   Untuk contoh "<" kita akan menggunakan program tr, program ini dapat kita
   gunakan untuk manipulasi teks. Input yang akan kita berikan ke tr adalah
   dari sebuah file, nantinya teks yang ada pada file tersebut akan di-UPPER
   CASE semua.
   
   lug@stikom.edu:~$ echo 'stikom surabaya' > /tmp/stikom.txt
   lug@stikom.edu:~$ tr "[a-z]" "[A-Z]" < /tmp/stikom.txt
   STIKOM SURABAYA
   
   Selain meredirect ke file kita juga dapat melakukan redirect ke file 
   descriptor lain. Misal dari STDOUT ke STDERR atau sebaliknya.
   
   lug@stikom.edu:~$ rm /file/ngawur 2>&1
   lug@stikom.edu:~$ ls / 1>&2
   
-----------
1.7 FUNGSI
-----------
   Hampir sama dengan bahasa pemrograman tingkat tinggi, pada shell script juga
   dikenal istilah fungsi. Dimana dengan adanya fungsi kita dapat membagi
   kode kita ke dalam sub-sub yang lebih kecil. Hal ini sangat berguna jika kita
   membangun sebuah program shell script yang cukup kompleks. Syntax penggunaan
   fungsi pada shell script adalah:
   
   function nama-fungsi() 
   {
      perintah
      ...
      ...
      return
   }

   LATIHAN:
   Buatlah shell script untuk mencetak banner seperti output berikut:
   
   lug@stikom.edu:~$ ./fungsi.sh
   ==============================
    SELAMAT DATANG DI LUG-STIKOM
   ==============================
   HARI INI: Rabu, 14-05-2008
   
   Tulisan "SELAMAT blabla..." diletakkan dalam fungsi tersendiri, begitu pula
   fungsi untuk mencetak tanggal. Fungsi mencetak tanggal nantinya akan 
   dipanggil didalam fungsi yang mencetak tulisan "SELAMAT...".
   
   JAWAB:
   lug@stikom.edu:~$ nano fungsi.sh
   #!/bin/sh

   function indo_date() {
           echo `date +"%A, %d-%m-%Y"`
           return
   }

   function welcome() {
           echo "=============================="
           echo " SELAMAT DATANG DI LUG-STIKOM"
           echo "=============================="
           echo -n "HARI INI: "
           indo_date
           return
   }

   welcome
   lug@stikom.edu:~$ chmod +x fungsi.sh
   
   Apakah fungsi pada shell script juga menerima parameter? YA tapi dengan 
   sedikit "nyeleneh". Kenapa? jika pada bahasa pemrograman umumnya parameter
   diletakkan diantara tanda (), tidak demikian dengan shell script. Cara 
   pengambilan parameter pada shell script sama dengan pengambilan argument
   pada program shell script itu sendiri. Jadi kita dapat menggunakan variabel
   $*, $#, $0, $1, dan seterusnya.
   
   Dibawah ini adalah contoh pembuatan fungsi untuk mengubah text menjadi
   UPPER-CASE.
   
   lug@stikom.edu:~$ nano fungsi2.sh
   #!/bin/sh
   function toUpperCase() {
           teks=$*
           echo $teks | tr "[a-z]" "[A-Z]"
           return
   }

   echo -n "Masukkan teks(lowercase): "
   read foo
   toUpperCase $foo
   lug@stikom.edu:~$ chmod +x fungsi2.sh
   lug@stikom.edu:~$ ./fungsi2.sh
   Masukkan teks(lowercase): ini lower case
   INI LOWER CASE

   Pada contoh diatas kita menggunakan variabel $* untuk mengambil parameter 
   bukan $1 atau $2 dkk karena yang akan diinputkan user kemungkinan mengandung 
   dua kata atau lebih. Jadi jika kita menggunakan variabel $1 maka yang terbaca 
   hanya kata pertama. Untuk itu kita gunakan variabel $* yang akan membaca 
   semua parameter.
   

---------------
2.0 Percabangan
---------------
   Dengan menggunakan percabangan/branching maka kita dapat mengontrol alur 
   dari shell script yang kita buat. Hal ini memungkinkan kita untuk menulis 
   program yang sangat kompleks pada shell script. Syntax penggunaan percabangan 
   pada shell script adalah:
   
   if kondisi
   then
      ...
      ...
   fi
   -----------
   if kondisi
   then
      ...
      ...
   else
      ...
      ...
   fi
   -----------
   if kondisi1
   then
      ...
      ...
   elif kondisi1
      ...
      ...
   elif kondisi-n
      ...
      ...
   else
      ...
      ...
   fi
   --------------
   case $variabel in
      pattern1) perintah
               ...
               perintah;;
      pattern1) perintah
               ...
               perintah;;
      *) perintah
         ...
         perintah;;
   esac
   
   Untuk melakukan perbandingan kondisi pada data kita dapat menggunakan
   perintah `test`(man test) atau meletakkannya dalam blok [ ].
   
   Berikut ini adalah operator yang dapat digunakan untuk membandingkan data
   NUMERIK:
   
   +------------+-----------------------------------+
   | OPERATOR   | KETERANGAN                        |
   +------------+-----------------------------------+
   |    -eq     | SAMA DENGAN (=)                   |
   +------------+-----------------------------------+
   |    -ne     | TIDAK SAMA DENGAN (!=)            |
   +------------+-----------------------------------+
   |    -gt     | LEBIH BESAR (>)                   |
   +------------+-----------------------------------+
   |    -ge     | LEBIH BESAR ATAU SAMA DENGAN (>=) |
   +------------+-----------------------------------+
   |    -lt     | KURANG DARI (<)                   |
   +------------+-----------------------------------+
   |    -le     | KURANG DARI ATAU SAMA DENGAN (<=) |
   +------------+-----------------------------------+
   
-------------------
2.1 if...then...fi
------------------
   
   lug@stikom.edu:~$ nano if-then-fi.sh
   #!/bin/sh
   
   num_arg=$#
   bil1=$1
   bil2=$2

   function help() {
	   echo 'Penggunaan: '
	   echo "$0 bil1 bil2"
	   echo ''
	   echo Dimana bil1 dan bil2 harus angka genap.
	   return
   }

   function cek_arg() {
	   if test $num_arg -lt 2 
	   then
		   help
		   exit 1	# keluar dengan exit status 1
	   fi
	
	   if [ `expr $bil1 % 2` -ne 0 ] ; then
		   help
		   exit 1
	   fi
	
	   if [ `expr $bil2 % 2` -ne 0 ] 
	   then
		   help
		   exit 1
	   fi
	   return
   }

   cek_arg
   echo 'Argument anda adalah '$bil1' dan '$bil2
   exit 0
   lug@stikom.edu:~$ chmod +x if-then-fi.sh
   lug@stikom.edu:~$ ./if-then-fi.sh 
   Penggunaan: 
   ./if-then-fi.sh bil1 bil2

   Dimana bil1 dan bil2 harus angka genap.
   lug@stikom.edu:~$ echo $?
   1
   lug@stikom.edu:~$ ./if-then-fi.sh 2 4
   Argument anda adalah 2 dan 4
   lug@stikom.edu:~$ echo $?
   0
   
   Perintah exit pada shell script dapat digunakan untuk keluar langsung dari
   program. Pada contoh diatas, jika terdapat kesalahan kita keluar dengan exit
   status 1( bukan 0 ) artinya program selesai tapi dengan error. Error status
   tidak harus 1 tapi bisa sembarang angka asal BUKAN 0.

-------------------------
2.2 if...then...else...fi
-------------------------
   Statement pada blok else akan dieksekusi jika kondisi pada pada blok if
   bernilai false.
   
   lug@stikom.edu:~$ nano if-else.sh
   #!/bin/sh
   
   if test $1 -ge 0
   then
      echo "Argument bernilai positif"
   else
      echo "Argument bernilai negatif"
   fi
   lug@stikom.edu:~$ chmod +x if-else.sh
   lug@stikom.edu:~$ ./if-else 10
   Argument bernilai positif
   lug@stikom.edu:~$ ./if-else -2
   Argument bernilai negatif

--------------------------------
2.3 if...then...elif...else...fi
--------------------------------
   Statement elif digunakan jika kita ingin memilih lebih dari dua kondisi.
   
   lug@stikom.edu:~$ nano if-elif.sh
   #!/bin/sh
   pilih=
   teks="Sistem operasi pilihan anda adalah "

   echo "Pilih Sistem Operasi Anda: "
   echo "1. Linux"
   echo "2. Mac OS"
   echo "3. FreeBSD"
   echo "4. Lainnya"
   echo ""

   echo -n "Masukkan pilihan: "
   read pilih

   if [ $pilih = "1" ] ; then
	   echo "${teks}Linux"
   elif [ $pilih = "2" ] ; then
	   echo "${teks}Mac OS"
   elif [ $pilih = "3" ] ; then
	   echo "${teks}FreeBSD"
   else
	   echo "Anda memilih sistem operasi lain"
   fi
   lug@stikom.edu:~$ chmod +x if-elif.sh
   lug@stikom.edu:~$ ./if-elif.sh
   Pilih Sistem Operasi Anda: 
   1. Linux
   2. Mac OS
   3. FreeBSD
   4. Lainnya

   Masukkan pilihan: 3
   Sistem operasi pilihan anda adalah FreeBSD

-------------
2.5 Nested If
-------------
   Pada shell script anda juga dapat meletakkan blok if didalam if atau istilah
   "kerennya" nested if. Berikut adalah contoh sederhana penggunaannya.
   
   lug@stikom.edu:~$ nano nested-if.sh
   #!/bin/bash

   bil=$1
   if [ `expr $bil % 2` -eq 0 ] ; then
	   if [ $bil -ge 0 ] ; then
		   echo "Angka yang anda masukkan genap dan >= 0"
	   else
		   echo "Angka yang anda masukkan genap dan < 0"
	   fi
   else
	   if [ $bil -ge 0 ] ; then
		   echo "Angka yang anda masukkan ganjil dan >= 0"
	   else
		   echo "Angka yang anda masukkan ganjil dan < 0"
	   fi
   fi
   lug@stikom.edu:~$ sh nested-if.sh 10
   Angka yang anda masukkan genap dan >= 0
   lug@stikom.edu:~$ sh nested-if.sh -5
   Angka yang anda masukkan ganjil dan < 0

--------------------
2.6 case...in...esac
--------------------
   Perintah case hampir sama dengan if-then-elif-else-fi karena dapat memilih
   dari banyak kondisi. Sebagian orang lebih suka menggunakan case...esac
   dibanding multi level-if karena lebih mudah dibaca.

   Pada contoh dibawah ini adalah modifikasi dari contoh if-then-elif-else-fi
   yang pernah dibahas sebelumnya menggunakan case...in...esac.
   
   lug@stikom.edu:~$ nano case.sh
   #!/bin/sh
   pilih=
   teks="Sistem operasi pilihan anda adalah "

   echo "Pilih Sistem Operasi Anda: "
   echo "1. Linux"
   echo "2. Mac OS"
   echo "3. FreeBSD"
   echo "4. Lainnya"
   echo ""

   echo -n "Masukkan pilihan: "
   read pilih

   case $pilih in
	   "1") echo "${teks}Linux";;
	   "2") echo "${teks}Mac OS";;
	   "3") echo "${teks}FreeBSD";;
	   *)	echo "Anda memilih sistem operasi lain";;
   esac
   lug@stikom.edu:~$ sh case.sh
   Pilih Sistem Operasi Anda: 
   1. Linux
   2. Mac OS
   3. FreeBSD
   4. Lainnya

   Masukkan pilihan: 1
   Sistem operasi pilihan anda adalah Linux

--------------------------
2.7 Menangkap Error Status
--------------------------
   Seperti yang pernah dijelaskan sebelumnya bahwa untuk melihat error status
   dari suatu perintah kita gunakan special variable "$?". Error status ini 
   dapat kita gunakan untuk melihat apakah perintah yang kita jalankan berjalan
   tanpa error atau tidak. Error status terdiri dari dua flag yaitu:
   
   +-----------+-----------------+
   | NO. ERROR | STATUS PROGRAM  |
   +-----------+-----------------+
   |     0     | OK              |
   +-----------+-----------------+
   |    !=0    | TERJADI ERROR   |
   +-----------+-----------------+
   
   NOTE: != artinya TIDAK SAMA DENGAN
   
   Setelah anda mengetahui bagaimana menggunakan percabangan pada shell script
   maka kita dapat menggunakanya untuk menangkap error status yang dihasilkan
   oleh suatu program.
   
   lug@stikom.edu:~$ nano error-status.sh
   #!/bin/sh

   perintah=`rm /file/ngawur 2>/dev/null`
   if [ $? -eq 0 ] ; then
	   echo "PERINTAH SUKSES, EXIT STATUS: $?"
   else
	   echo "PERINTAH GAGAL, EXIT STATUS: $?"
   fi

   ls / 1>/dev/null
   if [ $? -eq 0 ] ; then
	   echo "PERINTAH SUKSES, EXIT STATUS: $?"
   else
	   echo "PERINTAH SUKSES, EXIT STATUS: $?"
   fi
   lug@stikom.edu:~$ sh error-status.sh
   PERINTAH GAGAL, EXIT STATUS: 1
   PERINTAH SUKSES, EXIT STATUS: 0
   
   Pada contoh diatas STDERR dan STDOUT semuanya di-redirect ke /dev/null. Hal 
   ini agar output perintah rm dan ls tidak muncul dilayar. /dev/null adalah
   semacam file "blackhole" yang dapat kita gunakan untuk mengririm semua output 
   yang tidak kita inginkan.
   
   CATATAN:
   Variabel $? hanya berisi error status dari perintah yang TERAKHIR KALI 
   dijalankan.


----------------------------------
3.0 Perulangan dalam Shell Script
----------------------------------
   Perbedaan utama kita, manusia dengan komputer adalah jika kita melakukan
   suatu pekerjaan berulang-ulang maka rasa bosan pasti datang. Tidak demikian
   dengan komputer, komputer melakukan hal-hal yang sama sebanyak 1 juta kali
   pun dia akan dengan "senang hati" melakukannya.
   
   Perulangan atau looping adalah pengeksekusian suatu blok perintah selama
   kondisi yang digunakan masih bernilai TRUE. Saya yakin anda pernah disuruh
   orang tua anda waktu kecil untuk berhitung 1 - 10. Dimana jika sudah melebihi 
   10 anda harus berhenti berhitung karena kondisi meminta anda untuk berhenti 
   pada saat mencapai sepuluh.
   
   Analogi sederhana diatas dapat menggambarkan bagaimana suatu looping bekerja.
   Dalam shell script terdapat dua tipe perulangan yaitu:
   
   - for loop
     - for...do...done
     - for...in...do...done
   - while loop
   
   Umumnnya perulangan `for` digunakan apabila kita sudah tahu batas perulangan 
   yang akan kita lakukan. Syntax penulisannya adalah:
   
   for nama_variabel in list
   do
      ...
      ...
   done
   -------------------------
   for (( expr1; expr2; expr3 ))
   do
      ...
      ...
   done

-------------------
3.1 for...do...done
-------------------
   Berikut adalah contoh untuk penggunaan for...do...done.
   
   lug@stikom.edu:~$ nano for.sh
   #!/bin/sh
   
   for (( i=0; i<=5; i++ ))
   do
      echo "PENALTI KE-$i GOL"!!!
   done
   lug@stikom.edu:~$ sh for.sh
   PENALTI KE-1 GOL!!!
   PENALTI KE-2 GOL!!!
   PENALTI KE-3 GOL!!!
   PENALTI KE-4 GOL!!!
   PENALTI KE-5 GOL!!!

------------------------
3.2 for...in...do...done
------------------------
   Pada for-in terdapat perbedaan cara penggunaan, pada for-in kita melakukan
   perulangan berdasarkan data yang ada pada list. Dimana setiap list dipisahkan 
   oleh tanda spasi. Berikut adalah contohnya:
   
   lug@stikom.edu:~$ nano for-in.sh
   #!/bin/sh

   for i in 1 2 3 4 5 ; do
	   echo -n "$i "
   done
   echo ''
   for abjad in "A B C D E" ; do
	   echo -n "$abjad "
   done
   echo ''
   lug@stikom.edu:~$ sh for-in.sh
   1 2 3 4 5
   A B C D E

---------------------
3.3 while...do...done
---------------------
   Bentuk perulangan lain yang juga sering digunakan adalah while. Perulangan
   menggunakan while lebih difokuskan jika kita memang belum mengetahui batas
   perulangan yang dilakukan. Syntax penggunaan while adalah sebagai berikut:
   
   while [ kondisi ]
   do
      ...
      ...
   done

   Berikut adalah contoh penggunaannya:
   
   lug@stikom.edu:~$ nano while.sh
   #!/bin/sh

   i=5
   while [ $i -ge 1 ] 
   do
	   echo "$i Mod 2 = "`expr $i % 2`
      i=`expr $i - 1`
   done
   lug@stikom.edu:~$ sh while.sh
   5 Mod 2 = 1
   4 Mod 2 = 0
   3 Mod 2 = 1
   2 Mod 2 = 0
   1 Mod 2 = 1

-------------------------
3.4 Percabangan Bersarang
-------------------------
   Suatu percabangan dapat berisi perbacabangan yang lain misalnya for didalam
   for atau while didalam while atau kombinasi keduanya. Nah bentuk inilah yang
   dinamakan percabangan bersarang(nested loop). Jumlah banyaknya nested loop
   dapat dikatakan tidak terbatas. 
   
   Anda sebagai pemrogram bebas dapat memasukkan
   sebanyak mungkin percabangan bersarang, tapi tentu dengan berbagai 
   pertimbangan teknis. Umumnya maksimal perbacangan bersarang yang sering 
   penulis gunakan adalah tiga, namun pada beberapa kondisi bisa lebih dari itu.
   Jadi itu semua relatif terhadap anda sebagai pemrogram dan kondisi yang 
   anda hadapi.
   
   Contoh berikut menunjukkan percabangan bersarang menggunakan for dengan 
   kedalaman dua level.
   
   lug@stikom.edu:~$ nano nested-for.sh
   #!/bin/sh

   for (( i=1; i<=5; i++ ))
   do
      for (( j=1; j<=5; j++ ))
      do
         echo -n "$i "
      done
      echo ""
   done
   lug@stikom.edu:~$ sh nested-for.sh
   1 1 1 1 1 
   2 2 2 2 2 
   3 3 3 3 3 
   4 4 4 4 4 
   5 5 5 5 5
---------
REFERENSI
---------
http://www.freeos.com/guides/lsst/
http://en.wikipedia.org/wiki/Shell_script
http://ilmukomputer.com/2007/03/06/membaca-proses-dengan-shell-script/

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s