Ekspansi perintah bash

Ekspansi perintah bash

Pada command line atau di dalam skrip shell ada tiga cara dasar perintah berinteraksi satu sama lain. Cara pertama dan kedua adalah melalui file I/O melalui pipa dan lingkungan. Cara ketiga adalah melalui parameter dari suatu perintah. Namun, agar perintah berinteraksi dengan yang lain melalui parameter, perintah itu atau output yang dihasilkannya harus disertakan dalam daftar parameter. Di situlah ekspansi perintah atau substitusi perintah berperan. Di sini kita akan membahas semua yang perlu Anda ketahui tentang substitusi perintah untuk menulis skrip bash seperti bos!

Substitusi perintah

Substitusi perintah adalah fitur shell dasar yang memungkinkan output dari satu atau lebih perintah untuk dieksekusi di tempat dan digunakan seperti ekspansi variabel sebagai argumen untuk ekspansi perintah lain. Dengan kata lain, hasil dari perintah ditempatkan dalam variabel anonim berumur pendek dan diganti dengan perintah di sekitarnya.

Sintaksis

Ada dua sintaks atau cara yang dapat diterima untuk melakukan substitusi perintah di bash:

1) Sintaks tanda dolar; dan
2) Sintaks Backtick.

Pada titik ini, kedua cara disajikan tanpa pendapat saya.

Di alam liar ketika pengembang dipaksa untuk menulis skrip bash, menurut pengalaman saya bahwa satu atau sintaks lainnya digunakan tergantung pada preferensi pribadi.

Sintaks tanda dolar

$( command )

Menurut pendapat saya, sintaks ini lebih mudah dibaca, terutama ketika mengganti perintah bersarang, belum lagi kurang rentan terhadap error.

Contoh 1: substitusi perintah menggunakan sintaks tanda dolar untuk menguji baris dalam file

Sebagian besar lingkungan Linux dengan perintah Coreutils seperti cat dan perintah shuf juga dilengkapi dengan perintah yang disebut wc, yang memungkinkan Anda menghitung byte, kata, dan baris dalam file. Di sini kita akan menggunakannya untuk sekadar menguji apakah file berisi lebih dari sejumlah baris tertentu, lalu lakukan sesuatu.

test ! $( seq 101 | wc -l ) -gt 100 || {
 echo do something
}

Catatan

Ekspresi $( seq 101 | wc -l ) dievaluasi menjadi bilangan bulat 101. Akibatnya, ekspresi pengujian menjadi, test ! 101 -gt 100. Selanjutnya, kita dapat mengambil ! operator pipa dan evaluasi ekspresi uji yang tersisa. Itu adalah. Saya harap Anda akan setuju bahwa tes 101 -gt 100 secara efektif benar. Kami kemudian ditinggalkan dengan ! true di sisi kiri operator daftar ||. ! benar menjadi salah; dan salah || menjadi benar &&. Pada akhirnya, kita dibiarkan dengan gema melakukan sesuatu.

Sintaks backtick

`command`

Jika Anda lebih menyukai backtick daripada uang, bagus! Seperti sifat pengkodean, Anda bebas memilih untuk menulis kode dengan cara apa pun yang Anda inginkan kecuali Anda harus mematuhi beberapa pedoman gaya yang ketat. Saya hanya akan mengatakan bahwa Anda mungkin mengalami kesulitan melakukan substitusi perintah bersarang.

Contoh 2: substitusi perintah menggunakan sintaks backtick untuk menyematkan output perintah bersarang ke dalam perintah echo

Mari kita buat semuanya tetap sederhana dan keluarkan pesan yang menyatakan nama user Anda.

echo my username is `whoami`

Catatan

Jika nama user Anda adalah ‘linuxhint’, perintah di atas akan dievaluasi menjadi “nama user saya adalah linuxhint”.

Sekarang setelah Anda mengetahui cara menggunakan substitusi perintah, mari kita lihat cara menggunakannya.

Bersenang-senang dengan tugas dan substitusi perintah

Seringkali, kami ingin menetapkan variabel output dari sebuah perintah. Ini dapat dicapai dengan menggunakan substitusi perintah.

variable=$( command args... )

Misalnya, dalam pencocokan pola bash kami menetapkan subjek variabel huruf-huruf alfabet sebagai berikut.

perintah

subject=$( echo {z..a} | tr -d ' '  )
echo ${subject}

Keluaran

