Kamis, 13 Desember 2012

Modul 4

VARIABEL LINGKUNGAN & PROGRAM EKSTERNAL


1  VARIABEL LINGKUNGAN
Ada  beberapa  himpunan  variabel  yang  telah  disiapkan  oleh  shell  Linux  dan  sebagian besar tidak dapat diberikan suatu nilai tertentu. Variabel-variabel ini biasanya menyimpan informasi penting yang bermanfaat mengenai lingkungan dimana ia berjalan. Himpunan  variabel  pertama  adalah  $0  ..  $9  dan    $#. Variabel  $0  adalah  basename (nama  dasar)  dari  program  saat  dipanggil. Variabel  $1  ..  $9  adalah  9  parameter tambahan yang disertakan saat pemanggilan skrip. Variabel $@ adalah  semua parameter $1 .. whatever. Variabel $*,  serupa dengan $@, tetapi  tidak   mempertahankan  whitespace  dan  tanda  petik  sehingga  "File with  spaces" menjadi  "File" "with" "spaces". Ini menyerupai echo. Sebagai aturan umum, gunakan $@ dan hindari $*.  $# adalah jumlah dari parameter yang disertakan saat pemanggilan skrip.  
Perhatikan skrip contoh berikut:
#!/bin/sh
# Nama file skrip: var3.sh
echo "Saya telah dipanggil dengan $# parameter"
echo "Nama saya adalah $0"
echo "Parameter pertama saya adalah $1"
echo "Parameter kedua saya adalah $2"
echo "Semua paramaeter adalah $@"
Perhatikan luaran yang diberikan saat program dijalankan:
$ /home/steve/var3.sh
Saya telah dipanggil dengan 0 parameter
Nama saya adalah /home/steve/var3.sh
Parameter pertama saya adalah 
Parameter kedua saya adalah 
Semua paramaeter adalah

$ ./var3.sh hello world earth
Saya telah dipanggil dengan 3 parameter
Nama saya adalah ./var3.sh
Parameter pertama saya adalah hello
Parameter kedua saya adalah world
Semua paramaeter adalah hello world earth


Nilai $0 berubah tergantung pada bagaimana skrip dipanggil. Utilitas eksternal basename dapat membantu menjelaskan: 
echo "Nama saya adalah `basename $0`"
$# dan  $1 .. $2 nilainya diset otomatis oleh shell. Kita dapat menyertakan  lebih dari 9 parameter dengan menggunakan perintah shift. Perhatikan skrip berikut: 

#!/bin/sh
# Nama file skrip: var4.sh
while [ "$#" -gt "0" ]
do
  echo "\$1 is $1"
  shift
done
Skrip  ini  berjalan    menggunakan  shift  sampai  $#  turun  menjadi  nol,  sampai  daftar menjadi kosong. Variabel  khusus  lain  adalah  $?.  Ini mengandung  nilai  keluar  (exit)  dari  perintah  yang terakhir berjalan. Sehingga kode:
#!/bin/sh
/usr/local/bin/my-command
if [ "$?" -ne "0" ]; then
  echo "Afwan, ada masalah!"
