Shell
Scripting Tutorial
Loops
# Loops
Kebanyakan
bahasa memiliki konsep loop: Jika kita ingin mengulang tugas dua puluh kali,
kita tidak ingin harus mengetikkan kode dua puluh kali, dengan mungkin sedikit
perubahan setiap kali.
Akibatnya,
kami memiliki untuk dan sementara loop di shell Bourne. Ini adalah fitur yang
sedikit lebih sedikit daripada bahasa lain, tetapi tidak ada yang mengklaim
bahwa pemrograman shell memiliki kekuatan C.
For Loops
untuk loop,
ulangi melalui serangkaian nilai sampai daftar habis:
#!/bin/sh
for i in 1 2 3 4 5
do
echo "Looping
... number $i"
done
Coba kode
ini dan lihat apa fungsinya. Perhatikan bahwa nilainya bisa apa saja:
#!/bin/sh
for i in hello 1 * 2 goodbye
do
echo "Looping
... i is set to $i"
done
Ini layak
untuk dicoba. Pastikan Anda memahami apa yang terjadi di sini. Cobalah tanpa *
dan pegang idenya, kemudian baca kembali bagian Wildcard dan coba lagi dengan *
di tempat. Coba juga di direktori yang berbeda, dan dengan * dikelilingi oleh
tanda kutip ganda, dan coba didahului dengan garis miring terbalik (*)
Jika Anda
tidak memiliki akses ke shell saat ini (sangat berguna untuk memiliki shell
saat membaca tutorial ini), hasil dari dua skrip di atas adalah:
Looping .... number 1
Looping .... number 2
Looping .... number 3
Looping .... number 4
Looping .... number 5
dan, untuk
contoh kedua:
Looping ... i is set to hello
Looping ... i is set to 1
Looping ... i is set to (name of first file in current directory)
... etc ...
Looping ... i is set to (name of last file in current directory)
Looping ... i is set to 2
Looping ... i is set to goodbye
Jadi,
seperti yang Anda lihat, untuk hanya loop melalui input apa pun yang diberikan,
sampai kehabisan input.
While Loops
sementara
loop bisa jauh lebih menyenangkan! (tergantung pada ide Anda tentang
kesenangan, dan seberapa sering Anda keluar dari rumah ...)
#!/bin/sh
INPUT_STRING=hello
while [ "$INPUT_STRING" != "bye" ]
do
echo "Please
type something in (bye to quit)"
read
INPUT_STRING
echo "You
typed: $INPUT_STRING"
done
Apa yang
terjadi di sini, adalah bahwa pernyataan gema dan baca akan berjalan tanpa
batas hingga Anda mengetik "bye" ketika diminta.
Tinjau
Variabel - Bagian I untuk melihat mengapa kami menetapkan INPUT_STRING = halo
sebelum mengujinya. Ini membuatnya menjadi loop berulang, bukan loop
tradisional.
Tanda titik
dua (:) selalu bernilai true; sementara menggunakan ini kadang-kadang
diperlukan, seringkali lebih baik menggunakan kondisi keluar yang sebenarnya.
Bandingkan dengan berhenti dari loop di atas dengan yang di bawah ini; lihat
mana yang lebih elegan. Juga pikirkan beberapa situasi di mana masing-masing
akan lebih berguna daripada yang lain:
#!/bin/sh
while :
do
echo "Please
type something in (^C to quit)"
read
INPUT_STRING
echo "You
typed: $INPUT_STRING"
done
Trik lain
yang bermanfaat adalah while read f loop. Contoh ini menggunakan pernyataan
kasus, yang akan kita bahas nanti. Bunyinya dari file myfile, dan untuk setiap
baris, memberi tahu Anda bahasa apa yang menurutnya digunakan. Setiap baris
harus diakhiri dengan LF (baris baru) - jika cat myfile tidak berakhir dengan
baris kosong, baris terakhir tidak akan diproses.
#!/bin/sh
while read f
do
case $f in
hello) echo English ;;
howdy) echo American ;;
gday) echo Australian ;;
bonjour) echo French ;;
"guten
tag") echo German ;;
*) echo Unknown Language: $f
;;
esac
done < myfile
Pada banyak
sistem Unix, ini juga dapat dilakukan sebagai:
#!/bin/sh
while f=`line`
do
.. process f ..
done < myfile
Tetapi
karena sementara read f bekerja dengan * nix, dan tidak bergantung pada baris
program eksternal, yang pertama lebih disukai. Lihat Program Eksternal untuk
melihat mengapa metode ini menggunakan backtick (`).
Seandainya
saya merujuk $ i (bukan $ f) dalam kasus default ("Bahasa Tidak
Diketahui") di atas, tidak akan ada peringatan atau kesalahan, meskipun $
i belum dinyatakan atau didefinisikan. Sebagai contoh:
$ i=THIS_IS_A_BUG
$ export i
$ ./while3.sh something
Unknown Language: THIS_IS_A_BUG
$
jadi
pastikan Anda menghindari kesalahan ketik. Ini juga alasan bagus lainnya untuk
menggunakan $ {x} dan bukan hanya $ x - jika x = "A" dan Anda ingin
mengatakan "A1", Anda perlu echo $ {x} 1, karena echo $ x1 akan
mencoba menggunakan variabel x1, yang mungkin tidak ada, atau dapat diatur ke
"B2," atau apa pun yang tidak terduga.
Baru-baru
ini saya menemukan utas lama di Usenet yang telah saya ikuti, tempat saya
sebenarnya belajar lebih banyak ...
Tip Bash
(tapi bukan Bourne Shell) yang berguna yang saya pelajari baru-baru ini dari
proyek Linux From Scratch adalah:
mkdir rc{0,1,2,3,4,5,6,S}.d
bukannya
lebih rumit:
for runlevel in 0 1 2 3 4 5 6 S
do
mkdir rc${runlevel}.d
done
Dan ini bisa
dilakukan secara rekursif juga:
$ cd /
$ ls -ld {,usr,usr/local}/{bin,sbin,lib}
drwxr-xr-x 2 root root 4096 Oct 26 01:00 /bin
drwxr-xr-x 6 root root 4096 Jan 16 17:09 /lib
drwxr-xr-x 2 root root 4096 Oct 27 00:02 /sbin
drwxr-xr-x 2 root root 40960 Jan 16 19:35 usr/bin
drwxr-xr-x 83 root root 49152 Jan 16 17:23 usr/lib
drwxr-xr-x 2 root root 4096 Jan 16 22:22 usr/local/bin
drwxr-xr-x 3 root root 4096 Jan 16 19:17 usr/local/lib
drwxr-xr-x 2 root root 4096 Dec 28 00:44 usr/local/sbin
drwxr-xr-x 2 root root 8192 Dec 27 02:10 usr/sbin
Tidak ada komentar:
Posting Komentar