zyxwvutsrqponmlkjihgfedcba

Nyaman! Apakah Anda tidak senang memiliki substitusi perintah sekarang!

Bersenang-senang dengan fungsi dan substitusi perintah

Mari kita putar fungsi peta kita sendiri yang menghitung jumlah kata yang mengandung huruf a.

Pertama, kita membutuhkan sebuah fungsi yang menguji apakah suatu kata mengandung huruf a. Dalam cuplikan berikut, kami akan menggunakan penggantian pola melalui perluasan parameter dan atribut integer pada penugasan.

perintah

has_a() {
  local instr="${1}"
  local -i match=$( test ! "${instr//a}" != "${instr}" || echo 1 )
  echo ${match}
}

Jika hasil penggantian a dari string input bukan dirinya sendiri sebelum penggantian, kita katakan string input berisi huruf a. Dalam hal ini, kita echo 1. Substitusi perintah yang dihasilkan kemudian dikenakan penugasan dengan atribut integer. Dalam hal penetapan nilai kosong, nilai yang ditetapkan diambil sebagai 0. Artinya, fungsi has_a mengembalikan 0 atau 1 tergantung pada keberadaan huruf a dalam string input.

Berikut adalah tampilan singkat fungsi has_a kami dalam tindakan.

perintah

has_a asdf
has_a sdf
has_a df
has_a f
has_a a

Keluaran

1
0
0
0
1

Selanjutnya, kita membutuhkan fungsi untuk mengulang kata-kata dalam kalimat sambil menerapkan fungsi has_a yang akan kita panggil peta.

perintah

map() {
 test ! ${#} -eq 1 || { true ; return ; }
 local function_name="${1}"
 local first=${2}
 local rest=${@:3}
 echo "$( ${function_name} ${first} ) $( map ${function_name} ${rest} )"
}

Berikut ini sekilas tentang fungsi peta kami dalam tindakan.

perintah

map has_a a b c
map has_a {a..z}{a..z}
map has_a {a..b}{a..b}{a..b}

Keluaran

1 0 0 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0

Sekarang Anda berada dalam matriks!

Yang perlu kita lakukan sekarang adalah menghitung angka 1 yang akan kita sebut jumlah.

sum() {
 test ! ${#} -eq 1 || { echo 0 ; return ; }
 local -i first="${1}"
 local rest=$( sum ${@:2} )
 first+=rest
 echo ${first}
}

Itu harus melakukannya!

Berikut ini adalah tampilan singkat dari fungsi penjumlahan kami.

perintah

sum $( map has_a {a..b}{a..b}{a..b} )
sum $( map has_a {a..z}{a..z} )
sum $( map has_a {a..c}{a..c} )

Keluaran

7
51
5

Lebih menyenangkan dengan tugas: fungsi pengaturan

Saat Anda di sini, mari bersenang-senang dengan tugas menjelajahi apa yang saya suka memanggil fungsi setup, yaitu kita akan membuat fungsi khusus untuk menetapkan nilai ke variabel. Seperti yang Anda ketahui sekarang, kita mungkin perlu menggunakan substitusi perintah. Begini caranya.

perintah

variable() {
 echo 1
}
setup-variable() {
 variable=$( variable )
}
setup() {
 setup-variable
}
main() {
 local variable=0
 setup
 echo ${variable}
}
main
echo ${variable:-empty}

Keluaran

1
empty

Latihan

  1. Tulis ulang perintah pada Contoh 1 tanpa menggunakan operator pipeline !
  2. Tulis ulang perintah dalam Contoh 2 menggunakan sintaks tanda dolar
  3. Tulis fungsi untuk menghitung kata tanpa menggunakan sum, map, dan has_a
  4. Tulis dia mencintaiku bukan memprogram loop itu selamanya
  5. Tulis baris yang menetapkan variabel nilai baris kedua dan kolom ketiga dari file CSV (lihat perintah cut )
  6. Tulis baris yang menetapkan variabel persetujuan skrip (Petunjuk: gunakan xxd)

TLDR;

Dingin! Anda dapat menggunakan ekspansi perintah bash sekarang! Seperti yang Anda harapkan, dapat memperluas kode menjadi perintah sesuai keinginan Anda, memberi Anda pengaruh ketika mencoba memecahkan masalah dunia nyata dengan pemrograman bash selain menghasilkan kode yang dapat digunakan kembali. Kode secara bertanggung jawab.

Terima kasih,

Related Posts