Skip to content

Latest commit

 

History

History
548 lines (395 loc) · 8.09 KB

13-shell-script.md

File metadata and controls

548 lines (395 loc) · 8.09 KB
title author institute date theme linkcolor
Shell Scripting
Praktikum Sistem Operasi
Ilmu Komputer IPB
2019
Dresden
.

Shell Scripting

  • script berisi kumpulan perintah shell
    • fitur: variabel, pemilihan, perulangan, fungsi, ...
  • berguna untuk:

Contoh

  1. Buat file teks hello yang berisi:

    #!/bin/sh
    echo "Hello world, $USER"
    exit 0
  2. Berikan permission untuk execute

    $ chmod +x hello
  3. Jalankan program hello

    $ ./hello

Referensi

Variabel

Variabel

# all datatype is string

# no space around `=` assignment
fname="Steve"
lname="Bourne"

echo $fname

echo "$fname $lname"

echo "${lname}, ${fname}"

read

Membaca satu baris masukan.

read NAME...
read var
  # <ketikkan masukan>

echo $var

Pathname Expansion

  • *{.sh}: nol atau lebih karakter apapun
  • ?{.sh}: satu karakter apapun
  • [...]{.sh}: satu karakter di dalam range
  • [!...]{.sh}: satu karakter selain dalam range

Pathname Expansion

ls /bin/e*
  # /bin/echo  /bin/ed  /bin/egrep

ls /bin/e?
  # /bin/ed

ls /bin/[cde]?
  # /bin/cp  /bin/dd  /bin/df  /bin/ed

ls /bin/[!a-n]?
  # /bin/ps  /bin/rm  /bin/sh  /bin/ss  /bin/su

Parameter Expansion

web="cs.ipb.ac.id"

echo $web
  # cs.ipb.ac.id

echo ${#web}
  # 12

echo ${web%.ac.id}
  # cs.ipb

echo ${web#cs.}
  # ipb.ac.id

Command Substitution

$(...)

Menjalankan perintah dan mengembalikan keluarannya.

echo "I am $(whoami)."
  # I am root.

echo "Today is $(date +%A)."
  # Today is Tuesday.

Arithmetic Expansion

$((...))

Mengevaluasi ekspresi aritmatika dan mengembalikan keluarannya.

x=5; y=3

echo $((x + y))  $((x * y))  $((x / y))  $((x % y))

echo $((x > y))  $((x == y))  $((x > y && y > 0))

echo $((RANDOM%100))

Parameter Khusus

  • $@{.sh}: semua parameter
    • $0{.sh}: nama program
    • $1{.sh}: parameter pertama
    • $2{.sh}: parameter kedua
    • ...
  • $#{.sh}: jumlah semua parameter
  • $?{.sh}: status keluaran perintah terakhir
  • $!{.sh}: PID proses background terakhir
  • $${.sh}: PID proses shell

Kontrol Aliran

Pemilihan

if ...
    then ...
elif ...
    then ...
else
    ...
fi

[

Mengevaluasi ekspresi kondisional.

[ EXPR ]
  • -f FILE: file biasa?
  • -d FILE: file direktori?
  • -r FILE: file bisa dibaca?
  • -w FILE: file bisa ditulis?
  • STR1 = STR2: kedua string sama?
  • INT1 -eq INT2: kedua angka sama?
  • INT1 -lt INT2: lebih kecil?
  • INT1 -gt INT2: lebih besar?

[

[ -r /etc/passwd ]; echo $?
  # 0 (true)

[ -w /etc/passwd ]; echo $?
  # 1 (false)

[ "cat" = "long" ]; echo $?
  # 1 (false)

[ 10000 -gt 9999 ]; echo $?
  # 0 (true)

Kasus

case WORD in
    PATTERN)
        ... ;;
    PATTERN)
        ... ;;
esac

Perulangan

for NAME in WORDS
    do ...
done

seq

Mencetak sekuens angka, berguna untuk perulangan for.

seq [FIRST [INCREMENT]] LAST
seq 10
  # 1 2 3 4 5 6 7 8 9 10

seq 1 2 10
  # 1 3 5 7 9

Perulangan

while ...
    do ...
done

until ...
    do ...
done

Fungsi

NAME () {
    ...
}

Contoh

Pemilihan

#!/bin/sh
# create public_html directory if not exist

webdir="~/public_html"

if [ ! -d $webdir ]; then
    mkdir $webdir
fi

exit 0

Kasus

#!/bin/sh
# is today weekend?

case $(date +%a) in
    Sat|Sun)
        echo "weekend";;
    *)
        echo "weekday";;
