Belajar dengan membaca secara berurutan

Shell Script - Percabangan Bersyarat

Periksa file, string, dan angka dengan [ -f config.txt ], [ -z "$name" ], dan [ "$count" -lt 5 ], buat percabangan dengan if / elif / else, dan arahkan banyak pola dengan case — tulis dan jalankan tiap script, divisualkan di terminal browser.

Bercabang dengan membandingkan nilai — perbandingan string dan angka

Di shell script kamu mengubah apa yang dijalankan dengan memeriksa apakah string cocok atau angka lebih besar.

Untuk pemeriksaan ini kamu memakai perintah test, atau [ ... ], yang melakukan hal yang sama.

[ dan ] butuh spasi tepat di dalamnya, jadi kamu menulis [ "$count" -lt 5 ].

Pemeriksaan yang benar mengembalikan exit code 0, dan yang salah mengembalikan 1.

Bandingkan string dengan = (sama) dan != (tidak sama), dan periksa kosong dengan -z (kosong) atau -n (tidak kosong).

Bandingkan angka dengan -eq (sama), -ne (tidak sama), -lt (lebih kecil), dan -gt (lebih besar), dan perhatikan bahwa string dan angka memakai operator yang berbeda.

Bungkus variabel dalam tanda kutip ganda seperti [ -z "$name" ] — dengan begitu sintaksnya tetap valid bahkan saat nilainya kosong.

count=3
mode="dev"
[ "$count" -lt 5 ] && echo small    # 3 lebih kecil dari 5, jadi small
[ "$count" -gt 0 ] && echo positive # lebih besar dari 0, jadi positive
[ "$mode" = "prod" ] || echo other  # bukan prod, jadi other
[ -z "$mode" ] || echo has-mode     # tidak kosong, jadi has-mode
Dari perbandingan ke percabangan
[ "$count" -lt 5 ]exit code 0exit code 1blok thenblok elsejika benarjika salahbenar (0)salah (1)
[ ... ] mengembalikan exit code 0 saat benar dan 1 saat salah; if menjalankan then saat benar dan else saat salah.
SyntaxArtiExample
[ "$a" = "$b" ]benar jika string a dan b sama[ "$mode" = "prod" ]
[ "$a" != "$b" ]benar jika string a dan b berbeda[ "$mode" != "dev" ]
[ -z "$v" ]benar jika variabel v kosong[ -z "$name" ] && echo empty
[ -n "$v" ]benar jika variabel v tidak kosong[ -n "$name" ] && echo set
[ "$a" -eq N ]benar jika angka a sama dengan N[ "$count" -eq 0 ]
[ "$a" -ne N ]benar jika angka a bukan N[ "$count" -ne 0 ]
[ "$a" -lt N ]benar jika angka a lebih kecil dari N[ "$count" -lt 10 ]
[ "$a" -gt N ]benar jika angka a lebih besar dari N[ "$count" -gt 0 ]

Tulis script yang menerima sebuah angka dan sebuah string sebagai argumen lalu bercabang berdasarkan nilainya.

① Buka compare.sh dengan vi compare.sh, tekan i untuk masuk insert mode, dan tulis #!/bin/sh di baris pertama.

② Ambil argumen pertama $1 sebagai angka, uji dengan -lt terhadap suatu nilai, dan cetak pesan berbeda saat lebih kecil dan saat tidak.

③ Lalu ambil argumen kedua $2 sebagai string, uji dengan = terhadap suatu kata, dan cetak pesan berbeda saat cocok dan saat tidak.

④ Tekan Esc, simpan dengan :wq, tambahkan izin eksekusi, lalu jalankan dengan argumen seperti ./compare.sh 3 dev.

⑤ Ubah argumennya menjadi ./compare.sh 8 prod dan pastikan percabangan yang diambil berubah.

⑥ Jika kamu ragu apa yang harus ditulis, salin teks di panel jawaban dan tempel ke insert mode vi. (Jalankan dengan benar untuk menampilkan penjelasannya.)

Linux console
0 / 3 selesai
Loading Linux Terminal...

Memeriksa file dan folder — -f / -d

Di sebuah script kamu sering memeriksa apakah file konfigurasi ada atau folder output sudah siap sebelum melanjutkan.

Uji file dengan -f (file biasa ada) dan folder dengan -d (sebuah direktori ada).

Saat kamu hanya peduli bahwa sesuatu ada tanpa memandang jenisnya, pakai -e, dan untuk memeriksa bahwa isinya tidak kosong, pakai -s.

Kamu menulis pemeriksaan ini dengan [ ... ] yang sama seperti untuk string dan angka, memberikan path seperti [ -f config.txt ].

Mereka mengembalikan exit code 0 saat benar dan 1 saat salah, jadi dikombinasikan dengan if atau && / || kamu bisa menulis inisialisasi pakai jika ada, buat jika tidak ada.

touch report.txt                  # buat bahannya
[ -f report.txt ] && echo exists  # filenya ada, jadi exists
[ -d report.txt ] || echo notdir  # bukan direktori, jadi notdir
mkdir logs                        # buat foldernya
[ -d logs ] && echo hasdir        # direktorinya ada, jadi hasdir
Jenis-jenis pemeriksaan file
path yang diuji[ -f path ][ -d path ][ -e path ]benar jikafile biasabenar jikadirektoribenar jikaada sajajenis pemeriksaanyang membuatnya benar
-f menguji file biasa, -d direktori, dan -e keberadaan jenis apa pun. Path yang sama bisa memberi hasil berbeda tergantung apa yang kamu tanyakan.
SyntaxArtiExample
[ -f f ]benar jika f ada sebagai file biasa[ -f config.txt ] && echo found
[ -d d ]benar jika d ada sebagai direktori[ -d logs ] && echo dir
[ -e p ]benar jika p ada, jenis apa pun[ -e data ] && echo there
[ -s f ]benar jika f ada dan tidak kosong[ -s log.txt ] && echo nonempty

