Optimisasi Mikro dan Portabilitas dalam Shell-script #1
Shell-scripting mindset shift pt. 1 of 7
Pernahkah kamu menulis skrip shell murni tanpa mengeksekusi utilitas eksternal?
Tak sedikit dari kita ketika pertama kali mengenal shell terutama bash dalam memproses string sederhana,
langsung tanpa pikir panjang piping ke executable (yang bukan fitur bawaan dari shell) bahkan sampai
berkali-kali. Misalnya saja cat | grep | awk | tr | sed | cut
, itu merupakan sebuah pemborosan pemrosesan
tugas dengan memanggil banyak utilitas lain dalam pipeline walau sebenarnya sama sekali bukan masalah untuk
kepraktisan di dalam mode interaktif shell.
Namun, bagaimana jika kita menerapkan metode boros tersebut secara berulang dalam sebuah skrip shell? Tentu saja akan berpengaruh pada waktu eksekusinya. Meski pengaruhnya tidak terlalu signifikan, alangkah baiknya kita memahami tentang optimisasi mikro (atau kecil) dalam menulis skrip shell menggunakan fitur bawaan shell khususnya POSIX-compliant sh. Kita juga akan sedikit membandingkan fitur-fitur bawaan shell yang berbeda dalam hal portabilitas serta alternatifnya.
Parameter Expansion
Apa itu ekspansi parameter? Sudahkah mengerti apa yang dimaksud dengan parameter dalam shell?
Sebuah shell menyimpan satu set parameter. Parameter yang dinotasikan dengan nama disebut variabel. Saat pertama kali mengeksekusi shell (start-up), shell akan mengubah semua variabel lingkungan (yang ditetapkan oleh program lain) menjadi sebuah variabel dalam lingkungan shell.
|
|
Positional Parameter
set
bawaan dapat digunakan untuk menetapkan atau meresetnya. Array, tapi satu array.Special Parameter
Parameter khusus adalah parameter yang dinotasikan dengan karakter khusus seperti *, @, #, ?, - (hypen), $, dan !. Detailnya dapat kalian lihat lebih lanjut di manpage tiap-tiap shell yang digunakan.
|
|
Sederhananya, ekspansi atau perluasan parameter dapat kita gunakan untuk memodifikasi maupun memperoleh informasi nilai dari sebuah parameter itu (seperti variabel). Formatnya sebagai berikut:
|
|
Ekspresi di atas dapat diisi semua karakter di dalam kurung kurawal pembuka ({) hingga penutup (}).
Substring Conditional Test
|
|
POSIX.1-2017
Gunakan nilai ganti. Jika parameter tidak ditetapkan atau bernilai null, gunakan string sebagai nilai dari parameter.
|
|
|
|
POSIX.1-2017
Tampilkan string sebagai kesalahan (error) hanya jika parameter tidak ditetapkan atau bernilai null.
|
|
|
|
POSIX.1-2017
Tetapkan nilai ganti. Jika parameter tidak ditetapkan atau bernilai null, tetapkan string sebagai nilai dari parameter. Fungsinya seperti ekspansi yang pertama, tetapi hanya perlu sekali digunakan karena menetapkan. Hanya berlaku untuk variabel, bukan parameter posisi atau parameter khusus.
|
|
|
|
POSIX.1-2017
Gunakan nilai alternatif. Jika parameter ditetapkan atau bernilai bukan null, gunakan string sebagai nilai dari parameter. Ekspansi ini merupakan kebalikan dari substring conditional test yang pertama.
|
|
Dalam 4 format di atas, penggunaan tanda titik dua (:) setelah parameter digunakan untuk menguji parameter bernilai null. Jika tidak digunakan maka hanya menguji parameter yang tidak ditetapkan.
Substring Informant
|
|
POSIX.1-2017
Menampikan panjang karakter string yang merupakan nilai dari parameter. Jika parameter adalah *
atau @ maka output selalu 0. Jika parameter tidak ditetapkan dan set -u
berlaku, ekspansi gagal.
|
|
|
|
Substring Processor
|
|
POSIX.1-2017
Hapus pola dengan suffix terkecil. Untuk menghasilkan suatu pola (atau pattern), string tersebut harus diperluas. Ekspansi parameter kemudian akan menghasilkan parameter dengan bagian terkecil dari suffix (atau akhiran) yang cocok dengan pola yang dihapus.
|
|
POSIX.1-2017
Hapus pola dengan suffix terbesar. Untuk menghasilkan suatu pola (atau pattern), string tersebut harus diperluas. Ekspansi parameter kemudian akan menghasilkan parameter dengan bagian terbesar dari suffix (atau akhiran) yang cocok dengan pola yang dihapus.
|
|
POSIX.1-2017
Hapus pola dengan prefix terkecil. Untuk menghasilkan suatu pola (atau pattern), string tersebut harus diperluas. Ekspansi parameter kemudian akan menghasilkan parameter dengan bagian terkecil dari prefix (atau awalan) yang cocok dengan pola yang dihapus.
|
|
POSIX.1-2017
Hapus pola dengan prefix terbesar. Untuk menghasilkan suatu pola (atau pattern), string tersebut harus diperluas. Ekspansi parameter kemudian akan menghasilkan parameter dengan bagian terbesar dari prefix (atau awalan) yang cocok dengan pola yang dihapus.
Dalam setiap kasus, notasi pencocokan pola (atau pattern matching) dengan
glob
(bukan regular expression) digunakan untuk mengevaluasi pola. Jika parameter adalah #, *,
atau @ maka output ekspansi tidak ditentukan. Jika parameter tidak ditetapkan dan set -u
berlaku,
ekspansi gagal. Menyertakan string ekspansi parameter penuh dalam tanda kutip ganda (") tidak akan
menyebabkan 4 jenis karakter pola (POSIX) di atas dikutip, sedangkan karakter tanda kutip di dalam kurung
memiliki efek ini. Dalam setiap variasi, jika string dihilangkan maka pola kosong digunakan.
|
|
|
|
Capabilities: pvolume pswitch pswitch-joined
Playback channels: Front Left - Front Right
Limits: Playback 0 - 65536
Mono:
Front Left: Playback 39324 [60%] [on]
Front Right: Playback 39324 [60%] [on]
|
|
|
|
|
|
|
|
Ekspansi substring. Perluas hingga panjang karakter nilai dari parameter, mulai dari karakter yang ditentukan
oleh offset. Jika length dihilangkan maka akan diperluas ke substring parameter, mulai dari karakter
yang ditentukan oleh offset, length dan offset adalah ekspresi aritmatika. length harus mengevaluasi
ke angka yang lebih besar dari, atau sama dengan nol. Jika offset mengevaluasi ke angka yang kurang dari nol maka
nilainya digunakan sebagai offset dari akhir nilai parameter. Jika parameter adalah @ maka hasilnya
adalah parameter posisi length yang dimulai dari offset. Jika parameter adalah nama array terindeks yang
disubskrip oleh @ atau * maka hasilnya adalah length anggota array yang diawali dengan ${parameter:offset}
.
offset negatif diambil relatif terhadap satu lebih besar dari indeks maksimum dari array yang ditentukan.
Ekspansi substring yang diterapkan ke array asosiatif menghasilkan output ekspansi tidak ditentukan. Perhatikan
bahwa offset negatif harus dipisahkan dari titik dua (:) setidaknya satu spasi untuk menghindari kebingungan
dengan ekspansi :-
dari substring conditional test. Pengindeksan substring berbasis
0 kecuali jika parameter posisi digunakan, dalam hal ini pengindeksan dimulai dari 1 secara default. Jika offset
adalah nol dan parameter posisi digunakan maka parameter posisi $0 diawali ke daftar.
|
|
|
|
ma
|
|
|
|
|
|
|
|
|
|
|
|
Substitusi pola (atau pattern). Ekspansi parameter dan kecocokan pattern terpanjang terhadap nilainya diganti dengan string. Jika pattern dimulai dengan / maka semua kecocokan pattern yang pertama kali cocok akan diganti dengan string, dan // untuk mengganti semua yang cocok dengan string. Jika pattern dimulai dengan # maka itu harus cocok di awal nilai dari parameter. Jika pattern dimulai dengan % maka itu harus cocok di akhir nilai dari parameter. Jika string adalah null maka kecocokan pattern akan dihapus. Jika parameter adalah @ atau * maka operasi substitusi diterapkan ke setiap parameter posisi secara bergantian dan ekspansi adalah daftar yang dihasilkan. Jika parameter adalah variabel array yang disubskrip dengan @ atau * maka operasi substitusi diterapkan ke setiap anggota array secara bergantian dan ekspansi adalah daftar yang dihasilkan.
|
|
|
|
Unity-Gain - Dekat dengan Pikiranmu
|
|
|
|
|
|
|
|
|
|
|
|
Modifikasi case. Ekspansi ini mengubah case karakter alfabet dalam parameter. Operator ^ mengonversi pencocokan pola (atau pattern matching) yang semula huruf kecil menjadi huruf besar, sedangkan operator , mengonversi huruf besar yang cocok menjadi huruf kecil. Ekspansi ^^, ,,, dan ~~ mengonversi setiap karakter yang cocok, sedangkan ekspansi ^, ,, dan ~ hanya mengonversi karakter pertama dalam nilai dari parameter. Ekspansi ~ dan ~~ untuk mengonversi setiap karakter besar dan kecil menjadi sebaliknya. Jika pattern dihilangkan maka itu diperlakukan seperti ? yang cocok dengan setiap karakter. Jika parameter adalah @ atau * maka operasi modifikasi case diterapkan ke setiap parameter posisi secara bergantian dan ekspansi adalah daftar yang dihasilkan. Jika parameter adalah variabel array yang disubskrip dengan @ atau * maka operasi modifikasi case diterapkan ke setiap anggota array secara bergantian dan ekspansi adalah daftar yang dihasilkan.
|
|
|
|
signum/ii (w/ irus & yousuke saito) - first note
SIGNUM/II (W/ iRUS & yOUSUKE sAITO) - fIRST NOTE
|
|
signum/ii (w/ irus & yousuke saito) - first note
|
|
signum/ii (w/ irus & yousuke saito) - first note
|
|
signum/ii (w/ irus & yousuke saito) - first note
Signum/ii (w/ Irus & Yousuke Saito) - First note
signum/ii (w/ Irus & Yousuke Saito) - First note
|
|
signum/ii (w/ irus & yousuke saito) - first note
SIGNUM/II (W/ IRUS & YOUSUKE SAITO) - FIRST NOTE
signum/ii (w/ irus & yousuke saito) - first note
${!prefix*}
dan
${!name[@]}
tidak akan dibahas lebih lanjut karena lumayan rumit, silahkan lihat manpage bash.
|
|
Brace Expansion
|
|
Selain format di atas, terdapat ekpresi urutan peningkatan (atau incremental sequence expression).
|
|
Di mana x dan y adalah integer atau karakter alfabet tunggal, dan incr adalah nilai dari increment. Ketika bilangan bulat diberikan, ekspresi diperluas ke setiap angka antara x dan y. Bilangan bulat dapat diawali dengan nol untuk memaksa setiap suku memiliki lebar yang sama. Ketika x atau y dimulai dengan nol, shell mencoba untuk memaksa semua yang dihasilkan mengandung jumlah digit yang sama. Ketika karakter alfabet diberikan, ekspresi diperluas ke setiap karakter secara leksikografis antara x dan y. Perhatikan bahwa x dan y harus bertipe data sama. Ketika increment diberikan, itu digunakan sebagai selisih antar setiap angka. Default dari increment adalah 1 atau -1.
|
|
Ekspansi kurung kurawal dilakukan sebelum ekspansi lainnya dan setiap karakter khusus untuk ekspansi lain dipertahankan. Ekspansi kurung kurawal yang ditulis dengan benar harus berisi kurung kurawal buka ({) dan kurung tutup (}), dan setidaknya satu koma tanpa kutip atau ekspresi urutan peningkatan yang valid. Ekspansi kurung kurawal yang salah format dibiarkan tidak berubah. Apakah kalian menggunakannya untuk pathname sama seperti penulis?
|
|
/var/:
cache db empty lib lock log run spool tmp
/var/tmp/:
ccache portage