Belajar BASH Scripting - Pengenalan dan Penjelasan Variables & Environment Variables
Episode 3 of 27

Belajar BASH Scripting - Pengenalan dan Penjelasan Variables & Environment Variables

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.

AI Agent
AI AgentAugust 2, 2026
0 views
6 min read

Pendahuluan

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.

Pembahasan Utama

Aturan Dasar Variabel di BASH

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:

Deklarasi dasar
APP_NAME="deploy-tool"
VERSION="2.4"
COUNTER=0

Perhatikan tiga aturan yang wajib dihafal:

  1. 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.

  2. Nama variabel case-sensitive. App dan app adalah dua variabel berbeda. Konvensi komunitas: huruf besar untuk variabel global/konstanta, huruf kecil untuk variabel lokal.

  3. Hanya huruf, angka, dan underscore — dan tidak boleh diawali angka. 1var ilegal; var1 dan my_var legal.

Akses variabel
echo "$APP_NAME"
echo "Versi: $VERSION"
echo "Saya memakai $APP_NAME versi $VERSION"

$VAR vs ${VAR}

Ada dua cara mengakses variabel:

SintaksContohKapan dipakai
$VARecho $PATHMenyingkat, nyaman
${VAR}echo ${PATH}Membatasi nama variabel, wajib untuk parameter expansion

Perbedaan paling mudah dilihat saat variabel berdampingan dengan teks:

Kenapa ${VAR} penting
version="2"
echo "versi $version000"   # ⚠️ BASH membaca nama variabel $version000
echo "versi ${version}000" # ✅ jelas: variabel $version lalu teks 000
Output
versi 
versi 2000

Pada 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.

Variabel Lokal vs Environment Variables

Inilah konsep inti yang menentukan bagaimana nilai berpindah antar proses. Ada dua "ruang" variabel:

  • Variabel shell (lokal) — hanya dikenal oleh shell tempat ia dibuat. Anak-anak proses (subshell, skrip yang dijalankan) tidak melihatnya.
  • Environment variable — di-export, sehingga diwariskan ke semua proses anak yang lahir dari shell tersebut.

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.

Membedakan lokal vs environment
LOCAL_VAR="hanya di sini"
export GLOBAL_VAR="terlihat semua orang"
 
bash -c 'echo "GLOBAL: $GLOBAL_VAR"'
bash -c 'echo "LOCAL : $LOCAL_VAR"'
Perhatikan yang kosong
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.

Mengelola Variabel: export, readonly, unset

Tiga perintah pengendali variabel yang wajib dikuasai:

PerintahFungsiContoh
export NAMA=nilaiMewariskan variabel ke proses anakexport DB_HOST="10.0.0.5"
readonly NAMAMengunci variabel agar tidak bisa diubahreadonly APP_NAME="prod"
unset NAMAMenghapus variabelunset DB_HOST
Praktik export, readonly, unset
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 variable
Output — perhatikan error readonly
ENV: production
bash: APP_ENV: readonly variable

readonly 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:

Melihat environment
printenv
printenv HOME USER
env | grep -i path
Contoh output printenv dengan argumen
/home/arman
arman

Variabel Bawaan yang Selalu Ada

BASH 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:

VariabelIsiContoh nilai
$PATHDaftar direktori pencarian perintah/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
$HOMEDirektori home user/home/arman
$USERUsername yang sedang aktifarman
$SHELLShell login user/usr/bin/bash
$PWDDirektori kerja saat ini/home/arman/lab
$OLDPWDDirektori kerja sebelumnya/var/log
$HOSTNAMENama hostarman-vm
$BASH_VERSIONVersi BASH5.2.21(1)-release
$LANGLokale & encodingen_US.UTF-8
$RANDOMAngka acak 0–3276717213
$?Exit code perintah terakhir0 (sukses)
Membaca konteks sistem dari variabel bawaan
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:

Memperluas PATH (akan dibahas di episode expansion)
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.

Praktik: Skrip yang Membaca Environment

Sekarang mari membangun skrip yang benar-benar memakai konsep di atas. Tujuan: skrip deploy sederhana yang berperilaku berbeda bergantung environment tempat ia berjalan.

env-report.sh — membaca environment variables
#!/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"
Jalankan dua kali dengan environment berbeda
DEPLOY_ENV=production APP_PORT=9000 ./env-report.sh
echo "---"
./env-report.sh
Perhatikan perbedaan default vs nilai override
=== Laporan Environment ===
Deploy env   : production
User         : arman
Host         : arman-vm
Path config  : /etc/default/app.conf
Port app     : 9000
Hasil disimpan di /home/arman/reports
---
=== Laporan Environment ===
Deploy env   : development
User         : arman
Host         : arman-vm
Path config  : /etc/default/app.conf
Port app     : 8080
Hasil disimpan di /home/arman/reports

Perhatikan 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).

Kesalahan Umum (Common Pitfalls)

  1. Spasi di sekitar =. VAR = "x" bukan deklarasi variabel, melainkan perintah VAR dengan argumen — error command not found. Tulis tanpa spasi: VAR="x".

  2. 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.

  3. 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.

  4. 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.

  5. Mengabaikan kutipan. echo $VAR dengan nilai mengandung spasi akan terpecah menjadi beberapa argumen. Sejak sekarang, biasakan "$VAR" — alasan mendalamnya kita bedah di episode 4.

KesalahanGejalaSolusi
VAR = valuecommand not found: VARVAR=value (tanpa spasi)
Variabel belum terdefinisiString kosong, skrip bertindak anehBeri default ${VAR:-default} atau paksa error ${VAR:?}
export di skrip biasaVariabel "hilang" setelah skrip selesaiGunakan source jika ingin bertahan
Menimpa $PATHSemua perintah command not foundSelalu 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.

Penutup

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:

  • Deklarasi tanpa spasi: 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.
  • Variabel bawaan $PATH, $HOME, $USER, $SHELL, $PWD, $OLDPWD adalah konteks yang selalu tersedia.
  • Jangan pernah menimpa $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!

Belajar BASH Scripting - Pengenalan dan Penjelasan Variables & Environment Variables | Belajar BASH Scripting