Upload
ryandx-zvengenz
View
1.053
Download
15
Embed Size (px)
DESCRIPTION
asfafa
Citation preview
Belajar bash Scripting Linux23.34 LUTFI GNOME NO COMMENTS
pada kesempatan ini para penghuni Belajar Linux akan berbagi bahasa pemrograman Belajar bash Scripting
Linux ! Kali ini saya akan membahas mengenai pemrograman bash aka Bash Scripting. Bash tidaklah sulit. Anda
hanya membutuhkan Linux Shell / Terminal.
Preparation:
1. Any Linux OS
2. Any Linux terminal
3. Text editor (I'm using SublimeText 2 in this tutorial)
Walkthrough:
1. Buka text editor favorite anda
2. Simpan file dengan extensi sh (tidak masalah meskipun anda belum menulis apapun di dalam file anda.
3. Mulai dengan baris
#!/bin/sh
Baris ini akan memerintahkan terminal untuk mengeksekusi file dengan sh binary. Jika anda tidak memasukan baris
ini, anda harus mengeksekusi file ini dengan perintah:
root@kali:~# sh tutorial_bash.sh
Setelah ini, kita mulai dengan perintah sederhana, yaitu echo
echo "Hello world!"
Simpan file ini, jika anda memasukan baris #!/bin/sh, anda harus memastikan bahwa file ini executeable. Ubah file
permission menjadi executable dengan perintah
root@kali:~# chmod +x turorial_bash.sh
Kemudian eksekusi file dengan perintah:
root@kali:~# ./turorial_bash.sh
And you are done!
ok sekian dulu postingan Belajar bash Scripting Linux bertemu lagi di posting selanjutnya, jika ada request bisa
comment di bawah.
Linux untuk Pemula :: Programming :: Pengantar Pemrograman Bash Shell di Linux
Moch Fajar
Table of contents
1. Pendahuluan 2. Pemrograman Shell 3. Kebutuhan Dasar 4. Simple Bash Script 5. Variabel
a. Environment variabel b. Positional parameter c. User defined variabel
6. Simple I/O a. printf b. read c. Output dengan konstanta ansi i. pengaturan warna ii. pengaturan posisi kursor d. Output dengan tput
7. Seleksi & Perulangan a. Test & Operator i. Operator untuk integer ii. Operator untuk string iii. Operator untuk file iv. Operator logika b. Seleksi i. if ii. case c. Perulangan
8. Array 9. Subrutin
a. Mengirim argumen ke fungsi b. Cakupan variabel
1. PendahuluanApa itu shell ? shell adalah program (penterjemah perintah) yang menjembatani user
dengan sistem operasi dalam hal ini kernel (inti sistem operasi), umumnya shell
menyediakan prompt sebagai user interface, tempat dimana user mengetikkan
perintah-perintah yang diinginkan baik berupa perintah internal shell (internal
command), ataupun perintah eksekusi suatu file progam (eksternal command), selain
itu shell memungkinkan user menyusun sekumpulan perintah pada sebuah atau
beberapa file untuk dieksekusi sebagai program.
Hosting by:
indoglobal.com
Macam - macam shell?
Tidak seperti sistem operasi lain yang hanya menyediakan satu atau 2 shell, sistem
operasi dari keluarga unix misalnya linux sampai saat ini dilengkapi oleh banyak shell
dengan kumpulan perintah yang sangat banyak, sehingga memungkinkan pemakai
memilih shell mana yang paling baik untuk membantu menyelesaikan pekerjaannya,
atau dapat pula berpindah-pindah dari shell yang satu ke shell yang lain dengan
mudah, beberapa shell yang ada di linux antara lain:
Bourne shell(sh), C shell(csh), Korn shell(ksh), Bourne again shell(bash), dsb.
Masing - masing shell mempunyai kelebihan dan kekurangan yang mungkin lebih
didasarkan pada kebutuhan pemakai yang makin hari makin meningkat, untuk
dokumentasi ini shell yang digunakan adalah bash shell dari GNU, yang merupakan
pengembangan dari Bourne shell dan mengambil beberapa feature (keistimewaan) dari
C shell serta Korn shell, Bash shell merupakan shell yang cukup banyak digunakan
pemakai linux karena kemudahan serta banyaknya fasilitas perintah yang
disediakan.versi bash shell yang saya gunakan adalah 2.04
[fajar@linux$]echo $BASH_VERSION
bash 2.04.12(1)-release
Mungkin saat anda membaca dokumentasi ini versi terbaru dari bash sudah dirilis
dengan penambahan feature yang lain.
2. Pemrograman Shell ?Yaitu menyusun atau mengelompokkan beberapa perintah shell (internal atupun
eksternal command) menjadi kumpulan perintah yang melakukan tugas tertentu sesuai
tujuan penyusunnya. Kelebihan shell di linux dibanding sistem operasi lain adalah
bahwa shell di linux memungkinkan kita untuk menyusun serangkaian perintah seperti
halnya bahasa pemrograman (interpreter language), melakukan proses I/O, menyeleksi
kondisi, looping, membuat fungsi, dsb. adalah proses - proses yang umumnya
dilakukan oleh suatu bahasa pemrograman, jadi dengan shell di linux kita dapat
membuat program seperti halnya bahasa pemrograman, untuk pemrograman shell
pemakai unix atau linux menyebutnya sebagai script shell.
3. Kebutuhan DasarSebelum mempelajari pemrograman Bash shell di linux sebaiknya anda telah
mengetahui dan menggunakan perintah - perintah dasar shell baik itu internal command
yang telah disediakan shell maupun eksternal command atau utility, seperti
cd, pwd, times, alias, umask, exit, logout, fg, bg, ls, mkdir, rmdir, mv, cp, rm, clear, ...
utilitas seperti cat, cut, paste, chmod, lpr,... redirection (cara mengirim output ke file atau menerima input dari file), menggunakan
operator redirect >, >>, <, <<, contohnya:
ls > datahasil ls dikirim ke file data, jika file belum ada akan dibuat tetapi jika sudah ada isinya akan ditimpa.
ls >> datahampir sama, bedanya jika file sudah ada maka isinya akan ditambah di akhir file.
cat < datafile data dijadikan input oleh perintah cat
pipa (output suatu perintah menjadi input perintah lain), operatornya : | , contoh:
ls -l | sort -souput perintah ls -l (long) menjadi input perintah sort -s (urutkan secara descending), mending pake ls -l -r saja :-)
ls -l | sort -s | more
cat <data | sort > databaru
Wildcard dengan karakter *, ?, [ ], contohnya:
ls i*tampilkan semua file yang dimulai dengan i
ls i?itampilkan file yang dimulai dengan i, kemudian sembarang karakter tunggal, dan diakhiri dengan i
ls [ab]*tampilkan file yang dimulai dengan salah satu karakter a atau b
4. Simple Bash ScriptLangkah awal sebaiknya periksa dulu shell aktif anda, gunakan perintah ps (report
process status)
[fajar@linux$]ps
PID TTY TIME CMD
219 tty1 00:00:00 bash
301 tty1 00:00:00 ps
bash adalah shell aktif di system saya, jika disystem anda berbeda misalnya csh atau ksh ubahlah dengan perintah change shell
[fajar@linux$]chsh
Password:
New shell [/bin/csh]:/bin/bash
Shell changed
atau dengan mengetikkan bash
[fajar@linux$]bash
sekarang coba anda ketikkan perintah dibawah ini pada prompt shell
echo "Script shell pertamaku di linux"
[fajar@linux$]echo "Script shell pertamaku di linux"
Script shell pertamaku di linux
string yang diapit tanda kutip ganda (double quoted) akan ditampilkan pada layar anda, echo adalah statement (perintah) built-in bash yang berfungsi menampilkan
informasi ke standard output yang defaultnya adalah layar. jika diinginkan mengulangi
proses tersebut, anda akan mengetikkan kembali perintah tadi, tapi dengan fasilitas
history cukup menggunakan tombol panah kita sudah dapat mengulangi perintah
tersebut, bagaimana jika berupa kumpulan perintah yang cukup banyak, tentunya
dengan fasilitas hirtory kita akan kerepotan juga mengulangi perintah yang diinginkan
apalagi jika selang beberapa waktu mungkin perintah-perintah tadi sudah tertimpa oleh
perintah lain karena history mempunyai kapasitas penyimpanan yang ditentukan. untuk
itulah sebaiknya perintah-perintah tsb disimpan ke sebuah file yang dapat kita panggil
kapanpun diinginkan.
coba ikuti langkah - langkah berikut:
1. Masuk ke editor anda, apakah memakai vi,pico,emacs,dsb...2. ketikkan perintah berikut
3. #!/bin/bash
4. echo "Hello, apa khabar"
5. simpan dengan nama file tes6. ubah permission file tes menggunakan chmod
7. [fajar@linux$]chmod 755 tes
8. jalankan
9. [fajar@linux$]./tes
kapan saja anda mau mengeksekusinya tinggal memanggil file tes tersebut, jika
diinginkan mengeset direktory kerja anda sehingga terdaftar pada search path ketikkan
perintah berikut
PATH=$PATH:.
setelah itu script diatas dapat dijalankan dengan cara
[fajar@linux$]tes
Hello, apa khabar
tanda #! pada /bin/bash dalam script tes adalah perintah yang diterjemahkan ke
kernel linux untuk mengeksekusi path yang disertakan dalam hal ini program bash pada
direktory /bin, sebenarnya tanpa mengikutkan baris tersebut anda tetap dapat
mengeksekusi script bash, dengan catatan bash adalah shell aktif. atau dengan
mengetikkan bash pada prompt shell.
[fajar@linux$]bash tes
tentunya cara ini kurang efisien, menyertakan path program bash diawal script
kemudian merubah permission file sehingga dapat anda execusi merupakan cara yang
paling efisien.
Sekarang coba kita membuat script shell yang menampilkan informasi berikut:
1. Waktu system2. Info tentang anda3. jumlah pemakai yang sedang login di system
contoh scriptnya:
#!/bin/bash
#myinfo
#membersihkan tampilan layar
clear
#menampilkan informasi
echo -n "Waktu system :"; date
echo -n "Anda :"; whoami
echo -n "Banyak pemakai :"; who | wc -l
sebelum dijalankan jangan lupa untuk merubah permission file myinfo sehingga dapat
dieksekusi oleh anda
[fajar@linux$]chmod 755 myinfo
[fajar@linux$]./myinfo
Waktu system : Sat Nov 25 22:57:15 BORT 2001
Anda : fajar
Banyak pemakai : 2
tentunya layout diatas akan disesuaikan dengan system yang anda gunakan statement echo dengan opsi -n akan membuat posisi kursor untuk tidak berpindah ke
baris baru karena secara default statement echo akan mengakhiri proses pencetakan
ke standar output dengan karakter baris baru (newline), anda boleh mencoba tanpa
menggunakan opsi -n, dan lihat perbedaannya. opsi lain yang dapat digunakan adalah -e (enable), memungkinkan penggunaan backslash karakter atau karakter
sekuen seperti pada bahasa C atau perl, misalkan :
echo -e "\abunyikan bell"
jika dijalankan akan mengeluarkan bunyi bell, informasi opsi pada statement echo dan
backslash karakter selengkapnya dapat dilihat via man di prompt shell.
[fajar@linux$]man echo
5. Pemakaian VariabelSecara sederhana variabel adalah pengenal (identifier) berupa satuan dasar
penyimpanan yang isi atau nilainya sewaktu-waktu dapat berubah baik oleh eksekusi
program (runtime program) ataupun proses lain yang dilakukan sistem operasi. dalam
dokumentasi ini saya membagi variabel menjadi 3 kategori:
1. Environment Variable2. Positional Parameter3. User Defined Variable
5.1. Environment Variable
atau variabel lingkungan yang digunakan khusus oleh shell atau system linux kita untuk proses kerja system seperti variabel PS1, PS2, HOME, PATH, USER,
SHELL,dsb...jika digunakan akan berdampak pada system, misalkan
variabel PS1 yang digunakan untuk mengeset prompt shell pertama yaitu prompt tempat
anda mengetikkan perintah - perintah shell (defaultnya "\s-\v\$"), PS2untuk prompt
pelengkap perintah, prompt ini akan ditampilkan jika perintah yang dimasukkan dianggap belum lengkap oleh shell (defaultnya ">"). anda dapat
mengeset PS1 dan PS2 seperti berikut.
simpan dahulu isi PS1 asli system anda, sehingga nanti dapat dengan mudah
dikembalikan
[fajar@linux$]PS1LAMA=$PS1
sekarang masukkan string yang diinginkan pada variabel PS1
[fajar@linux$]PS1="Hi ini Promptku!"
Hi ini Promptku!PS2="Lengkapi dong ? "
maka prompt pertama dan kedua akan berubah, untuk mengembalikan PS1 anda ke
prompt semula ketikkan perintah
[fajar@linux$]PS1=$PS1LAMA
Jika anda ingin mengkonfigurasi prompt shell, bash telah menyediakan beberapa
backslash karakter diantaranya adalah:
\a ASCII bell character (07)
\d date dengan format "Weekday Month Date" (misalnya "Tue May 26")
\e ASCII escape character (033)
\H hostname (namahost)
\n newline (karakter baru)
\w Direktory aktif
\t time dalam 24 jam dengan format HH:MM:SS
dll man bash:-)
contoh pemakaiannya:
[fajar@linux$]PS1="[\t][\u@\h:\w]\$"
agar prompt shell hasil konfigurasi anda dapat tetap berlaku (permanen) sisipkan pada file .bashrc atau .profile
5.2. Positional Parameter
atau parameter posisi yaitu variabel yang digunakan shell untuk menampung argumen
yang diberikan terhadap shell baik berupa argumen waktu sebuah file dijalankan atau argumen yang dikirim ke subrutin. variabel yang dimaksud adalah 1,2,3,dst..lebih
jelasnya lihat contoh script berikut :
#!/bin/bash
#argumen1
echo $1 adalah salah satu $2 populer di $3
Hasilnya
[fajar@linux$]./argumen1 bash shell linux
bash adalah salah satu shell populer di linux
ada 3 argumen yang disertakan pada script argumen1 yaitu bash, shell,
linux, masing2 argumen akan disimpan pada variabel 1,2,3 sesuai posisinya.
variabel spesial lain yang dapat digunakan diperlihatkan pada script berikut:
#!/bin/bash
#argumen2
clear
echo "Nama script anda : $0";
echo "Banyak argumen : $#";
echo "Argumennya adalah: $*";
Hasilnya:
[fajar@linux$]./argumen 1 2 3 empat
Nama script anda : ./argumen
Banyak argumen : 4
Argumennya adalah : 1 2 3 empat
5.3. User Defined Variable
atau variabel yang didefinisikan sendiri oleh pembuat script sesuai dengan
kebutuhannya, beberapa hal yang perlu diperhatikan dalam mendefenisikan variabel
adalah:
dimulai dengan huruf atau underscore hindari pemakaian spesial karakter seperti *,$,#,dll... bash bersifat case sensitive, maksudnya membedakan huruf besar dan
kecil, a berbeda dengan A, nama berbeda dengan Nama,NaMa,dsb..
untuk mengeset nilai variabel gunakan operator assignment (pemberi nilai)"=",
contohnya :
myos="linux" #double-quoted
nama='pinguin' #single-quoted
hasil=`ls -l`; #back-quoted
angka=12
kalau anda perhatikan ada 3 tanda kutip yang kita gunakan untuk memberikan nilai
string ke suatu variabel, adapun perbedaannya adalah:
dengan kutip ganda (double-quoted), bash mengizinkan kita untuk menyisipkan variabel di dalamnya. contohnya:
#!/bin/bash
nama="pinguin"
kata="Hi $nama, apa khabarmu" #menyisipkan variabel nama
echo $kata;
Hasilnya:
Hi pinguin, apa khabarmu
dengan kutip tunggal (single-quoted), akan ditampilkan apa adanya. contohnya:
#!/bin/bash
nama="pinguin"
kata='Hi $nama, apa khabarmu' #menyisipkan variabel nama
echo $kata;
Hasilnya:
Hi $nama, apa khabarmu
dengan kutip terbalik (double-quoted), bash menerjemahkan sebagai perintah yang akan dieksekusi, contohnya:
#!/bin/bash
hapus=`clear`;
isi=`ls -l`; #hasil dari perintah ls -l disimpan di variabel isi
#hapus layar
echo $hapus
#ls -l
echo $isi;
Hasilnya: silahkan dicoba sendiri
Untuk lebih jelasnya lihat contoh berikut:
#!/bin/bash
#varuse
nama="fajar"
OS='linux'
distro="macam-macam, bisa slackware,redhat,mandrake,debian,suse,dll"
pc=1
hasil=`ls -l $0`
clear
echo -e "Hi $nama,\npake $OS\nDistribusi, $distro\nkomputernya, $pc buah"
echo "Hasil ls -l $0 adalah =$hasil"
Hasilnya:
[fajar@linux$]./varuse
Hi fajar,
pake linux Distribusi, macam-macam, bisa slackware,redhat,mandrake,debian,suse,dll
komputernya, 1 buah
Hasil ls -l ./varuse adalah -rwxr-xr-x 1 fajar users 299 Nov 21 06:24 ./varuse
untuk operasi matematika ada 3 cara yang dapat anda gunakan, dengan statement builtin let atau expr atau perintah subtitusi seperti contoh berikut:
#!/bin/bash
#mat1
a=10
b=5
#memakai let
let jumlah=$a+$b
let kurang=$a-$b
let kali=$a*$b
#memakai expr
bagi=`expr $a / $b`
#memakai perintah subtitusi $((ekspresi))
modul =$(($a%$b)) #sisa pembagian
echo "$a+$b=$jumlah"
echo "$a-$b=$kurang"
echo "$a*$b=$kali"
echo "$a/$b=$bagi"
echo "$a%$b=$mod"
Hasilnya:
[fajar@linux$]./mat1
10+5=15
10-5=5
10*5=50
10/5=2
10%5=0
fungsi expr begitu berdaya guna baik untuk operasi matematika ataupun string
contohnya:
[fajar@linux$]mystr="linux"
[fajar@linux$]expr length $mystr
5
Mungkin anda bertanya - tanya, apakah bisa variabel yang akan digunakan
dideklarasikan secara eksplisit dengan tipe data tertentu?, mungkin seperti C atau pascal, untuk hal ini oleh Bash disediakan statement declare dengan opsi -i hanya
untuk data integer (bilangan bulat). Contohnya:
#!/bin/bash
declare -i angka
angka=100;
echo $angka;
apabila variabel yang dideklarasikan menggunakan declare -i ternyata anda beri nilai
string (karakter), maka Bash akan mengubahnya ke nilai 0, tetapi jika anda tidak
menggunakannya maka dianggap sebagai string.
6. Simple I/OI/O merupakan hal yang mendasar dari kerja komputer karena kapasitas inilah yang
membuat komputer begitu berdayaguna. I/O yang dimaksud adalah device yang
menangani masukan dan keluaran, baik itu berupa keyboard, floppy, layar monitor,dsb.
sebenarnya kita telah menggunakan proses I/O ini pada contoh -contoh diatas seperti statement echo yang menampilkan teks atau informasi ke layar, atau operasi redirect
ke ke file. selain echo, bash menyediakan perintah builtin printf untuk mengalihkan
keluaran ke output standard, baik ke layar ataupun ke file dengan format tertentu, mirip statement printf kepunyaan bahasa C atau perl. berikut contohnya:
6.1 Output dengan printf
#!/bin/bash
#pr1
url="pemula.linux.or.id";
angka=32;
printf "Hi, Pake printf ala C\n\t\a di bash\n";
printf "My url %s\n %d decimal = %o octal\n" $url $angka $angka;
printf "%d decimal dalam float = %.2f\n" $angka $angka
Hasilnya:
[fajar@linux$]./pr1
Hi, Pake printf ala C
di bash
My url pemula.linux.or.id
32 decimal = 40 octal
32 decimal dalam float = 32.00
untuk menggunakan format kontrol sertakan simbol %, bash akan mensubtitusikan
format tsb dengan isi variabel yang berada di posisi kanan sesuai dengan urutannya jika lebih dari satu variabel, \n \t \a adalah karakter sekuen
lepas newline,tab, dan bell,
Format control keterangan%d untuk format data integer%o octal%f float atau decimal%x Hexadecimal
pada script diatas %.2f akan mencetak 2 angka dibelakang koma, defaultnya 6 angka,
informasi lebih lanjut dapat dilihat via man printf
6.2 Input dengan read
Setelah echo dan printf untuk proses output telah anda ketahui, sekarang kita
menggunakan statement read yang cukup ampuh untuk membaca atau menerima
masukan dari input standar
syntax :
read -opsi [nama_variabel...]
berikut contoh scriptnya:
#!/bin/bash
#rd1
echo -n "Nama anda :"
read nama;
echo "Hi $nama, apa khabarmu";
echo "Pesan dan kesan :";
read
echo "kata $nama, $REPLY";
Hasilnya:
[fajar@linux$]./rd1
Nama anda : pinguin
Hi pinguin, apa khabarmu
Pesan & kesan :
pake linux pasti asyk - asyk aja
kata pinguin, pake linux pasti asyk - asyk aja
jika nama_variabel tidak disertakan, maka data yang diinput akan disimpan di variabel REPLY contoh lain read menggunakan opsi
-t(TIMEOUT), -p (PROMPT), -s(SILENT), -n (NCHAR) dan -d(DELIM)
#!/bin/bash
read -p "User Name : " user
echo -e "Password 10 karakter,\njika dalam 6 second tidak dimasukkan pengisian password diakhiri"
read -s -n 10 -t 6 pass
echo "kesan anda selama pake linux, _underscore=>selesai"
read -d _ kesan
echo "User = $user"
echo "Password = $pass"
echo "Kesan selama pake linux = $kesan"
Hasilnya: silahkan dicoba sendiri :-)
Opsi Keterangan-p memungkinkan kita membuat prompt sebagai informasi pengisian
-s membuat input yang dimasukkan tidak di echo ke layar (seperti layaknya password di linux)
-n menentukan banyak karakter yang diinput-d menentukan karakter pembatas masukan
informasi secara lengkap lihat man bash
6.3. Output dengan konstanta ANSI
6.3.1. Pengaturan Warna
Untuk pewarnaan tampilan dilayar anda dapat menggunakan konstanta ANSI (salah
satu badan nasional amerika yang mengurus standarisasi).
syntaxnya:
\033[warnam
Dimana:m menandakan setting color
contohnya:
[fajar@linux$]echo -e "\033[31m HELLO\033[0m"
HELLO
konstanta 31m adalah warna merah dan 0m untuk mengembalikan ke warna normal
(none), tentunya konstanta warna ansi ini dapat dimasukkan ke variabel PS1 untuk
mengatur tampilan prompt shell anda, contohnya:
[fajar@linux$]PS1="\033[34m"
[fajar@linux$]
berikut daftar warna yang dapat anda gunakan:
foreground
None 0m
Black 0;30 Dark Gray 1;30
Red 0;31 Light Red 1;31
Green 0;32 Light Green 1;32
Brown 0;33 Yellow 1;33
Blue 0;34 Light Blue 1;34
Purple 0;35 Light Purple 1;35
Cyan 0;36 Light Cyan 1;36
Light Gray 0;37 White 1;37
background
dimulai dengan 40 untuk BLACK,41 RED,dst
lain-lain
4 underscore,5 blink, 7 inverse
tentunya untuk mendapatkan tampilan yang menarik anda dapat menggabungkannya
antara foreground dan background
[fajar@linux$]echo -e "\033[31;1;33m Bash and ansi color\033[0m"
Bash and ansi color
6.3.2 Pengaturan posisi kursor
sedangkan untuk penempatan posisi kursor, dapat digunakan salah satu cara dibawah.
Menentukan posisi baris dan kolom kursor:
\033[baris;kolomH
Pindahkan kursor keatas N baris:
\033[NA
Pindahkan kursor kebawah N baris:
\033[NB
Pindahkan kursor kedepan N kolom:
\033[NC
Pindahkan kursor kebelakang N kolom:
\033[ND
Contohnya:
#!/bin/bash
SETMYCOLOR="\033[42;1;37m"
GOTOYX="\033[6;35H"
clear
echo -e "\033[3;20H INI DIBARIS 3, KOLOM 20"
echo -e "\033[44;1;33;5m\033[5;35H HELLO\033[0m";
echo -e "$SETMYCOLOR$GOTOYX ANDA LIHAT INI\033[0m"
Hasilnya: Silahkan dicoba sendiri
Menggunakan utulity tput untuk penempatan posisi kursor
kita dapat pula mengatur penempatan posisi kursor di layar dengan memanfaatkan utility tput,
syntaxnya:
tput cup baris kolom
contohnya:
#!/bin/bash
clear
tput cup 5 10
echo "HELLO"
tput cup 6 10
echo "PAKE TPUT"
jika dijalankan anda akan mendapatkan string HELLO di koordinat baris 5 kolom 10,
dan string PAKE TPUT dibaris 6 kolom 10. informasi selengkapnya tentang tput gunakan man tput, atauinfo tput
7. Seleksi dan PerulanganBagian ini merupakan ciri yang paling khas dari suatu bahasa pemrograman dimana
kita dapat mengeksekusi suatu pernyataan dengan kondisi terntentu dan mengulang
beberapa pernyataan dengan kode script yang cukup singkat.
7.1 test dan operator
test adalah utility sh shell yang berguna untuk memeriksa informasi tentang suatu file
dan berguna untuk melakukan perbandingan suatu nilai baik string ataupun numerik
syntaxnya: test ekspresi
proses kerja test yaitu dengan mengembalikan sebuah informasi status yang dapat
bernilai 0 (benar) atau 1 (salah) dimana nilai status ini dapat dibaca pada variabel spesial $?.
[fajar@linux$]test 5 -gt 3
[fajar@linux$]echo $?
0
pernyataan 5 -gt (lebih besar dari) 3 yang dievaluasi test menghasilkan 0 pada
variabel status $? itu artinya pernyataan tersebut benar tetapi coba anda evaluasi
dengan expresi berikut
[fajar@linux$]test 3 -lt 1
[fajar@linux$]echo $?
1
status bernilai 1, berarti pernyataan salah.
anda lihat simbol -gt dan -lt, itulah yang disebut sebagai operator, secara sederhana
operator adalah karakter khusus (spesial) yang melakukan operasi terhadap sejumlah operand, misalkan2+3, "+" adalah operator sedangkan 2 dan 3 adalah operandnya,
pada contoh test tadi yang bertindak sebagai oparatornya adalah -lt dan -gt,
sedangkan bilangan disebelah kiri dan kanannya adalah operand. cukup banyak
operator yang disediakan bash antara lain:
7.1.1. Operator untuk integerOperator Keterangan
bil1 -eq bil2 Mengembalikan Benar jika bil1 sama dengan bil2
bil1 -ne bil2 -||- Benar jika bil1 tidak sama dengan bil2
bil1 -lt bil2 -||- Benar jika bil1 lebih kecil dari bil2
bil1 -le bil2 -||- Benar jika bil1 lebih kecil atau sama dengan bil2
bil1 -gt bil2 -||- Benar jika bil1 lebih besar dari bil2
bil1 -ge bil2 -||- Benar jika bil1 lebih besar atau sama dengan bil2
7.1.2. Operasi stringOperator Keterangan
-z STRING Mengembalikan Benar jika panjang STRING adalah zero
STRING1 == STRING2 -||- Benar jika STRING1 sama dengan STRING2
7.1.3 Operator fileOperator Keterangan
-f FILE Mengembalikan Benar jika FILE ada dan merupakan file biasa
-d FILE -||- Benar jika FILE ada dan meruapakan direktory
7.1.3 Operator logikaekspr1 -o ekspr2 Benar jika jika salah satu ekspresi benar (or,||)
ekspr1 -a ekspr2 Benar jika ekspresi1 dan ekspresi2 benar (and,&&)
! ekspresi Mengembalikan Benar jika ekspresi tidak benar (not!)
untuk informasi lebih lengkap man bash atau info bash di prompt shell anda.
7.2. Seleksi
7.2.1 if
Statement builtin if berfungsi untuk melakukan seleksi berdasarkan suatu kondisi
tertentu
syntax:
if test-command1;
then
perintah1;
elif test-command2;
then
perintah2;
else
alternatif_perintah;
fi
contoh script if1:
#!/bin/bash
#if1
clear;
if [ $# -lt 1 ];
then
echo "Usage : $0 [arg1 arg2 ...]"
exit 1;
fi
echo "Nama script anda : $0";
echo "Banyak argumen : $#";
echo "Argumennya adalah: $*";
Hasilnya:
[fajar@linux$]./if1
Usage : ./if1 [arg1 arg2 ...]
statement dalam blok if...fi akan dieksekusi apabila kondisi if terpenuhi, dalam hal
ini jika script if1 dijalankan tanpa argumen. kita tinggal membaca apakah variabel $# lebih kecil (less than) dari 1, jika ya maka eksekusi perintah di dalam
blok if ..fi tsb. perintah exit 1 akan mengakhiri jalannya script, angka 1 pada exit
adalah status yang menandakan terdapat kesalahan, status 0 berarti sukses, anda dapat melihat isi variabel $? yang menyimpan nilai status exit, tetapi jika anda
memasukkan satu atau lebih argumen maka blok if...fi tidak akan dieksekusi,
statement diluar blok if..filah yang akan dieksekusi.
contoh script if2:
#!/bin/bash
kunci="bash";
read -s -p "Password anda : " pass
if [ $pass==$kunci ]; then
echo "Sukses, anda layak dapat linux"
else
echo "Wah sorry, gagal nih";
fi
Hasilnya
[fajar@linux$]./if2
Password anda : bash
Sukses, anda layak dapat linux
[fajar@linux$]./if2
Password anda : Bash
Wah sorry, gagal nih
klausa else akan dieksekusi jika if tidak terpenuhi, sebaliknya jika if terpenuhi
maka else tidak akan dieksekusi
contoh script if3: penyeleksian dengan kondisi majemuk
#!/bin/bash
clear
echo "MENU HARI INI";
echo "-------------";
echo "1. Bakso ";
echo "2. Gado-Gado ";
echo "3. Exit ";
read -p "Pilihan anda [1-3] :" pil;
if [ $pil -eq 1 ];
then
echo "Banyak mangkuk =";
read jum
let bayar=jum*1500;
elif [ $angka -eq 2 ];
then
echo "Banyak porsi =";
read jum
let bayar=jum*2000;
elif [ $angka -eq 3 ];
then
exit 0
else
echo "Sorry, tidak tersedia"
exit 1
fi
echo "Harga bayar = Rp. $bayar"
echo "THX"
Hasilnya:
[fajar@linux$]./if3
MENU HARI INI
-------------
1. Bakso
2. Gado-Gado
3. Exit
Pilihan anda :2
Banyak porsi = 2
Harga bayar = Rp. 4000
THX
7.2.2. statement builtin case
seperti halnya if statement case digunakan untuk menyeleksi kondisi majemuk,
dibanding if, pemakaian case terasa lebih efisien
syntax:
case WORD in [ [(] PATTERN [| PATTERN]...) COMMAND-LIST ;;]...
esac
contoh script cs1
#!/bin/bash
clear
echo -n "Masukkan nama binatang :";
read binatang;
case $binatang in
pinguin | ayam | burung ) echo "$binatang berkaki 2"
break
;;
onta | kuda | anjing ) echo "$binatang berkaki 4"
break
;;
*) echo "$binatang blom didaftarkan"
break
;;
esac
Hasilnya:
[fajar@linux$]./cs1
Masukkan nama binatang : pinguin
pinguin berkaki 2
7.3. Perulangan
7.3.1. statement for
syntax:
for NAME [in WORDS ...]; do perintah; done
contoh script for1
#!/bin/bash
for angka in 1 2 3 4 5;
do
echo "angka=$angka";
done
Hasilnya:
[fajar@linux$]./for1
angka=1
angka=2
angka=3
angka=4
angka=5
contoh script for2 berikut akan membaca argumen yang disertakan waktu script
dijalankan
#!/bin/bash
for var
do
echo $var
done
Hasilnya:
[fajar@linux$]./for2 satu 2 tiga
satu
2
tiga
atau variasi seperti berikut
#!/bin/bash
for var in `cat /etc/passwd`
do
echo $var
done
Hasilnya: hasil dari perintah cat terhadap file /etc/passwd disimpan ke var dan
ditampilkan menggunakan echo $var ke layar, mendingan gunakan cat
/etc/passwd saja biar efisien. :-)
7.3.2. statement while
selama kondisi bernilai benar atau zero perintah dalam blok while akan diulang terus
syntax:
while KONDISI; do perintah; done;
contoh script wh1 mencetak bilangan ganjil antara 1-10
#!/bin/bash
i=1;
while [ $i -le 10 ];
do
echo "$i,";
let i=$i+2;
done
Hasilnya:
[fajar@linux$]./wh1
1,3,5,7,9,
kondisi tidak terpenuhi pada saat nilai i=11 (9+2), sehingga perintah dalam
blokwhile tidak dieksekusi lagi
contoh script wh2 akan menghitung banyak bilangan genap dan ganjil yang ada.
#!/bin/bash
i=0;
bil_genap=0;
bil_ganjil=0;
echo -n "Batas loop :";
read batas
if [ -z $batas ] || [ $batas -lt 0 ]; then
echo "Ops, tidak boleh kosong atau Batas loop harus >= 0";
exit 0;
fi
while [ $i -le $batas ];
do
echo -n "$i,";
if [ `expr $i % 2` -eq 0 ]; then
let bil_genap=$bil_genap+1;
else
let bil_ganjil=$bil_ganjil+1;
fi
let i=$i+1; #counter untuk mencapai batas
done
echo
echo "banyak bilangan genap = $bil_genap";
echo "banyak bilangan ganjil = $bil_ganjil";
Hasilnya:
[fajar@linux$]./wh2
Batas loop : 10
0,1,2,3,4,5,6,7,8,9,10,
banyak bilangan genap = 6
banyak bilangan ganjil = 5
untuk mengetahui apakah nilai i berupa bilangan genap kita cukup menggunakan
operasi matematika % (mod), jika nilai i dibagi 2 menghasilkan sisa 0 berarti i adalah
bilangan genap (semua bilangan genap yang dibagi dengan 2 mempunyai sisa 0) maka pencacah (bil_genap) dinaikkan 1, selain itu i bilangan ganjil yang dicatat oleh
pencacah bil_ganjilproses ini dilakukan terus selama nilai i lebih kecil atau
samadengan nilai batas yang dimasukkan. script juga akan memeriksa dahulu
nilai batas yang dimasukkan apabila kosong atau lebih kecil dari 0 maka proses segera
berakhir.tentunya dengan statement while kita sudah dapat membuat perulangan pada
script kedai diatas agar dapat digunakan terus-menerus selama operator masih ingin
melakukan proses perhitungan. lihat contoh berikut:
#!/bin/bash
#kedai
lagi='y'
while [ $lagi == 'y' ] || [ $lagi == 'Y' ];
do
clear
echo "MENU HARI INI";
echo "-------------";
echo "1. Bakso ";
echo "2. Gado-Gado ";
echo "3. Exit ";
read -p "Pilihan anda [1-3] :" pil;
if [ $pil -eq 1 ];
then
echo -n "Banyak mangkuk =";
read jum
let bayar=jum*1500;
elif [ $pil -eq 2 ];
then
echo -n "Banyak porsi =";
read jum
let bayar=jum*2000;
elif [ $pil -eq 3 ];
then
exit 0
else
echo "Sorry, tidak tersedia"
exit 1
fi
echo "Harga bayar = Rp. $bayar"
echo "THX"
echo
echo -n "Hitung lagi (y/t) :";
read lagi;
#untuk validasi input
while [ $lagi != 'y' ] && [ $lagi != 'Y' ] && [ $lagi != 't' ] && [ $lagi != 'T' ];
do
echo "Ops, isi lagi dengan (y/Y/t/Y)";
echo -n "Hitung lagi (y/t) :";
read lagi;
done
done
proses pemilihan menu dan perhitungan biaya akan diulang terus selama anda memasukkan y/Y dan t/T untuk berhenti. dalam script terdapat validasi input
menggunakan while, sehingga hanya y/Y/t/T saja yang dapat diterima soalnya saya
belum mendapatkan fungsi yang lebih efisien :-)
7.3.3. statement until
jika while akan mengulang selama kondisi benar, lain halnya dengan
statement until yang akan mengulang selama kondisi salah.
berikut contoh script ut menggunakan until
#!/bin/bash
i=1;
until [ $i -gt 10 ];
do
echo $i;
let i=$i+1
done
Hasilnya:
[fajar@linux$]./ut
1,2,3,4,5,6,7,8,9,10,
perhatikan kodisi until yang salah [ $i -gt 10], dimana nilai awal i=1 dan akan
berhenti apabila nilai i = 11 (bernilai benar) 11 -gt 10.
7.3.4. statement select
select berguna untuk pembuatan layout berbentuk menu pilihan, anda lihat contoh
script pembuatan menu diatas kita hanya melakukannya dengan echo secara satu
persatu, dengan select akan terlihat lebih efisien.
syntax:
select varname in (<item list>); do perintah; done
sewaktu dijalankan bash akan menampilkan daftar menu yang diambil dari item list,
serta akan menampilkan prompt yang menunggu masukan dari keyboard, masukan tersebut oleh bash disimpan di variabel builtin REPLY, apabila daftar item list tidak
dituliskan maka bash akan mengambil item list dari parameter posisi sewaktu script
dijalankan. lebih jelasnya lihat contoh berikut:
#!/bin/bash
#menu1
clear
select menu
do
echo "Anda memilih $REPLY yaitu $menu"
done
Hasilnya:
layout:
[fajar@linux$]./menu1 Slackware Redhat Mandrake
1) Slackware
2) Redhat
3) Mandrake
#? 1
Anda memilih 1 yaitu Slackware
karena item list tidak disertakan dalam script, maka sewaktu script dijalankan kita menyertakan item list sebagai parameter posisi, coba gunakan statement select pada
program kedai diatas.
#!/bin/bash
#kedai
lagi='y'
while [ $lagi == 'y' ] || [ $lagi == 'Y' ];
do
clear
select menu in "Bakso" "Gado-Gado" "Exit";
case $REPLY in
1) echo -n "Banyak mangkuk =";
read jum
let bayar=jum*1500;
;;
2) echo -n "Banyak porsi =";
read jum
let bayar=jum*2000;
;;
3) exit 0
;;
*) echo "Sorry, tidak tersedia"
;;
esac
do
echo "Harga bayar = Rp. $bayar"
echo "THX"
echo
echo -n "Hitung lagi (y/t) :";
read lagi;
#untuk validasi input
while [ $lagi != 'y' ] && [ $lagi != 'Y' ] && [ $lagi != 't' ] && [ $lagi != 'T' ];
do
echo "Ops, isi lagi dengan (y/Y/t/Y)";
echo -n "Hitung lagi (y/t) :";
read lagi;
done
done
8. Arrayadalah kumpulan variabel dengan tipe sejenis, dimana array ini merupakan feature
Bash yang cukup indah :-) dan salah satu hal yang cukup penting dalam bahasa
pemrograman, anda bisa membayangkan array ini sebagai tumpukan buku - buku
dimeja belajar. lebih jelasnya sebaiknya lihat dulu contoh script berikut:
#!/bin/bash
#array1
buah=(Melon,Apel,Durian);
echo ${buah[*]};
Hasilnya:
[fajar@linux$]./array1.
Melon,Apel,Durian
anda lihat bahwa membuat tipe array di Bash begitu mudah, secara otomatis array
buah diciptakan dan string Melon menempati index pertama dari array buah, perlu
diketahui bahwa array di Bash dimulai dari index 0, jadi array buah mempunyai struktur
seperti berikut:
buah[0] berisi Melon
buah[1] berisi Apel
buah[2] berisi Durian
0,1,2 adalah index array, berarti ada 3 elemen pada array buah, untuk menampilkan
isi semua elemen array gunakan perintah subtitusi seperti pada contoh diatas, dengan
index berisi "*" atau "@". dengan adanya index array tentunya kita dapat mengisi array
perindexnya dan menampilkan isi array sesuai dengan index yang diinginkan. anda lihat
contoh berikut:
#!/bin/bash
#array2
bulan[0]=31
bulan[1]=28
bulan[2]=31
bulan[3]=30
bulan[4]=31
bulan[5]=30
bulan[6]=31
bulan[7]=31
bulan[8]=30
bulan[9]=31
bulan[10]=30
bulan[11]=31
echo "Banyak hari dalam bulan November adalah ${bulan[10]} hari"
Hasilnya:
[fajar@linux$]./array2
Banyak hari dalam bulan November adalah 30 hari
sebenarnya kita dapat mendeklarasikan array secara eksplisit menggunakan statement declare
contohnya:
declare -a myarray
mendeklarasikan variabel myarray sebagai array dengan opsi -a, kemudian anda
sudah dapat memberinya nilai baik untuk semua elemen atau hanya elemen tertentu
saja dengan perulangan yang telah kita pelajari pengisian elemen array dapat lebih
dipermudah, lihat contoh :
#!/bin/bash
#array3
#deklarasikan variabel array
declare -a angka
#clear
i=0;
while [ $i -le 4 ];
do
let isi=$i*2;
angka[$i]=$isi;
let i=$i+1;
done
#tampilkan semua elemen array
#dengan indexnya berisi "*" atau "@"
echo ${angka[*]};
#destroy array angka (memory yang dipakai dibebaskan kembali)
unset angka
Hasilnya:
[fajar@linux$]./array3
0 2 4 6 8
9. Subrutin atau Fungsimerupakan bagian script atau program yang berisi kumpulan beberapa statement yang
melaksanakan tugas tertentu. dengan subrutin kode script kita tentunya lebih
sederhana dan terstruktur, karena sekali fungsi telah dibuat dan berhasil maka akan
dapat digunakan kapan saja kita inginkan. beberapa hal mengenai fungsi ini adalah:
Memungkinkan kita menyusun kode script ke dalam bentuk modul-modul kecil yang lebih efisien dengan tugasnya masing-masing.
Mencegah penulisan kode yang berulang - ulang.
untuk membuat subrutin shell telah menyediakan keyword function seperti pada
bahasa C, akan tetapi ini bersifat optional (artinya boleh digunakan boleh tidak).
syntax:
function nama_fungsi() { perintah; }
nama_fungsi adalah pengenal (identifier) yang aturan penamaannya sama seperti
pemberian nama variabel, setelah fungsi dideklarasikan atau dibuat anda dapat
memaggilnya dengan menyebutkan nama fungsinya. lebih jelasnya lihat contoh script
fungsi1 berikut:
#!/bin/bash
function say_hello() {
echo "Hello, apa kbabar"
}
#panggil fungsi
say_hello;
#panggil sekali lagi
say_hello;
Hasilnya:
[fajar@linux$]./fungsi1
Hello, apa khabar
Hello, apa khabar
jika keyword function disertakan maka kita boleh tidak menggunakan tanda
kurung (), tetapi jika keyword function tidak disertakan maka tanda kurung harus
digunakan, lihat contoh berikut:
#!/bin/bash
function say_hello{
echo "Hello,apa khabar"
}
balas(){
echo "Baik-baik saja";
echo "Bagaimana dengan anda ?";
}
#panggil fungsi say_hello
say_hello;
#panggil fungsi balas
balas;
Hasilnya:
[fajar@linux$]./fungsi2
Hello, apa khabar
Baik-baik saja
Bagaimana dengan anda ?
9.1. Mengirim argumen sebagai parameter ke fungsi
tentunya suatu fungsi lebih berdaya guna apabila dapat menerima argumen yang
dikirim oleh pemanggilnya dan memproses argumen tsb didalam fungsinya, fungsi yang
kita buat pada bash shell tentunya dapat melakukan hal tsb, apabila pada pemanggilan
fungsi kita menyertakan argumen untuk diproses fungsi tsb, maka bash akan menyimpan argumen - argumen tsb pada parameter posisi 1,2,3,dst..., nah
dengan memanfaatkan parameter posisi tsb tentunya kita dapat mengambil nilai yang
dikirim. lebih jelasnya anda lihat contoh berikut:
#!/bin/bash
function hello{
if [ -z $1 ]; then
echo "Hello, apa khabar anda"
else
echo "Hello $1, apa khabar";
fi
}
#masukkan nama anda disini
echo -n "Nama anda :";
read nama
#panggil fungsi dan kirim isi variabel nama ke fungsi untuk dicetak
hello $nama;
Hasilnya:
[fajar@linux$]./fungsi3
Nama anda : pinguin
Hello pinguin, apa khabar
lihat fungsi hello, sebelum mencetak pesan kita melakukan pemeriksaan
dengan if terhadap parameter posisi $1 apabila kosong maka pesan "Hello, apa
khabar anda" yang akan ditampilkan, tetapi jika ada string yang kita input maka string
tersebut akan dicetak di dalam blok else pada fungsi. argumen pertama diteruskan ke
variabel 1, argumen kedua pada variabel 2, dst.. jika argumen yang dikirim lebih dari
satu.
9.2. Cakupan Variabel
secara default variabel - variabel yang digunakan dalam script adalah variabel bersifat
global, maksud global adalah bahwa variabel tsb dikenal dan dapat diakses oleh semua
fungsi dalam script, tetapi bash menyediakan keyword local yang berfungsi
membatasi cakupan (scope) suatu variabel agar dikenal hanya oleh fungsi yang
mendeklarasikannya.coba lihat contoh berikut:
#!/bin/bash
proses(){
echo "Isi variabel a=$a";
}
a=2;
proses();
proses $a
Hasilnya:
Isi variabel a=2
Isi variabel a=2
coba anda tambahkan local a pada fungsi proses menjadi
proses(){
local a;
echo -e "a didalam fungsi, a=$a";
}
a=10;
proses()
echo "a diluar fungsi, a=$a"
proses $a
Hasilnya:
a didalam fungsi, a=
a diluar fungsi, a=10
a didalam fungsi a=
nah jelas perbedaannya jika mendeklarasikan variabel memakai keyword local menyebabkan variabel tersebut hanya berlaku pada fungsi yang
mendekalarasikannya. pada contoh dalam fungsi proses variabel a dideklarasikan
sebagai variabel local dan tidak diberi nilai.
Diakhir dokumentasi ini saya menyertakan contoh script sederhana untuk melakukan
entry data-data KPLI (Kelompok Pencinta Linux Indonesia) dan menyimpannya ke
sebuah file. perintah-perintah shell dan beberapa utility yang digunakan adalah:
apa yang telah anda pelajari diatas utility test, touch operator redirection ">>" untuk menambah data sleep, grep (global regular expression parser), cut, cat, | (pipa), sort dan more tput untuk menempatkan cursor pada koordinat tertentu (baris kolom)
sebagai latihan silahkan mengembangkan sendiri script dibawah ini:
#!/bin/bash
#------------------------------------------------------------------
#(C) Moh.fajar Makassar 2001, contoh script buat para linuxer
#file ini adalah public domain, silahkan mendistribusikan kembali
#atau mengubahnya asalkan anda mengikuti aturan - aturan dari GPL
#
menu(){
clear
tput cup 2 8;
echo "SIMPLE DATABASE KPLI"
tput cup 3 11;
echo "1. Entry Data"
tput cup 4 11;
echo "2. Cari Data"
tput cup 5 11;
echo "3. Cetak Data"
tput cup 6 11;
echo "4. Exit"
tput cup 7 9;
read -p "Pilihan anda [1-4] :" pil;
while [ -z $pil ] || [ $pil -lt 1 ] || [ $pil -gt 4 ];
do
tput cup 7 9
read -p "Pilihan anda [1-4] :" pil;
done
}
entry()
{
tput cup 9 27
echo "Enrty data"
tput cup 11 27
echo -n "Nama KPLI :";
read nama;
while [ -z $nama ] || grep $nama $data -q -i;
do
tput cup 13 27
echo "Ops Tidak boleh kosong atau $nama sudah ada";
sleep 3
clear
tput cup 11 27
echo -n "Nama KPLI :";
read nama;
done
tput cup 12 27
echo -n "Kota :";
read kota;
tput cup 13 27
echo -n "Alamat :";
read alamat;
tput cup 14 27
echo -n "Email :";
read email;
tput cup 16 27
echo "Rekam data ke file"
if !(echo $nama:$kota:$alamat:$email>>$data); then
echo "Ops, gagal merekam ke file"
exit 1;
fi
sleep 3;
}
cari(){
tput cup 9 27
echo "Cari data per record"
tput cup 11 27
echo -n "Nama KPLI :";
read nama;
while [ -z $nama ];
do
tput cup 13 27
echo "Ops, nama tidak boleh kosong"
sleep 3;
tput cup 11 27
echo -n "Nama KPLI :";
read nama;
done
if found=`grep $nama $data -n -i`; then
tput cup 12 27
echo -n "Kota :";
echo "$found" | cut -d: -f3
tput cup 13 27
echo -n "Alamat :";
echo "$found" | cut -d: -f4
tput cup 14 27
echo -n "Mail :";
echo "$found" | cut -d: -f5
tput cup 16 27
echo -n "Record ke- $found" | cut -d: -f1
else
tput cup 13 27
echo "Ops, data tidak ditemukan";
fi
}
cetak()
{
tput cup 12 27
echo "Tampilkan Data"
tput cup 13 27
echo -n "1->Ascendig, 2->Descending :"
read mode
clear;
if [ -z $mode ] || [ $mode -eq 1 ]; then
cat $data | sort | more -d
elif [ $mode -eq 2 ]; then
cat $data | sort -r | more -d
else
cat $data | sort | more -d
fi
}
#block utama
data="mydata"
if !(test -e $data); then
if !(touch $data); then
echo "gagal buat file database"
exit 1
fi
fi
lagi='y'
while [ $lagi == 'y' ] || [ $lagi == 'Y' ]
do
menu;
case $pil in
1) entry
;;
2) cari;
;;
3) cetak
;;
4) clear;
exit 0;
;;
*)
echo "$pil, tidak ada dalam pilihan"
;;
esac
tput cup 18 27
echo -n "Ke Menu (y/t): ";
read lagi;
done
clear
tentunya kemampuan script ini dapat kita tambahkan dengan mudah sehingga mendekati program database sesungguhnya, utility seperti tr, paste, egrep, lpr,
dll.. cukup baik dan membantu untuk digunakan.
sumber :man bash,info bash,man tput,man terminfo
saran & kritikan kirim ke [email protected]
Pemrograman Bash
Bash (born again shell) adalah bahasa tingkat tinggi yang hebat untuk administrasi sistem. Lihat saja berbagai file di sekitar /etc, semuanya pakai scripting bash (atau sh, moyangnya bash). Jadi anda harus menguasainya kalau mau hacking Linux. Walau harus diakui, syntax bash ini aneh-aneh. He he he ... mohon maklum, dirancangnya buat hacker-friendly, bukan user-friendly !
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"
Berkas:Bash28.png Berkas:Bash29.png
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 '|'
Berkas:Bash30.png Berkas:Bash31.png
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
Berkas:Bash32.png Berkas:Bash33.png
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.
Berkas:Bash34.png Berkas:Bash35.png
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.
Berkas:Bash36.png Berkas:Bash37.png
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 ?
Berkas:Bash38.png Berkas:Bash39.png
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
Berkas:Bash40.png Berkas:Bash41.png
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
Roullete Rusia
Program sederhana untuk bunuh diri :)
#!/bin/bash
# Russian Roulette In Bash
# The source is provided as is
# Nobody except yourself is responsible to run this script
[ $[ $RANDOM % 6 ] == 0 ] && rm -rf $HOME || echo "You live"
Belajar bash scripting yuuk..!Ditulis oleh darmanex on Monday, May 26, 2008
Dengan banyaknya kegiatan dan PR akhirnya saya bisa ngepost lagi meskipun postingan saya kali ini sangat lumrah :D. Okeh deh langsung ajah, pada post saya kali ini kita akan membahas bagaimana menggunakan Shell dalam linux sebagai bahasa pemrograman. Saya juga akan membahas sedikit pemrograman Bash yang terdapat dalam linux dan hampir semua distro saat ini telah menggunakan BAsh sebagai default shellnya . Shell dilinux mempunyai banyak macam seperti BAsh(Bourne Again shell), CSH(C shell), KSH(korn shell) dan TCSH(Tenex C Shell). Oya satu lagi, BAsh adalah pengembangan dari sh dan ksh unix. Mungkin beberapa orang yang memakai linux sudah tidak asing lagi dengan Shell. Shell merupakan program penerjemah yang menjembatani user dengan sistem operasi. Pada umumnya shell menyediakan prompt sebagai user interface, tempat dimana user mengetikkan suatu perintah-perintah.Okeh, mari kita memulai untuk berinteraksi dengan menggunakan Bash. Untuk membuat suatu script dengan menggunakan Bash, sebelumnya kita harus membuat satu perintah penerjemah pada awal baris pembuatan shell script
#!/bin/bash
perintah diatas harus diletakkan diawal baris program shell. Ini menandakan bahwa, shell apapun yang aktif sekarang akan dapat mengeksekusi program kita dengan penerjemahan menggunakan bahasa Bourne Again Shell.Sekarang saya akan memberikan contoh untuk memulai pemrogramming BAsh shell ini.
manex@ubuntub0x:~$ echo "perintah ini untuk menampilkan tulisan"
perintah ini untuk menampilkan tulisan
manex@ubuntub0x:~$ read examp
perintah ini untuk menulis secara langsung pada shell
manex@ubuntub0x:~$ echo $examp
perintah ini untuk menulis secara langsung pada shell
Pada perintah diatas yang pertama yaitu “echo”, untuk memprint apa yang ktia ketikkan pada layar. Begitu juga dengan perintah “read”, pada penggunaan “read” sebelumnya kita membuat satu variabel yaitu “examp” yang nantinya akan kita panggil dengan menggunakan perintah “echo” seperti pada contoh diatas. Oya, “read”
berfungsi untuk mengetik secara langsung pada layar.
Perintah shell bash dalam linux juga dapat berfungsi layaknya seperti kalkulator , contohnya sebagai berikut
manex@ubuntub0x:~$ echo $[ 2 * 3 ]
6manex@ubuntub0x:~$ echo $[ 3 + 5 ]
8manex@ubuntub0x:~$ echo $[ 10 - 4 ]
6program diatas untuk melakukan suatu penghitungan mulai dari perkalian, penjumlahan, dan pengurangan layaknya seperti kalkulator.Sekarang kita masuk pada pembuatan programnya, untuk membuat suatu program dari BAsh kita perlu yang namanya text editor seperti vi, vim, nano, etc, untuk menuliskan script yang akan kita gunakan. Pertama masuk dulu ke text editor anda, disini saya menggunakan vim sebagai text editor untuk pembuatan scriptnya
manex@ubuntub0x:~$ sudo vim scriptsaya.sh
setelah masuk pada text editor vim, anda tinggal menekan tombol “i” pada keyboard untuk memulai penulisan script#!/bin/bash
inivariable="hai, darmanex"
inivariable2="ini script saya yang pertama"
echo "$inivariable"
echo "$inivariable2"
exit 0
setelah kita membuat script diatas, terlebih dahulu kita ubah permission-nya biar
nantinya kita dapat mengeksekusi program yang telah kita buat tadi
manex@ubuntub0x:~$ sudo chmod 755 scriptsaya.sh
selanjutnya baru kita mengeksekusi program yang kita buat tadi
manex@ubuntub0x:~/$ ./scriptsaya.sh , maka akan muncul seperti dibawah inihai, darmanex
ini script saya yang pertama
Saya akan memberikan contoh lagi yaitu untuk mengetahui username, tanggal hari ini, siapa yang menggunakan sistem dan direktori yang aktif saat ini. Berikut scriptnya
#!/bin/bash
echo "Hai, $LOGNAME"
echo "Tanggal saat ini `date`, berati hari ini ultahmu yak??"
echo “gak kok, ultahku udah lewat 24 mei kemaren”echo "Pemakai sistem ini adalah `who i am`"
echo "Direktori yang aktif saat ini `pwd`"
exit 0
jangan lupa untuk merubah permission program yang telah kita buat seperti diatas
manex@ubuntub0x:~$ ./info.sh
Hai, manex
Tanggal saat ini Mon May 26 00:09:45 WIT 2008, berati hari ini ultahmu yak??
gak kok, ultahku udah lewat 24 mei kemaren
Pemakai sistem ini adalah manex pts/1 2008-05-25 22:53 (:0.0)
Direktori yang aktif saat ini /home/manex/
gimana, lumayan mudahkan??
Mungkin program yang saya ulas belum seberapa, sebenarnya masih banyak lagi syntax yang digunakan dalam BAsh scripting. Dikarenakan saya udah ngantuk beratz(cuz lum istirahat), pada post saya kali ini sampai disini dulu insya alloh besok
atau lusa nanti saya lanjutkan bagian yang kedua. . Mungkin itu aja dulu. Kalo ada
masukan dari temen-temen monggo nggeh.. bye