Variabel

Penugasan variabel, aturan tanda kutip, variabel lingkungan, dan PATH.

Daftar isi

Variabel memberi nama pada sebuah nilai sehingga nilai itu dapat digunakan ulang di banyak tempat pada skrip. Topik ini membahas penugasan variabel, aturan tanda kutip yang menentukan perlakuan terhadap nilainya, variabel lingkungan yang diwariskan ke proses anak (child process), serta peran PATH dalam pencarian perintah. Semua contoh dieksekusi secara nyata sehingga perbedaan antar aturan terlihat pada keluarannya, bukan hanya pada penjelasannya.

Penugasan variabel#

Penugasan variabel ditulis nama=nilai tanpa spasi di sekitar tanda sama dengan. Bagian kirinya hanya boleh berisi huruf, angka, dan garis bawah, tidak boleh diawali angka, dan bersifat peka huruf besar-kecil. Tanda $ tidak digunakan pada penugasan, melainkan hanya ketika nilai variabel dibaca.

bash
# folder kerja latihan
mkdir -p /tmp/kerja-variabel
# menyalin dua skrip yang digunakan topik ini
cp kutip.sh lingkungan.sh /tmp/kerja-variabel/
cd /tmp/kerja-variabel
# penugasan tanpa spasi di sekitar tanda sama dengan
nama="Citra"
jumlah=24
echo "$nama memiliki $jumlah berkas"
text Keluaran
Citra memiliki 24 berkas

Pembacaan $nama dan $jumlah dilakukan sebelum perintah echo dijalankan, sehingga yang diterima echo sudah berupa teks jadi. Apabila spasi menyusup di sekitar tanda sama dengan, bash tidak lagi membaca baris itu sebagai penugasan:

bash
# spasi di sekitar tanda sama dengan disalahartikan sebagai perintah
nama = "Citra"
text Keluaran
bash: line 13: nama: command not found

bash membaca baris itu sebagai perintah bernama nama dengan dua argumen, yaitu = dan Citra, lalu mencari perintah tersebut dan gagal. Angka pada awal pesan adalah hitungan baris sesi terminal tempat percobaan ini dijalankan. Pesan command not found seperti ini sering membingungkan padahal penyebabnya hanya satu spasi. Kebiasaan yang aman adalah menulis penugasan tanpa spasi sama sekali, persis seperti pola di atas.

Aturan tanda kutip#

Nilai variabel dapat ditulis dalam tiga bentuk: dengan kutip ganda, tanpa kutip, dan dengan kutip tunggal. Ketiganya memberikan hasil yang berbeda ketika nilai mengandung spasi. Kutip ganda melakukan ekspansi variabel, yaitu mengganti penulisan $buah dengan nilainya, dan menjaga hasilnya sebagai satu kesatuan. Bentuk tanpa kutip juga melakukan ekspansi, tetapi hasilnya kemudian dipecah pada setiap spasi dalam proses yang disebut word splitting. Kutip tunggal tidak melakukan ekspansi apa pun dan mencetak teks apa adanya.

Skrip berikut menampilkan ketiga bentuk itu terhadap satu nilai yang sama:

bash kutip.sh
#!/bin/bash
# membandingkan kutip ganda, tanpa kutip, dan kutip tunggal

buah="pisang susu"

echo "1) kutip ganda:"
printf '[%s]\n' "$buah"
echo "2) tanpa kutip:"
printf '[%s]\n' $buah
echo "3) kutip tunggal:"
printf '[%s]\n' '$buah'
text Keluaran
1) kutip ganda:
[pisang susu]
2) tanpa kutip:
[pisang]
[susu]
3) kutip tunggal:
[$buah]

Pada kutip ganda, printf menerima satu argumen berisi pisang susu sehingga mencetak satu baris. Tanpa kutip, nilai yang mengandung spasi terpecah menjadi dua argumen sehingga printf berjalan dua kali dan mencetak dua baris. Pada kutip tunggal, $buah dicetak apa adanya karena tanda kutip tunggal menonaktifkan seluruh ekspansi.

Variabel lingkungan#

Variabel lingkungan (environment variable) adalah variabel yang diwariskan ke setiap proses anak, termasuk skrip yang dipanggil dari sesi saat ini. Beberapa di antaranya ditetapkan sistem sejak awal, seperti HOME untuk folder rumah pengguna dan PATH untuk daftar direktori perintah. Variabel PWD berisi folder kerja saat ini dan diperbarui otomatis setiap kali cd dijalankan.

bash
# dua variabel lingkungan bawaan yang tersedia di sesi ini
echo "HOME = $HOME"
echo "PWD  = $PWD"
text Keluaran
HOME = /home/kal
PWD  = /tmp/kerja-variabel

Nilai HOME menunjuk folder rumah pengguna yang menjalankan sesi, sedangkan PWD mengikuti hasil cd pada blok sebelumnya. Kedua variabel ini dapat dibaca langsung oleh skrip apa pun tanpa perlu diteruskan secara eksplisit. Daftar lengkap variabel lingkungan yang sedang aktif dapat dilihat dengan perintah printenv atau env.

export dan pewarisan#

