Ekspansi Bash Shell
Salah satu operasi shell ketika menganalisis input adalah ekspansi Shell. Bash menyediakan berbagai jenis ekspansi. Dalam artikel ini, mari kita tinjau ekspansi penting — “Ekspansi penjepit”.
Artikel ini adalah bagian dari seri Tutorial Bash kami yang sedang berlangsung.
Ekspansi Penjepit
Ekspansi penjepit digunakan untuk menghasilkan string arbitrer. Perluasan kurung memungkinkan Anda membuat beberapa argumen baris perintah yang dimodifikasi dari satu argumen. String yang ditentukan digunakan untuk menghasilkan semua kemungkinan kombinasi dengan preamble dan postscript opsional di sekitarnya. Pembukaan diawali dengan setiap string yang terdapat dalam kurung kurawal, dan postscript kemudian ditambahkan ke setiap string yang dihasilkan, meluas dari kiri ke kanan.
$ echo last{mce,boot,xorg}.log lastmce.log lastboot.log lastxorg.log where last is Preamble and .log is the postscript
Pernyataan gema di atas menghindari Anda untuk menentukan tiga file log secara terpisah. Jika Anda ingin melihat konten log boot terakhir, log mce, dan log xorg, Anda dapat menggunakan ekspansi penjepit seperti yang ditunjukkan pada pernyataan gema di atas.
1. Contoh untuk Pencadangan menggunakan ekspansi brace
$ cat bkup.sh set -x # expand the commands da=`date +%F` cp $da.log{,.bak} $ ./bkup.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log 2010-05-28.log.bak
Dalam skrip cadangan di atas, ia menyalin file log tanggal saat ini dengan ekstensi .bak. Elemen pertama kosong di dalam kurung kurawal, jadi elemen pertama hanya akan memiliki pembukaan.
2. Contoh untuk Restore menggunakan ekspansi brace
$ cat restore.sh set -x # expand the commands da=`date +%F` cp $da.log{.bak,} $ ./restore.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log.bak 2010-05-28.log
Dalam skrip pemulihan, elemen pertama dalam parameter adalah .bak sedangkan elemen kedua kosong.
Juga, lihat artikel kami sebelumnya tentang fungsi bash shell untuk bacaan tambahan.
3. Contoh Brace Expansion tanpa preamble dan postscript
Jika tidak ada preamble dan postscript, itu hanya memperluas elemen yang diberikan dalam kurung.
$ cat expand.sh echo {oct,hex,dec,bin} $ ./expand.sh oct hex dec bin
Tanpa preamble opsional dan string postscript, hasilnya hanyalah daftar spasi dari string yang diberikan
Perluasan untuk Rentang
Ekspansi penjepit juga memperluas urutan. Urutan dapat berupa bilangan bulat atau karakter.
4. Contoh untuk Integer dan urutan karakter
$ cat sequence.sh cat /var/log/messages.{1..3} echo {a..f}{1..9}.txt $ ./sequence.sh May 9 01:18:29 x3 ntpd[2413]: time reset -0.132703 s May 9 01:22:38 x3 ntpd[2413]: synchronized to LOCAL(0), stratum 10 May 9 01:23:44 x3 ntpd[2413]: synchronized to May 9 01:47:48 x3 dhclient: DHCPREQUEST on eth0 May 9 01:47:48 x3 dhclient: DHCPACK from 23.42.38.201 .. .. a1.txt a2.txt a3.txt a4.txt b1.txt b2.txt b3.txt b4.txt c1.txt c2.txt c3.txt c4.txt
Perintah cat pertama, memperluas pesan.1,pesan.2 dan pesan.3 dan menampilkan konten. dan dalam pernyataan gema berikutnya, karakter dan urutan bilangan bulat digabungkan dan digunakan.
Urutan dengan nilai kenaikan
Dalam ekspansi penjepit kshell, Anda dapat menggunakan nilai kenaikan, untuk menghasilkan urutan.
Syntax: <start>..<end>..<incr>
incr adalah numerik. Anda dapat menggunakan bilangan bulat negatif, tetapi tanda yang benar disimpulkan dari urutan awal dan akhir.
5. Contoh penggunaan Increment in sequence
$ ksh $ echo /var/log/messages.{1..7..2} /var/log/messages.1 /var/log/messages.3 /var/log/messages.5 /var/log/messages.7 $
Dengan menggunakan ini, Anda dapat melihat file log hari alternatif.
Perangkap dalam ekspansi Brace
Perluasan kurung kurawal tidak memperluas variabel bash, karena ekspansi kurung kurawal adalah langkah pertama dari ekspansi shell, variabel akan diperluas nanti.
6. Contoh untuk Variabel dalam ekspansi
Jika Anda melihat output dari dua pernyataan for berikut, Anda dapat mengidentifikasi perangkap di atas.
$ cat var_seq.sh # Print 1 to 4 using sequences. for i in {1..4} do echo $i done start=1 end=4 # Print 1 to 4 using through variables echo "Sequences expressed using variables" for i in {$start..$end} do echo $i done $ ./var_seq.sh 1 2 3 4 Sequences expressed using variables {1..4}