Introduction to Programming in Linux Bash Shell 2016

Notice: You cant use translate because many language in inside

1. Introduction

What the shell? shell is a program (command interpreter) that bridge the user with the operating system in this case the kernel (core operating system), generally a shell providing prompt as a user interface, where users type commands desirable either internal command shell (internal command), or order the execution of a program file (external command), in addition to the shell lets the user draw up a set of commands on one or more files to be executed as a program.

Kind of - kind of shell

Unlike other operating system that provides only one or two shell, the operating system of family unix eg linux until now complemented by many shell with a set of commands that very much, allowing the user choose the shell where the most good to help finish the job, or can also moved from one shell to another shell easily, some shell in linux, among others:


  • Bourne shell(sh),
  • C shell(csh),
  • Korn shell(ksh),
  • Bourne again shell(bash),
  • dsb.
Each - each shell has advantages and disadvantages that may be based more on the needs of users are increasingly rising to this documentation default shell is bash shell of the GNU, which is the development of the Bourne shell and take out some of the features (feature) from the C shell and Korn shell, bash shell is a shell that is widely used linux users because of its ease and the many facilities that disediakan.versi bash shell commands that I use is 2:04
[fajar@linux$]echo $BASH_VERSION
bash 2.04.12(1)-release
Maybe when you read the documentation, the latest version of bash has been released with the addition of another feature.

2. Shell Programming?

Ie draw or group several shell commands (internal or external command) into a set of commands that perform a specific task in accordance constituent goals. Excess shell in Linux compared to other operating systems is that the shell in Linux allows us to draw up a series of commands as well as the programming language (language interpreter), the process I / O, select conditions, looping, generating functions, and so on. is a process - a process that is generally performed by a programming language, so the shell in linux we can make the program as well as the programming language for programming user shell unix or linux shell script call.

3. Basic Needs

Before learning Bash shell programming in linux you should already know and use the command - basic command shell either internally predefined command shell or external command or utility, such as
  • cd, pwd, times, alias, umask, exit, logout, fg, bg, ls, mkdir, rmdir, mv, cp, rm, clear, ...
  • utilities such as paint, cut, paste, chmod, lpr, ...
  • redirection (how to send the output to a file or receive input from a file), use the redirect operator>, >>, <, <<, for example:
  • ls> Data
  • ls the results are sent to a data file, if the file is not there to be made but if the existing contents will be overwritten.
  • ls >> Data
  • almost the same, except that if the file already exists then it will be added at the end of the file.
  • paint <data
  • the data file used as input by the cat command
  • pipes (output of one command into another command input), the operator: | , example:
  • ls -l | sort -s
  • ouput command ls -l (long) into a sort command input -s (sort in descending order), use ls -l -r mending course :-)
  • ls -l | sort -s | more
  • cat <data | sort> databaru
  • Wildcard character *,?, [], For example:
  • ls i *
  • show all files that start with i
  • ls i? i
  • show files that begin with i, then any single character, and ending with i
  • show files that begin with one of the characters a or b

4. Simple Bash Script

The initial step should first check your active shell, use the command ps (process status report)
[fajar@linux$]ps
 PID TTY          TIME CMD
  219 tty1     00:00:00 bash
  301 tty1     00:00:00 ps
bash is an active shell on my system, if your system is different for example csh or ksh change with the command change shell
[fajar@linux$]chsh
Password:
New shell [/bin/csh]:/bin/bash
Shell changed
or by typing bash
[fajar@linux$]bash
now you try to type the following command at prompt shell
echo "Script shell pertamaku di linux"
[fajar@linux$]echo "Script shell pertamaku di linux"
Script shell pertamaku di linux
string enclosed in double quotes (double quoted) will be displayed on your screen, echo is a statement (command) built-in bash function displays the information to standard output is the default display. if desired repeating the process, you would type back the command, but the facility is history simply use the arrow keys we've been able to repeat the command, what if a collection of commands that quite a lot, of course, with facilities hirtory we will hassles also repeated the desired command moreover if the lapse of time may be the commands already affected by other commands because history has a storage capacity is determined. for why should the commands they will be saved to a file that we can call anytime they want.
try to follow the steps - these steps:
  1. Log into your editor, whether wearing vi, pico, emacs, etc ...
  2. type the following command
  3. #! / bin / bash
  4. echo "Hello, what khabar"
  5. save it as a test file
  6. change file permissions using the chmod test
  7. [dawn @ linux $] chmod 755 test
  8. run
  9. [dawn @ linux $] ./ test
whenever you want to execute the live call text file, if desired set your working directory that is listed in the search path type the following command
PATH=$PATH:.
after that the above script can be run in a way
[fajar@linux$]tes
Hello, apa khabar
sign #! / bin / bash in the test script is a command that is translated into the kernel to execute a path that is included in this case bash program in the directory / bin, actually without including the line you will be able to execute a bash script, with a record of bash is the active shell. or by typing bash at the shell prompt.
[fajar@linux$]bash tes
of course, this method is less efficient, include the path bash program at the beginning of the script and then change the permissions on the file so that you can execusi is the most efficient way.
Now let us make a shell script that displays the following information:
  1. time system
  2. Info about you
  3. the number of users that are logged in the system
example script:
#!/bin/bash
#myinfo