fi
akan  mencoba  untuk  menjalankan  /usr/local/bin/my-command  yang  akan  keluar dengan nilai nol jika semua berjalan baik atau tidak nol jika terjadi kegagalan. Kita dapat menangani  ini dengan memeriksa nilai dari $?  setelah memanggil perintah  tersebut.  Ini akan menjadikan  skrip   robust  (berkualitas) dan  lebih cerdas. Aplikasi yang bagus akan mengembalikan nol jika berhasil.  Dua himpunan variabel utama  lain  yang disediakan oleh  lingkungan  shell Linux adalah $$ dan $!. Keduanya digunakan untuk memroses bilangan. Variabel  $$  adalah  PID  (Process  IDentifier)  dari  shell  yang  sedang  berjalan.  Ini  dapat berguna  untuk  pembuatan  file  sementara  (temporer),  seperti  /tmp/my-script.$$  yang berguna  jika dibutuhkan banyak  instance dari skrip berjalan pada   waktu yang sama dan semuanya  memerlukan  file  temporer  tersendiri.  Variabel  $!  Adalah  PID  dari  proses background  yang  terakhir  dijalankan.  Ini  berguna  untuk memelihara  track  dari  proses saat proses tersebut kembali mendapatkan jatah eksekusi. Variabel  lain  yang cukup menarik adalah IFS. Singkatan dari  Internal Field Separator. Nilai  defaultnya  adalah  SPACE  TAB  NEWLINE,  tetapi  jika  anda  mengubahnya,  lebih mudah mengambil salinannya. Contohnya sebagai berikut:
#!/bin/bash
# Nama file skrip: var5.sh
old_IFS="$IFS"
IFS=:
echo "Masukkan 3 data yang dipisahkan titik dua ..."
read x y z
IFS=$old_IFS
echo "x adalah  $x y adalah $y z adalah $z"
Skrip di atas berjalan seperti dibawah ini:
$ ./var5.sh
Masukkan 3 data yang dipisahkan titik dua ...
hello:how are you:today
x is hello y is how are you z is today
Perlu  disadari  bahwa  IFS  terutama  dapat  mengandung  spasi,  baris  bari  atau  karakter "uncontrollable". Alangkah  baiknya  jika  anda menggunakan  double-quote  di  awal  dan akhirnya, yaitu old_IFS="$IFS", bukan old_IFS=$IFS.  Sebagaimana  telah  disebutkan,  kurung  kurawal  yang  mengelilingi  variabel  akan menghindari kebingungan: 
foo=sun
echo $fooshine     # $fooshine tidak didefinisikan
echo ${foo}shine   # menampilkan kata "sunshine"

2 NILAI DEFAULT
Potongan  kode  berikut  menampilkan  prompt,  meminta  input  dari  pengguna.  Jika pengguna tidak memasukkan teks apapun, hanya menekan Enter, skrip memberikan nilai default, yaitu nilai luaran suatu perintah ‘whoami’: 
#!/bin/sh
# Nama file skrip: name.sh
echo -en "Siapa anda? [ `whoami` ] "
read myname
if [ -z "$myname" ]; then
  myname=`whoami`
fi
echo "Anda adalah $myname"
Tambahan  "-en"  pada  perintah  echo memberitahukan  echo  untuk  tidak menambahkan suatu linebreak. Pada beberapa sistem, anda dapat menggunakan "\c" pada ujung baris.  Eksekusi dari skrip ini adalah
steve$ ./name.sh
Siapa anda? [ steve ]
Anda adalah steve
 ... atau dengan suatu masukan pengguna:
 steve$ ./name.sh
Siapa anda? [ steve ] foo
Anda adalah foo
Adakah fitur yang  lebih menarik? Ada, gunakan kurung siku dan dan karakter khusus “:-“.  Anda dapat menentukan suatu nilai default jika variabel tidak diset (unset):
echo -en "Siapa anda? [ `whoami` ] "
read myname
echo "Anda adalah ${myname:-`whoami`}"
Anda  juga dapat memberikan nilai tetap (bukan output dari suatu perintah eksternal)  jika variabel tidak diset:
echo " Anda adalah ${myname:-John Doe}"
Ingat kembali penggunaan backtick, `whoami` berjalan dalam suatu sub-shell,  sehingga suatu  perintah  cd  atau  perubahan  terhadap  variabel  lain,  di  dalam  backtick,  tidak  akan mempengaruhi shell yang sedang berjalan. 
Mengubah Nilai Default
Ada  sintaks  berbentuk  ":="  yang  dapat  digunakan  untuk  mengubah  nilai  variabel  ke suatu default jika tidak didefinisikan: 
echo "Anda adalah ${myname:=John Doe}"
Teknik  ini berarti bahwa akses berikutnya ke variabel $myname akan mendapatkan suatu nilai, nilai yang dimasukkan pengguna atau "John Doe" jika tidak.

