GNU/Linux >> Belajar Linux >  >> Linux

Skrip bash:Pindah dari operator backtick ke $ kurung

Ada perintah atau trik tertentu yang mulai Anda gunakan sebagai sysadmin, yang cukup Anda masukkan ke dalam gudang senjata Anda dan tidak pernah benar-benar berhenti untuk menganalisis secara mendalam semua opsi atau alternatifnya.

Bagi saya, salah satu trik itu adalah operator backtick. Saya sering menggunakannya ketika saya memprogram dalam Perl (yang tidak saya gunakan saat ini, tetapi tampaknya masih memiliki klub penggemar setia - periksa polling ini). Dalam skrip Perl saya, saya akan menggunakan operator backtick untuk menjalankan perintah di sistem operasi dan mengembalikan output untuk melanjutkan logika dalam skrip.

[ Anda mungkin juga menyukai: Skrip bash:Cara menulis data ke file teks ]

Operator backtick juga tersedia dalam skrip shell, dan karena sangat mudah untuk digabungkan dengan perintah lain, saya mulai sering menggunakannya. Namun, ada cara yang lebih "disarankan" untuk melakukan hal yang sama, yaitu menggunakan $ operator parens (tanda kurung).

Dalam artikel ini, saya menunjukkan pro dan kontra masing-masing untuk digunakan dalam skrip shell.

Fungsi dasar backtick

Grup Terbuka memiliki definisi untuk operator backtick, yang secara resmi disebut sebagai substitusi perintah. Operator ini bukan karakter kutipan tunggal, tetapi karakter lain yang dikenal sebagai aksen kuburan (` ).

Idenya sederhana:

❯ echo "There are `ls | wc -l` files in this directory"
There are 3 files in this directory

Saya memiliki grup perintah yang sangat sederhana, ls | wc -l yang saya gunakan untuk membuat daftar dan menghitung jumlah file di direktori saat ini. Saya dapat dengan mudah melakukan ini secara interaktif dan melihat dengan tepat apa hasilnya. Kemudian saya dapat menyematkannya di echo utama saya perintah.

Dalam skrip shell, saya pasti bisa melakukan hal yang sama, menugaskan hasil perintah count saya ke variabel dan kemudian menggunakan variabel itu nanti.

❯ file_count=`ls | wc -l`
❯ echo "There are $file_count files in this directory"
There are 3 files in this directory

Dan tentu saja, akan lebih baik jika idenya adalah menggunakan kembali nilai atau jika operasi yang akan dilakukan tidak sesederhana dalam contoh saya.

Menyematkan perintah menggunakan backticks adalah apa yang saya klasifikasikan sebagai "trik cepat dan kotor".

$parens

Anda dapat mencapai hasil yang sama dengan mengganti backtick dengan $ parens, seperti pada contoh di bawah ini:

❯ echo "There are $(ls | wc -l) files in this directory"
There are 3 files in this directory

Berikut contoh lain, masih sangat sederhana tetapi sedikit lebih realistis. Saya perlu memecahkan masalah sesuatu di koneksi jaringan saya, jadi saya memutuskan untuk menunjukkan koneksi total dan menunggu saya menit demi menit.

❯ cat netinfo.sh
#!/bin/bash
while true
do
  ss -an > netinfo.txt
  connections_total=$(cat netinfo.txt | wc -l)
  connections_waiting=$(grep WAIT netinfo.txt | wc -l)
  printf "$(date +%R) - Total=%6d Waiting=%6d\n" $connections_total $connections_waiting
  sleep 60
done

❯ ./netinfo.sh
22:59 - Total=  2930 Waiting=   977
23:00 - Total=  2923 Waiting=   963
23:01 - Total=  2346 Waiting=   397
23:02 - Total=  2497 Waiting=   541

Sepertinya tidak besar perbedaan, kan? Saya hanya perlu menyesuaikan sintaks. Nah, ada beberapa implikasi yang melibatkan kedua pendekatan tersebut. Jika Anda seperti saya, yang secara otomatis menggunakan backticks tanpa berkedip, teruslah membaca.

Penghentian dan rekomendasi

Penghentian terdengar seperti kata yang buruk, dan dalam banyak kasus, kata itu mungkin benar-benar buruk.

Ketika saya meneliti penjelasan untuk operator backtick, saya menemukan beberapa diskusi tentang "apakah operator backtick sudah usang?"

Jawaban singkatnya adalah:Tidak dalam arti "di ambang menjadi tidak didukung dan berhenti bekerja." Namun, backtick harus dihindari dan diganti dengan $ sintaks parens.

Alasan utamanya adalah (tanpa urutan tertentu):

1. Operator Backticks bisa menjadi berantakan jika perintah internal juga menggunakan backticks.

  • Anda harus keluar dari backticks internal, dan jika Anda memiliki tanda kutip tunggal sebagai bagian dari perintah atau bagian dari hasil, membaca dan memecahkan masalah skrip bisa menjadi sulit.
  • Jika Anda mulai berpikir tentang bersarang operator backtick di dalam operator backtick lainnya, semuanya tidak akan berfungsi seperti yang diharapkan atau tidak berfungsi sama sekali. Jangan repot-repot.

2. Kode $ operator parens lebih aman dan lebih dapat diprediksi.

  • Apa yang Anda kode di dalam $ operator parens diperlakukan sebagai skrip shell. Secara sintaksis, ini sama dengan memiliki kode tersebut dalam file teks, jadi Anda dapat mengharapkan bahwa semua yang Anda kodekan dalam skrip shell yang terisolasi akan berfungsi di sini.

Berikut adalah beberapa contoh perbedaan perilaku antara backtick dan $ orang tua:

❯ echo '\$x'
\$x

❯ echo `echo '\$x'`
$x

❯ echo $(echo '\$x')
\$x

Anda dapat menemukan contoh tambahan tentang perbedaan antara backtick dan $ perilaku orang tua di sini.

[ Lembar contekan gratis:Dapatkan daftar utilitas dan perintah Linux untuk mengelola server dan jaringan. ] 

Menutup

Jika Anda membandingkan kedua pendekatan, tampaknya logis untuk berpikir bahwa Anda harus selalu/hanya menggunakan $ pendekatan orang tua. Dan Anda mungkin berpikir bahwa operator backtick hanya digunakan oleh sysadmin dari era yang lebih lama.

Yah, itu mungkin benar, karena terkadang saya menggunakan hal-hal yang telah saya pelajari sejak lama, dan dalam situasi sederhana, "memori otot" saya hanya mengkodekannya untuk saya. Untuk perintah ad-hoc yang Anda tahu tidak berisi karakter jahat, Anda mungkin baik-baik saja menggunakan backticks. Tetapi untuk apa pun yang lebih abadi atau lebih kompleks/canggih, silakan gunakan $ pendekatan orang tua.


Linux
  1. Regenerasi .bashrc Dari Shell Saat Ini?

  2. Bagaimana Membandingkan String di Bash Shell Scripting

  3. Jalankan skrip bash dari URL

  1. Skrip bash(I)

  2. Mencegah skrip bash berjalan secara bersamaan

  3. memulai apachectl dari bash

  1. Bash break:Cara Keluar Dari Loop

  2. [ :Operator tak terduga dalam pemrograman shell

  3. Apakah ada pernyataan goto di bash?