Tulis script pemeriksaan yang bercabang berdasarkan apakah sebuah file dan folder ada.

① Buka setup.sh dengan vi setup.sh, tekan i untuk masuk insert mode, dan tulis #!/bin/sh di baris pertama.

② Uji file target dengan [ -f ... ] dan cetak bahwa kamu memakainya saat ada, atau bahwa kamu membuat default saat tidak ada.

③ Lalu uji folder log dengan [ -d ... ] dan cetak pesan untuk tiap kasus.

④ Tekan Esc, simpan dengan :wq, lalu tambahkan izin eksekusi.

⑤ Jalankan script dan pastikan hasil pemeriksaannya tercetak.

⑥ Jika kamu ragu apa yang harus ditulis, salin teks di panel jawaban dan tempel ke insert mode vi.

Linux console
0 / 3 selesai
Loading Linux Terminal...

Membagi alur — if / elif / else

if menjalankan blok then hanya saat kondisinya benar.

Untuk mencoba beberapa kondisi secara berurutan pakai elif, untuk kasus saat tak ada yang cocok tambahkan else, dan tutup dengan fi.

Pisahkan bagian-bagiannya dengan titik koma seperti if condition; then action; fi, atau bagi ke beberapa baris.

count=3
if [ "$count" -eq 0 ]; then
  echo "none"
elif [ "$count" -lt 5 ]; then
  echo "few ($count)"
else
  echo "many ($count)"
fi                              # mencetak few (3)
Alur if / elif / else
if [ A ]blok Aelif [ B ]blok Belseblok fallbackbenarsalahbenarsalahdiperiksa dari atas ke bawahhanya cabang benar pertama
Mulai dari if, ia mencoba tiap kondisi dan menjalankan hanya cabang pertama yang menjadi benar. Jika tak ada yang benar, ia menuju else.
SyntaxArtiExample
if cond; then … fijalankan saat kondisi benarif [ -f f ]; then echo ok; fi
thenmulai badan saat benarif [ -f f ]; then echo ok; fi
elif cond; then …coba berikutnya saat yang sebelumnya salahelif [ "$n" -lt 5 ]; then …
else …jalankan saat tak ada yang benarelse echo other; fi
fitutup ifif …; then …; fi

Tulis script pemeriksaan yang mengubah pesannya berdasarkan sebuah jumlah.

① Buka check.sh dengan vi check.sh, tekan i untuk masuk insert mode, dan tulis #!/bin/sh di baris pertama.

② Siapkan sebuah variabel yang menyimpan angka, lalu pakai if / elif / else untuk mencetak pesan berbeda untuk -eq 0, untuk -lt suatu nilai kecil, dan untuk lainnya.

③ Tekan Esc, simpan dengan :wq, lalu tambahkan izin eksekusi.

④ Jalankan script dan pastikan cabang mana yang diambil.

⑤ Jika kamu ragu apa yang harus ditulis, salin teks di panel jawaban dan tempel ke insert mode vi.

Linux console
0 / 3 selesai
Loading Linux Terminal...

Mengarahkan banyak pola — case

Saat kamu mencocokkan satu nilai terhadap banyak kandidat, case lebih mudah dibaca.

Ia berbentuk case value in pattern) action ;; esac, di mana kamu mengakhiri tiap pola dengan ;; dan menangkap kasus tanpa kecocokan dengan *).

Ini membuat maksud percabangannya lebih jelas daripada menumpuk banyak tingkat if.

action="start"
case "$action" in
  start) echo "starting service" ;;
  stop)  echo "stopping service" ;;
  *)     echo "unknown action: $action" ;;
esac                            # mencetak starting service
Pengarahan case
case "$action" instart)stop)*)start action ;;stop action ;;fallback ;;pencocokan polaaksi yang cocok (;;)
case mencocokkan nilai terhadap pola dari atas, menjalankan hanya cabang pertama yang cocok, dan menutup dengan esac. *) adalah kasus tanpa kecocokan.
SyntaxArtiExample
case x in pat) … ;; esacarahkan sebuah nilai ke beberapa polacase "$1" in start) … ;; esac
pat)sebuah pola yang dicocokkan dengan nilaistart) echo go ;;
;;akhir tiap aksi casestart) echo go ;;
*)kasus tanpa kecocokan*) echo other ;;
esactutup casecase x in …; esac

Tulis script kontrol yang menerima nama aksi sebagai argumen dan mengarahkan berdasarkan nilainya.

① Buka service.sh dengan vi service.sh, tekan i untuk masuk insert mode, dan tulis #!/bin/sh di baris pertama.

② Ambil argumen pertama $1 sebagai nama aksi, dan dengan case arahkan ke tiga pola — start, stop, dan lainnya (*) — mencetak pesan berbeda untuk masing-masing. Akhiri tiap cabang dengan ;; dan tutup dengan esac.

③ Tekan Esc, simpan dengan :wq, tambahkan izin eksekusi, lalu jalankan dengan argumen seperti ./service.sh start.

④ Ubah argumennya menjadi ./service.sh stop atau ./service.sh restart dan pastikan pola yang cocok berubah.

⑤ Jika kamu ragu apa yang harus ditulis, salin teks di panel jawaban dan tempel ke insert mode vi.

Linux console
0 / 3 selesai
Loading Linux Terminal...
QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Apa yang diuji [ -f config.txt ]?

Soal 2Keyword mana yang mencoba kondisi lain saat yang sebelumnya salah?

Soal 3Simbol mana yang menandai akhir aksi tiap pola dalam case?