Membedah konsep variabel di BASH: aturan penamaan dan deklarasi, akses dengan $VAR dan ${VAR}, perbedaan variabel lokal dengan environment variables (export, readonly, unset), daftar variabel bawaan penting seperti $PATH, $HOME, dan $USER, serta praktik membangun skrip yang membaca environment dengan benar.

Setelah di episode 2 sebelumnya kita menulis skrip pertama dan memahami shebang, chmod +x, serta tiga mode eksekusi — termasuk bukti bahwa export di dalam skrip yang dijalankan sebagai program tidak bertahan di shell utama — pada episode kali ini kita masuk ke "bahasa" BASH yang sesungguhnya: variables & environment variables.
Variabel adalah sel dasar dari semua skrip. Tanpa variabel, skrip kalian hanyalah daftar perintah statis yang harus diedit manual setiap kali nilainya berubah. Dengan variabel, kalian bisa menulis satu skrip yang berlaku untuk banyak server, banyak pengguna, banyak skenario — cukup dengan mengganti nilai, bukan mengganti kode. Inilah yang membedakan skrip "sekali pakai" dari skrip yang benar-benar berguna.
Episode 3 ini adalah fondasi untuk semua episode berikutnya: kontrol flow, perulangan, fungsi, array, dan parameter expansion semuanya berpijak di atas pemahaman variabel. Kita akan membedah aturan deklarasi, perbedaan variabel lokal vs environment variables (export, readonly, unset), variabel bawaan penting yang ada di setiap sistem, dan menutup dengan skrip praktis yang membaca environment + daftar kesalahan paling umum.
Berbeda dengan bahasa pemrograman modern, di BASH variabel tidak perlu dideklarasikan dengan tipe — semuanya diperlakukan sebagai string (angka tetap bisa dihitung, kita bahas di episode aritmatika). Cukup tulis nama variabel, tanda sama dengan, dan nilainya:
APP_NAME="deploy-tool"
VERSION="2.4"
COUNTER=0Perhatikan tiga aturan yang wajib dihafal:
Tidak ada spasi di sekitar =. APP_NAME = "deploy" akan diartikan sebagai perintah bernama APP_NAME dengan argumen — dan menghasilkan command not found. Ini kesalahan nomor satu pemula.
Nama variabel case-sensitive. App dan app adalah dua variabel berbeda. Konvensi komunitas: huruf besar untuk variabel global/konstanta, huruf kecil untuk variabel lokal.
Hanya huruf, angka, dan underscore — dan tidak boleh diawali angka. 1var ilegal; var1 dan my_var legal.
echo "$APP_NAME"
echo "Versi: $VERSION"
echo "Saya memakai $APP_NAME versi $VERSION"$VAR vs ${VAR}Ada dua cara mengakses variabel:
| Sintaks | Contoh | Kapan dipakai |
|---|---|---|
$VAR | echo $PATH | Menyingkat, nyaman |
${VAR} | echo ${PATH} | Membatasi nama variabel, wajib untuk parameter expansion |
Perbedaan paling mudah dilihat saat variabel berdampingan dengan teks:
version="2"
echo "versi $version000" # ⚠️ BASH membaca nama variabel $version000
echo "versi ${version}000" # ✅ jelas: variabel $version lalu teks 000versi
versi 2000Pada baris pertama, BASH menganggap $version000 adalah satu nama variabel (yang tidak terdefinisi) — hasilnya kosong. Kurung kurawal ${version} memberi tahu BASH persis di mana nama variabel berakhir. Kebiasaan memakai ${VAR} untuk segala sesuatu di dalam teks akan menghindarkan kalian dari bug halus seperti ini.
Tip
Di dalam skrip, biasakan selalu memakai ${VAR} ketika variabel berdampingan dengan karakter lain, dan "${VAR}" ketika nilai bisa mengandung spasi atau karakter khusus (detail lengkap di episode quoting). Kurung kurawal bukan sekadar gaya — ia mencegah bug "nama variabel tergabung dengan teks" yang sulit dilacak.
Inilah konsep inti yang menentukan bagaimana nilai berpindah antar proses. Ada dua "ruang" variabel:
Analoginya: variabel lokal adalah catatan di buku catatan pribadi kalian; environment variable adalah pengumuman di papan buletin kantor — semua orang di lantai itu (proses anak) bisa membacanya.
LOCAL_VAR="hanya di sini"
export GLOBAL_VAR="terlihat semua orang"
bash -c 'echo "GLOBAL: $GLOBAL_VAR"'
bash -c 'echo "LOCAL : $LOCAL_VAR"'GLOBAL: terlihat semua orang
LOCAL : Proses bash -c adalah shell anak. Ia melihat GLOBAL_VAR (yang di-export) tapi buta terhadap LOCAL_VAR. Di episode 2 kita membuktikan bahwa export di dalam skrip yang dijalankan sebagai program tidak bertahan — ini penjelasan yang sama: export hanya mengirim nilai ke proses anak, tidak pernah mengembalikan ke induk.
export, readonly, unsetTiga perintah pengendali variabel yang wajib dikuasai:
| Perintah | Fungsi | Contoh |
|---|---|---|
export NAMA=nilai | Mewariskan variabel ke proses anak | export DB_HOST="10.0.0.5" |
readonly NAMA | Mengunci variabel agar tidak bisa diubah | readonly APP_NAME="prod" |
unset NAMA | Menghapus variabel | unset DB_HOST |
export CONFIG_FILE="/etc/myapp.conf" # diwariskan ke semua proses anak
readonly APP_ENV="production" # terkunci selamanya
unset CONFIG_FILE # dihapus dari memory
echo "ENV: $APP_ENV"
APP_ENV="staging" # ⚠️ error: readonly variableENV: production
bash: APP_ENV: readonly variablereadonly berguna untuk konstanta yang tidak boleh berubah di tengah skrip — melindungi dari bug saat nilai penting ditimpa oleh bagian kode lain. unset membersihkan variabel yang tidak lagi dibutuhkan.
Untuk melihat semua environment variable yang aktif, gunakan:
printenv
printenv HOME USER
env | grep -i path/home/arman
armanBASH dan sistem operasi menyediakan variabel yang sudah terisi — kalian tinggal membacanya. Ini adalah "konteks" yang diwariskan sistem ke setiap proses, dan menjadi sumber informasi yang sangat berharga bagi skrip:
| Variabel | Isi | Contoh nilai |
|---|---|---|
$PATH | Daftar direktori pencarian perintah | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin |
$HOME | Direktori home user | /home/arman |
$USER | Username yang sedang aktif | arman |
$SHELL | Shell login user | /usr/bin/bash |
$PWD | Direktori kerja saat ini | /home/arman/lab |
$OLDPWD | Direktori kerja sebelumnya | /var/log |
$HOSTNAME | Nama host | arman-vm |
$BASH_VERSION | Versi BASH | 5.2.21(1)-release |
$LANG | Lokale & encoding | en_US.UTF-8 |
$RANDOM | Angka acak 0–32767 | 17213 |
$? | Exit code perintah terakhir | 0 (sukses) |
echo "Saya: $USER, di host: $HOSTNAME"
echo "Direktori: $PWD (sebelumnya: $OLDPWD)"
echo "Home: $HOME"
echo "Angka acak: $RANDOM"Kegunaan nyata $RANDOM misalnya membuat nama file sementara yang unik: ${RANDOM}-log. $? adalah kunci error handling yang akan kita bangun di episode strict mode. $PATH adalah variabel yang paling sering dimodifikasi — menambahkan direktori tool:
export PATH="$PATH:$HOME/bin"Warning
Hati-hati saat memodifikasi $PATH — jangan pernah menghapus isinya. PATH="/usr/bin" akan melumpuhkan sebagian besar perintah karena shell tidak lagi menemukan ls, cp, atau bash dari direktori lain. Selalu tambah ke variabel yang ada ($PATH:$HOME/bin), jangan menimpanya mentah-mentah.
Sekarang mari membangun skrip yang benar-benar memakai konsep di atas. Tujuan: skrip deploy sederhana yang berperilaku berbeda bergantung environment tempat ia berjalan.
#!/bin/bash
export REPORT_DIR="$HOME/reports"
mkdir -p "$REPORT_DIR"
echo "=== Laporan Environment ==="
echo "Deploy env : ${DEPLOY_ENV:-development}"
echo "User : $USER"
echo "Host : $HOSTNAME"
echo "Path config : ${APP_CONFIG:-/etc/default/app.conf}"
echo "Port app : ${APP_PORT:-8080}"
echo "Hasil disimpan di $REPORT_DIR"DEPLOY_ENV=production APP_PORT=9000 ./env-report.sh
echo "---"
./env-report.shPerhatikan pola ${VAR:-default} — parameter expansion yang berarti "pakai $VAR jika terdefinisi, jika tidak pakai default". Dengan satu pola ini, skrip yang sama berperilaku berbeda sesuai environment tanpa mengubah kode: di lokal nilai default dipakai, di produksi nilai override yang berlaku. Inilah inti dari skrip yang "production-grade" — dikendalikan environment, bukan diedit per server.
Skrip seperti ini adalah pola nyata di dunia DevOps: CI/CD pipeline mengirim environment variable (DEPLOY_ENV=staging), skrip merespons tanpa perlu tahu dari mana nilai itu berasal.
Important
Jangan pernah menaruh secret (password, token, API key) langsung di dalam skrip. Bacalah dari environment variable — misalnya ${DB_PASSWORD:?DB_PASSWORD belum di-set}. Operator :? akan memaksa skrip berhenti dengan pesan error jika variabel tidak ada, mencegah kalian menjalankan skrip dengan konfigurasi yang hilang. Secret sejati dikelola tool seperti Vault (dibahas di series Belajar Secret Management).
Spasi di sekitar =. VAR = "x" bukan deklarasi variabel, melainkan perintah VAR dengan argumen — error command not found. Tulis tanpa spasi: VAR="x".
Menggunakan variabel yang belum terdefinisi. BASH tidak error saat variabel kosong dipanggil — ia diam-diam menghasilkan string kosong. Akibatnya rm -rf $DIR/ dengan DIR kosong menjadi rm -rf / — bencana. Perlindungan: selalu beri nilai awal, atau pakai ${VAR:?} untuk memaksa error.
Mengekspektasi perubahan variabel bertahan. Seperti episode 2: skrip yang dijalankan sebagai program berjalan di subshell — export di dalamnya tidak mengubah shell induk. Ingin perubahan bertahan? source.
Nama variabel bertabrakan. USER, HOME, dan PATH sudah dipakai sistem. Menimpa PATH adalah kesalahan klasik yang melumpuhkan perintah. Gunakan nama spesifik dengan awalan unik (misal MYAPP_*) untuk menghindari tabrakan.
Mengabaikan kutipan. echo $VAR dengan nilai mengandung spasi akan terpecah menjadi beberapa argumen. Sejak sekarang, biasakan "$VAR" — alasan mendalamnya kita bedah di episode 4.
| Kesalahan | Gejala | Solusi |
|---|---|---|
VAR = value | command not found: VAR | VAR=value (tanpa spasi) |
| Variabel belum terdefinisi | String kosong, skrip bertindak aneh | Beri default ${VAR:-default} atau paksa error ${VAR:?} |
export di skrip biasa | Variabel "hilang" setelah skrip selesai | Gunakan source jika ingin bertahan |
Menimpa $PATH | Semua perintah command not found | Selalu PATH="$PATH:..." |
Note
Budaya debugging yang tepat: sebelum menyalahkan variabel, lihat isinya. Jalankan echo "nilai: ${VAR}", atau set -u di awal skrip (membuat BASH error saat variabel kosong dipakai) dan set -x (mencetak setiap baris yang dieksekusi). Kedua opsi ini akan kita dalami di episode error handling & debugging — tapi mengenalnya sejak sekarang akan menghemat jam debugging kalian.
Pada episode 3 ini kalian telah memahami variabel sebagai inti bahasa BASH: aturan deklarasi tanpa spasi di sekitar =, nama case-sensitive, akses $VAR vs ${VAR} (dan mengapa kurung kurawal mencegah bug), perbedaan variabel lokal dengan environment variables yang diwariskan lewat export, pengendali readonly dan unset, variabel bawaan seperti $PATH, $HOME, $USER, $SHELL, $PWD, dan $OLDPWD, serta pola ${VAR:-default} yang membuat skrip responsif terhadap environment tanpa mengubah kode.
Inti yang harus kalian bawa:
VAR="nilai"; nama case-sensitive, hanya alfanumerik + underscore.$VAR untuk singkat, ${VAR} untuk membatasi nama — biasakan memakai ${VAR} di dalam teks.export mewariskan nilai ke proses anak; variabel tanpa export hanya hidup di shell itu.$PATH, $HOME, $USER, $SHELL, $PWD, $OLDPWD adalah konteks yang selalu tersedia.$PATH; jangan pernah menaruh secret di dalam skrip — baca dari environment.Variabel adalah "kata benda" BASH. Di episode 4 selanjutnya kita akan membahas "tanda baca" yang menentukan bagaimana kata-kata itu diucapkan: quoting, escaping & word splitting — kapan memakai kutip tunggal vs ganda, bagaimana backslash menyelamatkan karakter khusus, mekanisme IFS yang memecah string, dan mengapa "$@" bisa menyelamatkan kalian dari bencana file bernama ber-spasi. Fondasi yang kalian bangun di episode ini akan langsung diuji di sana. Sampai jumpa!