Saat bekerja dengan skrip Bash, Anda mungkin berakhir dalam situasi di mana Anda harus memproses serangkaian input menggunakan perintah yang sama. Untungnya, ada cara di Bash untuk mencapai ini dengan cara yang lebih optimal menggunakan HereDoc .
HereDoc, singkatan dari Here Document , adalah masukan Pengalihan metode untuk melewatkan beberapa input ke program atau perintah. Konsep heredoc tidak secara eksklusif terkait dengan Bash saja. Banyak bahasa pemrograman populer seperti Perl, Ruby, PHP mendukung heredoc.
Pada artikel ini, kita akan melihat sintaks dan penggunaan heredoc dengan beberapa kasus penggunaan di dunia nyata. Semua contoh dalam artikel ini dibuat sederhana, sehingga bahkan seorang pemula pun dapat memahami konsep ini dengan mudah. Mari bergabung dan mulai bermain dengan heredoc di Bash.
Sintaks HereDoc
Diagram berikut mengilustrasikan sintaks heredoc.
Di sini,
- Perintah - Perintah apa pun (cat, wc, mail, dll.) yang menerima pengalihan.
- Operator Pengalihan (
<<
) - Operator default untuk HereDoc adalah<<
. Ini mengalihkan blok kode ke perintah untuk diproses. - Token Pembatas - Token pembatas menunjukkan awal dan akhir dokumen (blok kode). Token pembatas dapat berupa apa saja tetapi harus identik. Biasanya Anda akan melihat
EOF
digunakan sebagai token pembatas yang berarti "Akhir Aliran File".
Mencetak String MultiLine Menggunakan HereDoc Di Bash
Mari kita mulai dengan contoh sederhana mengarahkan ulang string multiline dan mencetaknya ke terminal.
cat
perintah menerima aliran input dan dengan heredoc, dan Anda dapat mengarahkan kembali blok kode untuk mencetaknya ke terminal.
$ cat << EOF Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF
Keluaran:
Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <==
Perhatikan potongan kode di atas. Saya memiliki tiga baris yang diarahkan ke cat
memerintah. Saya menggunakan EOF
sebagai pembatas. Namun, Anda dapat menggunakan apa pun sesuai keinginan, tetapi tetap membuat pembatas awal dan akhir tetap sama.
Mari kita coba dengan satu contoh sederhana lagi. Saya mengarahkan ulang tiga baris yang sama ke jumlah kata program. Saya menggunakan pembatas yang berbeda (BLK
) di sini.
$ wc -l << BLK Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== BLK
Contoh keluaran:
3
Pengalihan Dan Pipa Di HereDoc
Anda dapat menggabungkan operator pengalihan keluaran dengan heredoc dan mengarahkan keluaran ke file alih-alih mencetaknya ke terminal.
Saya menggunakan contoh yang sama yang saya gunakan di bagian sebelumnya dan mengarahkan output ke file bernama log_op.txt
.
$ cat << EOF > /tmp/log_op.txt Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF
Output heredoc dapat dikirim ke pipa operator untuk diproses lebih lanjut.
$ cat << EOF | grep -i sla Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF
Penindasan Tab Di HereDoc
Ketika ada spasi (tab) putih di blok kode Anda dan jika Anda ingin menyembunyikannya, gunakan "-"
setelah operator pengalihan. Poin penting untuk dicatat adalah bahwa hanya tab yang akan ditekan, bukan spasi.
Lihatlah contoh di bawah ini. Saya telah menambahkan pernyataan bersyarat ke contoh yang sama yang telah kita lihat di bagian sebelumnya. Dua baris pertama di heredoc diberi tab (4) dan baris ketiga diberi spasi (2).
if [[ $x = "err" ]] then cat <<- err_msg 1. Something is wrong with the input file received for today. 2. Contact the downstream team to get it corrected. 3. ==> SLA MISSED <== err_msg fi
Ketika potongan kode dikirimkan, maka output saya adalah sebagai berikut.
1. Something is wrong with the input file received for today. 2. Contact the downstream team to get it corrected. 3. ==> SLA MISSED <==
Seperti yang Anda lihat, tab baris 1 dan 2 disembunyikan, tetapi pada baris 3 karena spasi digunakan, tab tersebut tidak disembunyikan.
Variabel Dan Ekspansi Perintah Di HereDoc
Bukannya Anda hanya dapat melewatkan string di dalam blok kode heredoc. Anda dapat melewati variabel yang ditentukan pengguna dan lingkungan dan menjalankan perintah di dalam blok kode.
Lihatlah contoh di bawah ini. Di dalam blok kode, saya memiliki satu variabel yang ditentukan pengguna "${AUTHOR}"
, satu variabel lingkungan "${SHELL}"
, perintah eksternal "whoami"
.
Ketika cuplikan ini dikirimkan, variabel dan perintah akan diperluas kemudian akan diarahkan ke cat
perintah.
AUTHOR="OSTechNix" cat << EOF Author: ${AUTHOR} # USER DEFINED VARIABLE Article: Bash Heredoc I am using the ${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
Contoh keluaran:
Author: OsTechnix Article: Bash Heredoc I am using the /bin/bash shell karthick
Anda dapat menyertakan pembatas awal dengan tanda kutip tunggal untuk menekan ekspansi di dalam blok kode. Dengan cara ini semua yang ada di dalam blok kode akan diperlakukan sebagai literal string.
cat << 'EOF' Author: ${AUTHOR} # USER DEFINED VARIABLE Article: Bash Heredoc I am using the ${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
Contoh keluaran:
Author: ${AUTHOR} Article: Bash Heredoc I am using the ${SHELL} shell $(whoami)
Komentar MultiLine Dengan HereDoc
Seperti yang mungkin sudah Anda ketahui, Bash tidak mendukung komentar multi-baris. Menggunakan heredoc, Anda dapat membuat komentar multi-baris dengan mengalihkan blok kode ke no-op
perintah (:
).
no-op
adalah bash built-in yang mengambil input dan mengembalikan kode keluar nol. Anda dapat menganggap ini sebagai sinonim dari "true" . bawaan bash yang juga keluar dari kode keluar nol.
: << 'COMMENTS' Author : OStechnix Article : Bash Heredoc BashV : 5.1.4 OS : PoP!_OS COMMENTS
Perhatian: Hampir setiap editor teks memiliki fitur untuk memilih beberapa baris dan memungkinkan Anda untuk berkomentar atau membatalkan komentar menggunakan penekanan tombol. Lebih baik tetap dengan pendekatan ini.
Escape Karakter Khusus Di HereDoc
Blok kode dapat berisi karakter khusus. Jika Anda ingin melarikan diri dari karakter khusus, ada beberapa cara untuk menyelesaikannya.
Anda dapat mengapit pembatas dengan tunggal atau tanda kutip ganda atau garis miring terbalik awalan dengan pembatas. Dengan cara ini semua karakter khusus akan lolos.
# SINGLE QUOTES ESCAPE cat << 'EOF' I am using the ${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
# DOUBLE QUOTES ESCAPE cat << "EOF" I am using the ${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
# BACKSLASH ESCAPE cat << \EOF I am using the ${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
Alih-alih keluar dari semua karakter khusus, Anda juga dapat keluar dari karakter khusus tertentu di dalam blok dengan menambahkan garis miring terbalik sebelum karakter khusus apa pun.
cat << EOF I am using the \${SHELL} shell # ENV VARIABLE $(whoami) # EXTERNAL COMMAND EOF
Contoh keluaran:
I am using the ${SHELL} shell karthick
Kasus Penggunaan HereDoc
Sampai sekarang kita telah melihat konstruksi inti heredoc dan penggunaan dasarnya. Sekarang mari kita lihat beberapa kasus penggunaan di kehidupan nyata. Dalam pengalaman saya, saya telah menggunakan heredoc ketika bekerja dengan ssh, dan klien basis data di mana saya harus menjalankan sekelompok perintah.
Contoh 1:Menjalankan Sebagai Pengguna Berbeda Di Dalam Skrip
Dalam beberapa kasus, Anda mungkin ingin menjalankan bagian tertentu dari kode Anda sebagai pengguna yang berbeda. Dalam hal ini, Anda dapat menggunakan heredoc untuk mengarahkan ulang perintah agar dijalankan sebagai pengguna yang berbeda.
Lihatlah contoh di bawah ini. Saya mengarahkan blok kode ke su
perintah yang akan mengalihkan pengguna ke "ostechnix" dan akan membuat file bernama test jika tidak ada.
su - ostechnix << EOF if [[ ! -f /home/ostechnix/test ]];then touch /home/ostechnix/test echo "File Created" else echo "File exists" fi EOF
Contoh 2:Menggunakan HereDoc dengan Klien DB
Saat Anda ingin menjalankan serangkaian perintah terhadap database, heredoc akan berguna.
Lihatlah contoh di bawah ini. Saya berinteraksi dengan klien MongoDB mongosh dan di dalam heredoc, perintah blok kode diteruskan untuk membuat database baru, mengumpulkan, dan menambahkan dokumen sampel.
mongosh << EOF use ostechnix db.data.insertOne({ "Site" : "OsTechnix", "DB" : "Mongo" }) db.data.find().pretty() EOF
Anda mungkin atau mungkin tidak mengetahui MongoDB tetapi itu tidak masalah. Ini hanya untuk menunjukkan bagaimana menggunakan heredoc untuk berinteraksi dengan klien db. Anda dapat menggunakan klien db seperti MySQL, psql, sqlite tergantung pada database yang Anda gunakan.
Contoh 3:Menjalankan Perintah Jarak Jauh dengan HereDoc dan SSH
Ketika Anda ingin menjalankan perintah melalui server jauh, maka Anda dapat menggunakan heredoc dalam kombinasi dengan ssh
memerintah. Biasanya menggunakan ssh
perintah, Anda dapat menjalankan perintah di server jauh dengan cara berikut.
$ ssh [email protected] "command"
Anda harus mengulangi perintah yang sama lagi dan lagi jika Anda ingin menjalankan lebih banyak perintah di host jarak jauh. Dengan heredoc, Anda dapat mengelompokkan semua perintah dan menjalankannya.
$ ssh -T [email protected] << EOF Command 1... Command 2.. ..... Command N.. EOF
Ketika kode yang sama perlu dieksekusi di beberapa node, Anda dapat menambahkan for loop
bersama heredoc. Saya menggunakan cuplikan pembuatan file yang sama yang telah kita lihat pada contoh pertama.
- Variabel larik "server" menyimpan daftar nama server.
- Untuk pengulangan berulang pada variabel array.
- Perintah pembuatan file diteruskan ke perintah SSH yang akan mengulangi dan membuat file di setiap server. Pastikan Anda menambahkan
-T
tandai ke perintah ssh yang akan menonaktifkan alokasi terminal semu.
declare -a server=( host1 host2 host3 ) for host in ${server[@]} do ssh -T [email protected]${host} << EOF echo "Running at host - ${host}" if [[ ! -f /home/ostechnix/test ]];then touch /home/ostechnix/test echo "File Created" else echo "File exists" fi EOF done
Kesimpulan
Heredoc adalah konsep penting untuk dipahami dan digunakan dalam skrip Bash. Ketika Anda menulis banyak skrip, Anda akan mengetahui lebih banyak tentang heredoc dan cara menggunakannya secara optimal.
Jika Anda belum pernah menggunakan heredoc sebelumnya, mulai terminal dan coba semua cuplikan kode dari artikel untuk mendapatkan pemahaman yang lebih baik.
Bacaan terkait:
- Bash Scripting – Variabel Dijelaskan Dengan Contoh
- Bash Scripting – Fungsi Dijelaskan Dengan Contoh
- Perintah Bash Echo Dijelaskan Dengan Contoh Di Linux
- Skrip Bash – Untuk Pengulangan Dijelaskan Dengan Contoh
- Bash Scripting – Sementara Dan Sampai Perulangan Dijelaskan Dengan Contoh