II. 3 PROGRAM EKSTERNAL
Program eksternal  sering digunakan di dalam  skrip  shell. Ada beberapa perintah builtin (echo,  which  dan  test  yang  sudah  umum).  Ada  banyak  perintah  lain  yang  berguna merupakan perintah Linux, bukan bawaan shell (Bash) seperti tr, grep, expr dan cut. Tanda backtick (`) sering diasosiasikan dengan perintah eksternal. Backtick menunjukkan bahwa  teks  yang  diapitnya  akan  dieksekusi  sebagai  suatu  perintah. Mudah  dipahami. Pertama,  gunakan  shell  interaktif  untuk membaca  nama  panjang  anda  (full  name)  yang terdapat di dalam file /etc/passwd:
$ grep "^${USER}:" /etc/passwd | cut -d: -f5
Steve Parker
Sekarang  masukkan output ini  ke dalam variabel agar dapat lebih mudah dimanipulasi:
$ MYNAME=`grep "^${USER}:" /etc/passwd | cut -d: -f5`
$ echo $MYNAME
Steve Parker
Terlihat  jelas  bahwa  backtick  menangkap  output  standard  dari  suatu  perintah  atau himpunan perintah yang dijalankan  Ini  juga dapat meningkatkan kinerja  jika anda  ingin menjalankan banyak perintah dan memparsing bit-bit outputnya:
#!/bin/sh
find / -name "*.html" -print | grep "/index.html$"
find / -name "*.html" -print | grep "/contents.html$"
Kode di atas membutuhkan waktu  lama dalam menyelesaikan eksekusinya. Solusi yang lebih baik adalah
#!/bin/sh
HTML_FILES=`find / -name "*.html" -print`
echo "$HTML_FILES" | grep "/index.html$"
echo "$HTML_FILES" | grep "/contents.html$"
Tanda petik ganda yang mengapit $HTML_FILES sangat penting untuk menyediakan baris baru  antar  setiap  file  yang  didaftarkan.  Jika  tidak,  grep  akan  melihat  baris  teks  yang sangat panjang, bukan satu baris per file. Cara ini hanya menjalankan perintah find 1 kali sehingga waktu eksekusi skrip menjadi setengah dari sebelumnya. 
Tulis dan Jalankan!
Apa yang dihasilkan oleh skrip pendek dibawah ini?
#!/bin/sh
# Nama file skrip: testgrep.sh
steves=`grep -i steve /etc/passwd | cut -d: -f1`
echo "All users with the word \"steve\" in their passwd"
echo "Entries are: $steves"
Skrip  ini akan berjalan baik  jika hanya ada satu baris yang cocok. Namun,  jika ada dua baris  dalam  /etc/passwd  mengandung  kata  "steve"  maka  shell  interaktif  akan menampilkan:
$> grep -i steve /etc/passwd 
steve:x:5062:509:Steve Parker:/home/steve:/bin/bash
fred:x:5068:512:Fred Stevens:/home/fred:/bin/bash
$> grep -i steve /etc/passwd |cut -d: -f1
steve
fred
Tetapi skrip testgrep.sh akan menampilkan:
Entries are: steve fred
Dengan menempatkan  hasil  ke  dalam  suatu  variabel  kita  telah mengubah   NEWLINE menjadi  spasi; manpage  dari  sh memberitahukan  bahwa  karakter  pertama  dalam  $IFS akan digunakan untuk tujuan ini. Secara default IFS adalah <space><tab><cr>. 
Apa yang dihasilkan oleh skrip berikut:
#!/bin/sh
steves=`grep -i steve /etc/passwd | cut -d: -f1`
echo "All users with the word \"steve\" in their passwd"
echo "Entries are: "
echo "$steves" | tr ' ' '\012'
Perlu diingat bahwa tr menerjemahkan spasi ke dalam karakter octal 012 (NEWLINE). Perintah  tr  dapat melibatkan  range  (rentang), mengkonversi  teks  ke  huruf  besar  atau kecil, misalnya:
#!/bin/sh
# Nama file skrip: changecase.sh
steves=`grep -i steve /etc/passwd | cut -d: -f1`
echo "All users with the word \"steve\" in their passwd"
echo "Entries are: "
echo "$steves" | tr ' ' '\012' | tr '[a-z]' '[A-Z]'
Di sini ditambahkan suatu translasi dari [a-z] ke [A-Z]. Terdapat jumlah nilai yang sama dalam  range  a-z  dan  A-Z.  Kemudian  dilakukan  translasi  suatu  karakter  dalam  range ASCII  a-z menjadi A-Z  ...  dengan  kata  lain mengubah  huruf  kecil  ke  pasangan  huruf besarnya. Perintah tr sebenarnya lebih cerdas:  tr [:lower:] [:upper:]  memberikan hasil sama dan lebih mudah dibaca.


Tidak ada komentar:

Posting Komentar