GNU/Linux >> Belajar Linux >  >> Linux

Tutorial Bash Heredoc Untuk Pemula

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

Linux
  1. Tutorial Bash HereDoc Dengan Contoh

  2. Tutorial perintah cd Linux untuk pemula (8 Contoh)

  3. Tutorial Perintah Tanggal Linux untuk Pemula (8 Contoh)

  1. Tutorial perintah comm Linux untuk pemula (5 contoh)

  2. Tutorial Perintah Linux df untuk Pemula (8 Contoh)

  3. Tutorial Perintah Linux du untuk Pemula (10 Contoh)

  1. Tutorial Perintah gema Linux untuk Pemula (5 Contoh)

  2. Tutorial Perintah Linux env Untuk Pemula (5 Contoh)

  3. Tutorial Perintah ukuran Linux untuk Pemula (6 Contoh)