Variabel yang baru dibuat dengan penugasan biasa tidak otomatis menjadi variabel lingkungan. Skrip berikut membaca variabel APP_MODE dan menampilkan nilai pengganti apabila variabel itu belum diatur:

bash lingkungan.sh
#!/bin/bash
# membaca variabel lingkungan APP_MODE

echo "APP_MODE di skrip anak: ${APP_MODE:-<tidak diatur>}"
text Keluaran
APP_MODE di skrip anak: <tidak diatur>

Pemanggilan tanpa menetapkan apa pun menghasilkan nilai pengganti karena APP_MODE memang belum ada. Penugasan biasa pada sesi induk tidak mengubah keadaan ini:

bash
# variabel biasa tidak diwarisi proses anak
APP_MODE="uji"
bash lingkungan.sh
text Keluaran
APP_MODE di skrip anak: <tidak diatur>

Variabel APP_MODE memang sudah bernilai uji di shell saat ini, tetapi nilai itu tidak ikut ke proses anak. Agar diwariskan, variabel harus diekspor dengan perintah export:

bash
# setelah diekspor, variabel diwarisi proses anak
export APP_MODE="uji"
bash lingkungan.sh
text Keluaran
APP_MODE di skrip anak: uji

Bentuk export APP_MODE="uji" menggabungkan penugasan dan ekspor dalam satu perintah, sedangkan pemisahannya, yaitu menugaskan dahulu lalu menjalankan export APP_MODE, memberikan hasil yang sama. Pewarisan hanya berlaku untuk proses anak yang dibuat setelah ekspor, bukan untuk sesi lain yang sudah berjalan. Aturan ini juga menjelaskan mengapa skrip dapat membaca PATH. Variabel itu diekspor oleh sistem sejak awal, sedangkan variabel yang dibuat di dalam sebuah skrip hanya hidup pada proses skrip itu.

PATH dan pencarian perintah#

PATH adalah variabel lingkungan berisi daftar direktori yang dipisahkan titik dua. Ketika sebuah nama perintah diketik, bash mencari berkas yang namanya sama di setiap direktori pada daftar itu secara berurutan, lalu mengeksekusi hasil pertama yang ditemukan. Mekanisme inilah sebabnya perintah seperti ls dapat dipanggil tanpa menyebut jalurnya.

Folder saat ini tidak pernah termasuk daftar itu, sehingga skrip di folder kerja selalu dipanggil dengan awalan ./. Folder baru dapat ditambahkan ke ujung PATH apabila perintah di dalamnya ingin dipanggil langsung dengan nama pendeknya:

bash
# membuat folder bin pribadi berisi satu perintah kecil
mkdir -p /tmp/bin-latihan
printf '#!/bin/bash\necho "Halo dari bin pribadi"\n' > /tmp/bin-latihan/salam-latihan
chmod +x /tmp/bin-latihan/salam-latihan
# folder itu ditambahkan ke ujung PATH
PATH="$PATH:/tmp/bin-latihan"
command -v salam-latihan
salam-latihan
text Keluaran
/tmp/bin-latihan/salam-latihan
Halo dari bin pribadi

Perintah command -v melaporkan letak berkas yang akan dieksekusi untuk sebuah nama perintah. Setelah /tmp/bin-latihan masuk ke PATH, perintah salam-latihan dapat dipanggil tanpa ./ maupun jalurnya karena bash menemukannya lewat pencarian biasa. Perubahan seperti ini hanya berlaku pada sesi saat ini.

Kesalahan umum#

  • Menuliskan spasi pada penugasan, seperti nama = "nilai". bash membacanya sebagai pemanggilan perintah dan berakhir dengan command not found.
  • Lupa menaruh tanda $ ketika membaca variabel. Perintah echo nama mencetak teks nama, bukan isinya, karena tanpa $ nama hanya berupa kata biasa.
  • Membaca variabel tanpa tanda kutip padahal nilainya mengandung spasi. Word splitting memecah nilai menjadi beberapa argumen, sebagaimana ditunjukkan kutip.sh pada bagian tanda kutip.
  • Menugaskan variabel lalu mengira skrip anak akan membacanya. Tanpa export, variabel tidak pernah keluar dari shell yang menetapkannya.
  • Menambahkan titik (.) ke PATH demi memanggil skrip dengan nama pendek. Kebiasaan ini berbahaya karena berkas berbahaya di folder kerja saat ini dapat terpanggil dengan nama perintah umum. Karena itu, skrip di folder saat ini tetap dipanggil dengan ./nama.sh.

Ringkasan#

  • Penugasan ditulis nama=nilai tanpa spasi, pembacaan menggunakan $nama, dan tanda kutip ganda disarankan pada setiap pembacaan.
  • Kutip ganda memperluas variabel dan menjaga hasilnya satu kesatuan, bentuk tanpa kutip memicu word splitting, sedangkan kutip tunggal mencetak teks apa adanya.
  • Variabel lingkungan diwariskan ke proses anak hanya setelah diekspor dengan export, dan HOME, PWD, serta PATH adalah contoh bawaan sistem.
  • PATH berisi daftar direktori yang dipisah titik dua untuk pencarian perintah, sedangkan folder saat ini tidak pernah termasuk daftar itu.

Referensi#