#clean the screen display
clear           

#display information
echo -n "time system   :"; date
echo -n "You           :"; whoami
echo -n "many users :"; who | wc -l

before the run do not forget to change the file permissions on myinformation so it can be executed by you
[fajar@linux$]chmod 755 myinfo
[fajar@linux$]./myinfo
Waktu system   : Sat Nov 25  22:57:15 BORT 2001
You           : fajar
Many user : 2
over the course layout will be adjusted to the system you are using echo statement with the -n option will make the position of the cursor not to move to a new line by default because the echo statement will end the process of printing to standard output with a newline character (newline), you can try without use the -n option, and see the difference. Another option that can be used is -e (enable), allowing the use of the backslash character or character sequence as in C or Perl, for example:
echo -e "\abunyikan bell"
if executed will issue a bell sounds, the information on the statement echo option and backslash character can be seen via the man at the shell prompt.
[fajar@linux$]man echo

5. Use Variables

In a simple variable is the identifier (identifier) form the basic unit of storage contents or the value can be changed at any time either by the program execution (runtime program) or other process performed operating system. in this documentation I divided the variables into three categories:
  1. Environment Variable
  2. Positional Parameter
  3. User Defined Variable

5.1. Environment Variable

or environment variables used exclusively by our linux system shell or to the working process systems such as variable PS1, PS2, HOME, PATH, USER, SHELL, etc ... if used will have an impact on the system, eg PS1 variables used to set the shell prompt the first is where you type in a command prompt - command shell (default "\ s- \ v \ $"), PS2 to complement the command prompt, this prompt is displayed if the command is entered deemed incomplete by the shell (the default ">"). You can set the PS1 danPS2 as follows.
first save the contents of the original PS1 your system, so it can be easily restored later
[fajar@linux$]PS1LAMA=$PS1
Now enter the desired string in the variable PS1
[fajar@linux$]PS1="Hi ini Promptku!"
Hi ini Promptku!PS2="Lengkapi dong ? "
then the first and second prompt will change, to restore the original PS1 prompt you to type the command
[fajar@linux$]PS1=$PS1LAMA
If you want to configure a shell prompt, bash has provided several backslash characters are:
\aASCII bell character (07)
\ddate dengan format "Weekday Month Date" (misalnya "Tue May 26")
\eASCII escape character (033)
\Hhostname (namahost)
\nnewline (karakter baru)
\wDirektory aktif
\ttime dalam 24 jam dengan format HH:MM:SS
dllman 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

or the positional parameters are variables used shell to accommodate the arguments given to the shell either argument time a file is executed or sent to a subroutine arguments. the variable in question is 1,2,3, dst..lebih details, see the example script:
#!/bin/bash
#argumen1

echo $1 adalah salah satu $2 populer di $3
The result
[fajar@linux$]./argumen1 bash shell linux
bash adalah salah satu shell populer di linux
there are three arguments that are included in the script argument 1 is bash, shell, linux, masing2 arguments will be stored in the variable corresponding 1,2,3 position. Another special variable that can be used are shown in the following script:

#!/bin/bash
#argumen2

clear
echo "Nama script anda : $0";
echo "Banyak argumen   : $#";
echo "Argumennya adalah: $*";
The result
[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

or variables defined by the script maker according to his needs, some things to consider in define variables are:

  • begins with a letter or underscore
  • avoid the use of special characters such as *, $, #, etc ...
  • bash is case sensitive, meaning that distinguish uppercase and lowercase letters, a contrast to A, in contrast to name names, name, etc ..
  • to set the value of a variable using the assignment operator (giving value) "=", for example:


myos="linux"        #double-quoted
nama='pinguin'      #single-quoted 
hasil=`ls -l`;      #back-quoted
angka=12
If you notice there are three quotes that we use to give a string value to a variable, while the difference is:
  • 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/O

I/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 controlketerangan
%duntuk format data integer
%ooctal
%ffloat atau decimal
%xHexadecimal
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 :-)
OpsiKeterangan
-pmemungkinkan kita membuat prompt sebagai informasi pengisian
-smembuat input yang dimasukkan tidak di echo ke layar (seperti layaknya password di linux)
-nmenentukan banyak karakter yang diinput
-dmenentukan 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, atau info tput

7. Seleksi dan Perulangan

Bagian 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, misalkan 2+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 integer

OperatorKeterangan
bil1 -eq bil2Mengembalikan 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 string

OperatorKeterangan
-z STRINGMengembalikan Benar jika panjang STRING adalah zero
STRING1 == STRING2-||- Benar jika STRING1 sama dengan STRING2

7.1.3 Operator file

OperatorKeterangan
-f FILEMengembalikan Benar jika FILE ada dan merupakan file biasa
-d FILE-||- Benar jika FILE ada dan meruapakan direktory

7.1.3 Operator logika

ekspr1 -o ekspr2Benar jika jika salah satu ekspresi benar (or,||)
ekspr1 -a ekspr2Benar jika ekspresi1 dan ekspresi2 benar (and,&&)
! ekspresiMengembalikan 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 fo

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 dari0 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 selectakan terlihat lebih efisien.
syntax:
select varname in (&ltitem 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. Array

adalah 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 Fungsi

merupakan 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.