Mengolah String Menggunakan Bash

Belajar Bash itu sangat bermanfaat. Jangan terpancing dengan cibiran orang pada Bash. jadi jika suatu ketika Anda berkonsultasi perihal Bash dan disarankan untuk beralih menggunakan "the real programming language", acuhkan saja. Setelah berpuluh tahun, Bash telah berkembang dan sangat layak guna membuat skrip yang tidak membutuhkan algoritma rumit.

Dalam artikel ini saya akan menulis tentang kemampuan Bash dalam mengolah string. Kata string ini agak susah dicari padanan kata bahasa Indonesianya, jadi selanjutnya akan saya tulis sebagai string saja. Kata string sendiri dapat diartikan sebagai urutan karakter. Misal "Angka", "12247" dan "Al4y 1337" adalah string.

Pastinya pernah ketika Anda membuat skrip Bash banyak menggunakan bantuan perkakas di luar Bash, misal sed, awk, basename, dirname, tr dan lainnya. Hal ini dikarenakan kemampuan Bash yang terbatas. Dari fenomena ini jugalah Bash mendapat gelar sebagai glue, lem yang menghubungkan banyak perkakas untuk bekerjasama menghasilkan hasil tertentu. Namun seperti telah disinggung di muka, Bash kini telah mendapat penambahan fitur yang bisa menekan penggunaan external utilities.

Nah, berikut di bawah akan saya uraikan contoh kemampuan Bash dalam mengolah string secara mandiri tanpa menggunakan perkakas semacam sed, awk, basename atau dirname.
Enjoy.

Mengubah besar-kecilnya huruf

Apa yang akan Anda lakukan jika perlu mengubah string yang tadinya berhuruf kecil menjadi berupa huruf besar? Saya yakin yang awal terlintas di pikiran adalah menggunakan bantuan sed, awk atau tr. Sekarang Anda tidak perlu menggunakan ketiganya, karena Bash telah memiliki fungsi built-in untuk ini.

Misal ada sebuah variable yang akan kita gunakan pada seluruh contoh dalam artikel ini .

anu='ini adalah string'

Dan kita ingin mengubah semua huruf dalam variable anu menjadi huruf besar (sering disebut sebagai huruf kapital atau huruf balok).

$ echo ${anu^^}
$ INI ADALAH STRING

Atau kita hanya ingin mengubah huruf awalnya saja agar menjadi huruf besar.

$ echo ${anu^}
$ Ini adalah string

Penggantian string

sed dan awk adalah kandidat utama untuk kerja regex seperti ini. Namun untuk penggantian string yang sederhana, Bash pun sanggup melakukannya. Syntax-nya pun tidak jauh beda dengan sed atau awk.

stringbaru=${stringlama/pola/pengganti}

Misal kita ingin mengganti semua huruf "i" dalam variable anu menjadi huruf "o".

$ echo ${anu/i/o}
$ oni adalah string

Oops. Ternyata hanya huruf "i" yang paling awal ditemui yang diganti menjadi huruf "o", sisanya tidak.
Lalu bagaimana jika kita ingin mengganti semua huruf "i" dalam variable anu menjadi huruf "o"?
Kita bisa lakukan cara yang dinamakan global subtitution (penggantian menyeluruh) seperti berikut:

$ echo ${anu//i/o}
$ ono adalah strong

Ya, bedanya hanya dengan menambahkan satu garis miring lagi pada garis miring pertama dalam syntax.

Parameter expansion

Dengan menggunakan parameter expansion kita akan bisa mendapat hasil serupa yang dihasilkan basename atau dirname. Dengan kata lain, kita tidak perlu lagi menggunakan perkakas tersebut.

Misal kita memiliki sebuah berkas yang terletak di:

letakberkas='/home/iza/Software/ISO/ubuntu-17.04-desktop-amd64.iso'

Dan hanya ingin mendapatkan nama berkasnya saja.

$ echo ${letakberkas##*/}
$ ubuntu-17.04-desktop-amd64.iso

Atau hanya ingin mendapatkan letak menuju berkas tersebut:

$ echo ${letakberkas%/*}
$ /home/iza/Software/ISO

Dapatkah Anda mengetahui di mana bedanya?
Ya, jika kita ingin memilah string yang terletak di bagian kanan pola (dalam contoh kali ini polanya adalah garis miring) maka kita menggunakan tanda pagar (#), dan jika ingin memilah string yang terletak di bagian kiri pola kita akan menggunakan tanda persen (%).

Untuk kegunaan lain dari parameter expansion ini bisa dibaca pada artikel blog GitHub Pages saya di: .

Substring

Bash juga memiliki fungsi substring sebagaimana "the real programming language".
Misal kita hanya ingin mendapatkan 2 karakter dimulai dari karakter ke 6 dari variable anu:

$ echo ${anu:5:2}
$ da

Katanya tadi karakternya dimulai dari 6? kenapa ditulis 5?
Harap diingat, Bash memulai hitungan karakter dari 0. Jadi jangan aneh jika karakter ke 6 itu ditulis sebagai 5.

Lalu bagaimana jika kita ingin memilah 2 karakter dari ujung string?
Kita bisa gunakan parameter offset -1. Jadi jika karakter awal dari depan dimulai dari 0, karakter awal dari belakang dimulai dari -1.

$ echo ${anu: -1:1}
$ g

Perhatikan spasi di antara string dan parameternya. Tanpa spasi ini, syntax tidak akan bekerja.

Dari kedua contoh di atas, kita dapatkan garis besar:

{string: offset:banyakkarakter} 

Untuk lebih membuat paham, perhatikan contoh berikut:
Ambil 4 karakter setelah karakter ke-7 dari awal string.

$ echo ${anu:6:4}
$ alah

Ambil 3 karakter setelah karakter ke-5 dari ujung string.

$ echo ${anu: -5:3}
$ tri

Operasi Hitung

Jika hanya memerlukan operasi hitung sederhana, bash pun dapat melakukannya.

Menjumlahkan 3 + 5.

$ echo $((3+5))
$ 8

mengalikan 8 x 9.

$ echo $((8*9))
$ 72

Membagi 4/2

$ echo $((4/2))
$ 2

Bash tidak bisa menampilkan hasil dalam pecahan, jadi 3 dibagi 2 hanya akan menghasilkan 1.

$ echo $((3/2))
$ 1

Operasi hitung campuran (8 + 3) x 7

$ echo $(((8+3)*7))
$ 77

Demikian untuk kali ini.
Intinya, Bash telah memiliki banyak kemampuan built-in yang membuat kita tidak lagi bergantung pada external utilities. Jika kita lebih mendayagunakan Bash built-in maka niscaya skrip yang kita buat akan lebih gegas dan ringan karena tidak perlu menjalankan banyak proses lain.