Pada masa awal-awal menggunakan Linux dan berhasil menulis bash script, I felt like a hacker.
Menyadari bahwa bisa menulis beberapa baris untuk mengerjakan tugas tertentu telah membuka cakrawala pikiran saya yang kala itu masih menggunakan Windows. It’s different, simple, but powerfull.

Dari sana, kemudian banyak membaca dan menulis script bash. Ternyata tidak sesederhana yang semula dipikirkan, namun tetap saja menyenangkan.
Dari sumber-sumber bacaan, akhirnya saya mengenal yang namanya good practice dalam programming. Well, there are peoples who laugh at your face for saying bash scripting as programming. Abaikan saja, dan buat bash script yang sesuai dengan kaidah yang baik.

Jadi, bagaimanakah rupa bash script yang baik? Sejujurnya saya tidak bisa menilai sebuah apakah sebuah bash script itu baik atau tidak, semakin banyak yang saya baca mengenai bash, semakin banyak yang tidak dimengerti.
Untungnya, –maklum, sebagai orang Indonesia kita selalu beruntung– ada alat untuk membantu kita menilai apakah sebuah script bash itu baik atau tidak. Nama alat tersebut adalah shellcheck.

shellcheck adalah piranti lunak untuk menelaah shell script (static analysis tool for shell scripts).
Kita bisa memeriksakan script secara daring di http://www.shellcheck.net atau dengan memasang paket shellcheck di distro kesayangan.

Berikut dicontohkan sebuah kasus sederhana; Saya memiliki sebuah map berisi clone dari repository di github yang dirasa menarik. Isinya tidak terlalu banyak, namun akan cukup membosankan jika mesti memutakhirkannya secara manual satu-per-satu. Jadi saya membuat sebuah script bernama ghupdate untuk melakukan git pull pada tiap repo tersebut. Berikut script-nya:

#!/bin/bash

GITHUB="$HOME/github"

while read repo; do
  cd "$repo"
  printf "\n Pulling $repo ...\n"
  git pull
done < <(find "$GITHUB" -maxdepth 1 -type d)

Sekilas terlihat tidak ada yang aneh dari script ini, dan nyatanya ia pun bekerja dengan baik. Mari kita periksa apa pendapat shellcheck:

shellcheck ghupdate

Dan hasilnya…

In ghupdate line 5:
while read repo; do
      ^-- SC2162: read without -r will mangle backslashes.


In ghupdate line 6:
  cd "$repo"
  ^-- SC2164: Use cd ... || exit in case cd fails.


In ghupdate line 7:
  printf "\n Pulling $repo ...\n"
         ^-- SC2059: Don't use variables in the printf format string. Use printf "..%s.." "$foo".

Hmmm, ternyata script ghupdate ini tidak sebaik yang dikira.
shellcheck setidaknya menunjukkan tiga kelemahan pada script. Sayangnya, jika menggunakan shellchek dari repo, kita hanya akan disuguhi hasil secara garis besar. Jika menginginkan rincian mengenai kesalahan dan bagaimana memperbaikinya, mengharuskan kita untuk memeriksanya secara daring di wiki shellcheck.
Jadi, rincian kelemahan script ghupdate di atas dapat diperiksa di:

Dan akhirnya, berikut script ghupdate hasil perbaikan:

#!/bin/bash

GITHUB="$HOME/github"

while IFS="" read -r repo; do
  cd "$repo" || exit
  printf "\n Pulling %s ...\n" "$repo"
  git pull
done < <(find "$GITHUB" -maxdepth 1 -type d)

Happy shellcecking…