esac

Perulangan

#!/bin/sh
# cube from 1 to 10

for i in $(seq 10); do
    echo $((i*i*i))
done

exit 0

Fungsi

#!/bin/sh
# Caesar cipher (ROT13)

rot13 () {
    tr A-Z N-ZA-M
}

uppercase () {
    tr a-z A-Z
}

uppercase | rot13

exit 0

Perulangan dan Pemilihan

#!/bin/sh
# integer divisible by 3 or 5 between 1-100

count=0
for i in $(seq 100); do
    if [ $((i%3 == 0 || i%5 == 0)) -eq 1 ]; then
        count=$((count + 1))
    fi
done
echo $count
  • catatan: shell script tidak cocok untuk program aritmatika
    • gunakan bahasa lain yang lebih sesuai, misal Python atau Ruby

Latihan

Frekuensi Kata Terbanyak

Buatlah program "topwords{.sh}" untuk mencetak 5 kata dengan frekuensi terbanyak dari masukan stdin!

$ man ls | ./topwords
     21 of
     20 sort
     19 by
     18 the
     16 with

Petunjuk pipeline pemrosesan teks

  1. ubah ke lowercase
  2. jadikan satu kata satu baris
  3. urutkan
  4. hitung kemunculan kata yang sama
  5. urutkan berdasarkan angka secara menurun
  6. ambil 5 baris teratas

Identifikasi Penyerang

Server NCC diserang dari luar melalui port SSH. Cek isi log file auth.log.gz1 dan identifikasi n alamat IP penyerang terbanyak!

$ ./top-ip-attack auth.log.gz 3
116.31.116.52   3859
221.194.47.229  1882
221.194.47.208  1819

Petunjuk pipeline pemrosesan teks

  1. tampilkan file log dengan zcat{.sh}
  2. ambil baris yang mengandung kata 'Failed'{.sh}
  3. ekstrak alamat IP tiap baris
  4. urutkan
  5. hitung kemunculan alamat IP yang sama
  6. urutkan berdasarkan angka secara menurun
  7. ambil n baris teratas

Cek Tugas Email

Bantulah asprak SO untuk mengidentifikasi praktikan yang belum mengumpulkan tugas email. Diberikan file auriza.mbox2, ambil nama user-nya, kemudian bandingkan dengan daftar user pada file passwd3!

$ ./check-no-mail
anni
michaeln
...

Petunjuk pipeline pemrosesan teks

  1. Daftar pengirim email
    1. tampilkan file kotak surat
    2. ambil baris yang mengandung kata 'From '{.sh}
    3. ekstrak nama user
    4. urutkan
    5. hilangkan nama yang berulang
  2. Daftar semua user
    1. tampilkan file /etc/passwd
    2. ambil baris yang mengandung kata 'G64'{.sh}
    3. ekstrak nama user
    4. urutkan
  3. Cari bedanya
    1. bandingkan keluaran dua pipeline di atas dengan diff{.sh}
    2. sesuaikan format sesuai keluaran yang diminta

Footnotes

  1. https://github.com/auriza/os-lab/raw/master/txt/auth.log.gz

  2. https://github.com/auriza/os-lab/blob/master/txt/auriza.mbox

  3. https://github.com/auriza/os-lab/blob/master/txt/passwd