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