
Hai, habrozhiteli! Buku terlaris internasional "Linux Command Line" akan membantu Anda mengatasi jalur dari klik pemalu pada tombol untuk membuat program lengkap dengan penuh percaya diri untuk versi terbaru dari bash - shell Linux paling populer. Edisi kedua berbicara tentang fitur-fitur baru di bash 4.x, seperti operator redirection baru dan operasi wildcard. Anda akan mempelajari keterampilan baris perintah abadi: menavigasi sistem file, mengatur lingkungan, perintah chaining, dan mencocokkan dengan ekspresi reguler. Anda akan memahami filosofi di balik banyak alat baris perintah, memahami warisan superkomputer yang kaya dari Unix, dan belajar tentang pengetahuan yang dikumpulkan oleh generasi guru yang telah mengecualikan mouse dari gudang alat mereka. Setelah mengatasi "shell shock" pertama, Anda akan memahami betapa alami dan logis cara berinteraksi dengan komputer ini.
Kutipan. Bab 25. Awal dari proyek
Dalam bab ini, kita mulai membuat program. Tujuan dari proyek ini adalah untuk menunjukkan bagaimana Anda dapat menggunakan berbagai kemampuan shell untuk membuat program dan, yang paling penting, untuk membuat program yang
baik .
Selanjutnya kita akan menulis
generator laporan . Ini akan menampilkan berbagai informasi tentang sistem dan statusnya dalam format HTML, sehingga dapat dilihat di browser web.
Biasanya, pembuatan program dilakukan dalam beberapa tahap, di mana masing-masing fungsi dan kemampuan baru ditambahkan. Pada akhir tahap pertama, program kami akan memainkan halaman HTML minimal tanpa informasi apa pun. Kami akan menambahkan informasi ini di langkah selanjutnya.
Tahap Satu: Dokumen Minimum
Pertama-tama, mari kita tentukan seperti apa bentuk dokumen HTML yang terbentuk dengan baik. Ini memiliki bentuk berikut:
<html> <head> <title> </title> </head> <body> . </body> </html>
Jika Anda memasukkan teks ini dalam editor teks dan menyimpannya dalam file bernama
foo.html , kita dapat membukanya dengan memasukkan URL berikut di Firefox:
file: ///home/username/foo.html .
Pada tahap pertama, kami akan membuat program yang akan menampilkan markup HTML ini ke output standar. Menulis program semacam itu sangat sederhana. Buka editor teks dan buat file bernama ~ / bin / sys_info_page:
[me@linuxbox ~]$ vim ~/bin/sys_info_page
Dan kemudian masuk ke program berikut:
#!/bin/bash # echo "<html>" echo " <head>" echo " <title>Page Title</title>" echo " </head>" echo " <body>" echo " Page body." echo " </body>" echo "</html>"
Versi pertama kami berisi baris shebang, komentar (selamat datang) dan urutan perintah gema, satu untuk setiap output baris. Setelah menyimpan file, buat itu dapat dieksekusi dan coba jalankan:
[me@linuxbox ~]$ chmod 755 ~/bin/sys_info_page [me@linuxbox ~]$ sys_info_page
Setelah memulai, teks dokumen HTML akan muncul di layar, karena perintah gema dalam skrip mengirim baris mereka ke output standar. Jalankan lagi program dan arahkan kembali output program ke file
sys_info_page.html , untuk kemudian melihat hasilnya di browser web:
[me@linuxbox ~]$ sys_info_page > sys_info_page.html [me@linuxbox ~]$ firefox sys_info_page.html
Sejauh ini, sangat bagus.
Saat mengembangkan program, Anda harus selalu ingat tentang kesederhanaan dan kejelasan. Pemeliharaan lebih mudah ketika program itu mudah dibaca dan dimengerti, belum lagi fakta bahwa program lebih mudah untuk menulis ketika mungkin untuk mengurangi jumlah input manual. Versi program saat ini berfungsi dengan baik, tetapi dapat disederhanakan. Menggabungkan semua perintah gema menjadi satu pasti akan membuatnya lebih mudah di masa depan untuk menambahkan baris baru ke output program. Karena itu, kami mengubah program seperti yang ditunjukkan di bawah ini:
#!/bin/bash # echo "<html> <head> <title>Page Title</title> </head> <body> Page body. </body> </HTML>"
String yang dikutip dapat menyertakan umpan baris dan, karenanya, berisi beberapa baris teks. Shell akan terus membaca teks sampai menemukan kutipan penutup. Aturan ini juga berlaku pada baris perintah:
[me@linuxbox ~]$ echo "<html> > <head> > <title>Page Title</title> > </head> > <body> > Page body. > </body> > </html>"
Simbol> di awal setiap baris adalah prompt untuk memasukkan shell yang ditentukan oleh variabel PS2-nya. Itu muncul setiap kali instruksi multi-line dimasukkan. Fitur ini masih kabur, tetapi kemudian, ketika kita berkenalan dengan instruksi program multi-line, keuntungannya akan menjadi jelas.
Langkah Dua: Tambahkan Beberapa Data
Sekarang program ini mampu menghasilkan dokumen minimal, tambahkan beberapa data ke dalam laporan. Untuk melakukan ini, buat perubahan berikut:
#!/bin/bash # echo "<html> <head> <title>System Information Report</title> </head> <body> <h1>System Information Report</h1> </body> </html>"
Di sini ditambahkan nama halaman dan judul di badan laporan.
Variabel dan Konstanta
Ada masalah dalam skrip kami. Pernahkah Anda memperhatikan bahwa baris Laporan Informasi Sistem diulang dua kali? Secara umum, untuk skenario sekecil ini, ini bukan masalah besar, tetapi bayangkan skenario yang sangat panjang di mana garis ini diulang berkali-kali. Jika Anda perlu mengubah nama dalam skenario seperti itu, Anda harus membuat perubahan di banyak tempat, dan ini adalah banyak pekerjaan manual. Apakah mungkin untuk mengubah skrip sehingga string didefinisikan di dalamnya hanya sekali? Ini akan sangat menyederhanakan pemeliharaan skrip di masa depan. Ya, ini mungkin, misalnya, seperti ini:
#!/bin/bash # title="System Information Report" echo "<html> <head> <title>$title</title> </head> <body> <h1>$title</h1> </body> </html>"
Dengan membuat
variabel yang disebut judul dan menugaskannya nilai Sistem Informasi Laporan, kami mengambil keuntungan dari penggantian parameter dan menempatkan string di banyak tempat.
Tetapi bagaimana cara membuat variabel? Sederhana - cukup gunakan saja. Ketika shell menemukan variabel, ia secara otomatis membuatnya. Ini berbeda dari banyak bahasa pemrograman di mana variabel harus dinyatakan atau didefinisikan secara eksplisit sebelum digunakan. Shell perintah terlalu liberal dalam hal ini, yang pada akhirnya menyebabkan beberapa masalah. Misalnya, pertimbangkan skrip berikut yang dijalankan pada baris perintah:
[me@linuxbox ~]$ foo="yes" [me@linuxbox ~]$ echo $foo yes [me@linuxbox ~]$ echo $fool [me@linuxbox ~]$
Kami pertama kali menetapkan nilai ya untuk variabel foo dan kemudian mengeluarkan nilainya dengan perintah gema. Selanjutnya, kami mencoba lagi untuk menampilkan nilai variabel, tetapi membuat kesalahan ketik dengan menentukan nama bodoh, dan kami mendapat string kosong. Hasil ini dijelaskan oleh fakta bahwa shell berhasil membuat variabel bodoh setelah menjumpainya dan menetapkannya sebagai nilai default kosong. Dari contoh ini, Anda perlu memantau ejaan dengan cermat! Penting juga untuk memahami apa yang sebenarnya terjadi dalam contoh ini. Dari kenalan sebelumnya dengan fitur mekanisme substitusi, kita tahu itu tim
[me@linuxbox ~]$ echo $foo
dihadapkan pada mekanisme substitusi parameter, yang karenanya mengambil bentuk
[me@linuxbox ~]$ echo yes
Di sisi lain, tim
[me@linuxbox ~]$ echo $fool
berubah menjadi
[me@linuxbox ~]$ echo
Tidak ada yang diganti untuk variabel kosong! Ini dapat menyebabkan kesalahan dalam perintah yang membutuhkan argumen. Sebagai contoh:
[me@linuxbox ~]$ foo=foo.txt [me@linuxbox ~]$ foo1=foo1.txt [me@linuxbox ~]$ cp $foo $fool cp: 'foo.txt' , "cp --help" .
Kami menetapkan nilai ke dua variabel, foo dan foo1. Dan kemudian mereka mencoba mengeksekusi perintah cp, tetapi mereka membuat kesalahan ketik atas nama argumen kedua. Setelah diproses oleh mesin pencarian, perintah cp hanya menerima satu argumen, meskipun membutuhkan dua argumen.
Berikut ini adalah beberapa aturan untuk penamaan variabel:
- Nama variabel dapat terdiri dari karakter alfanumerik (huruf dan angka) dan garis bawah.
- Karakter pertama dalam nama variabel hanya bisa berupa huruf atau garis bawah.
- Kehadiran spasi dan tanda baca dalam nama variabel tidak diperbolehkan.
Variabel nama berarti nilai yang dapat berubah, dan dalam banyak aplikasi, variabel digunakan dengan cara itu. Namun, variabel judul dalam aplikasi kita digunakan sebagai
konstanta . Konstanta, seperti variabel, memiliki nama dan berisi nilai. Satu-satunya perbedaan adalah bahwa nilai konstanta tidak berubah. Dalam aplikasi yang melakukan perhitungan geometrik, Anda dapat menentukan konstanta PI dengan nilai 3,1415, alih-alih menggunakan nomor ini di seluruh program. Shell tidak membedakan antara konstanta dan variabel; Istilah-istilah ini digunakan terutama untuk kenyamanan programmer. Konvensi yang umum adalah menggunakan huruf besar untuk menunjukkan konstanta dan huruf kecil untuk variabel yang sebenarnya. Mari kita ubah skenario agar sejalan dengan konvensi ini:
#!/bin/bash # TITLE="System Information Report For $HOSTNAME" echo "<html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> </body> </html>"
Sepanjang jalan, kami menambah nama dengan menambahkan nilai variabel shell HOSTNAME ke akhir. Ini adalah nama jaringan mesin.
CATATAN
Bahkan, shell memiliki mekanisme untuk menjamin kekekalan konstanta, dalam bentuk perintah mendeklarasikan built-in dengan parameter -r (read-only - read-only). Jika Anda menetapkan nilai ke variabel TITLE seperti yang ditunjukkan di bawah ini:
declare -r TITLE="Page Title"
shell tidak akan membiarkan nilai ditugaskan kembali ke variabel TITLE. Mekanisme ini jarang digunakan dalam praktiknya, tetapi ini tersedia dan dapat digunakan dalam skenario yang sangat ketat.
Menetapkan Nilai untuk Variabel dan Konstanta
Kita sampai pada saat ketika pengetahuan kita tentang fitur-fitur operasi mekanisme substitusi mulai membuahkan hasil. Seperti yang telah kita lihat, menetapkan nilai ke variabel dilakukan seperti ini:
=
di mana
variabel adalah nama variabel dan
nilainya adalah string. Tidak seperti beberapa bahasa pemrograman lain, shell tidak peduli dengan tipe nilai yang ditugaskan ke variabel; dia mengartikan semua nilai sebagai string. Dimungkinkan untuk memaksa shell untuk membatasi rentang nilai yang ditetapkan untuk integer dengan menggunakan perintah mendeklarasikan dengan opsi -i, tetapi seperti mendeklarasikan variabel read-only, fitur ini jarang digunakan dalam praktiknya.
Perhatikan bahwa tidak ada spasi di operator penugasan antara nama variabel, tanda sama dengan, dan nilai. Dan apa artinya terdiri dari? Dari apa pun Anda dapat memperluas menjadi string.
a=z # a "z". b="a string" # . c="a string and $b" # , # , . d=$(ls -l foo.txt) # . e=$((5 * 7)) # . f="\t\ta string\n" # , # .
Dalam satu baris, Anda dapat menetapkan beberapa variabel sekaligus:
a=5 b="a string"
Saat menggunakan substitusi, nama variabel dapat dimasukkan dalam kurung kurawal opsional {}. Ini berguna ketika nama variabel menjadi ambigu dalam konteks sekitarnya. Contoh berikut mencoba mengubah nama
myfile ke
myfile1 menggunakan variabel:
[me@linuxbox ~]$ filename="myfile" [me@linuxbox ~]$ touch $filename [me@linuxbox ~]$ mv $filename $filename1 mv: 'myfile' , "mv --help" .
Upaya ini tidak berhasil karena shell menafsirkan argumen kedua dari perintah mv sebagai nama variabel baru (dan kosong). Berikut ini menunjukkan cara mengatasi masalah ini:
[me@linuxbox ~]$ mv $filename ${filename}1
Dengan menambahkan kurung kurawal, kami memastikan bahwa shell tidak akan menafsirkan karakter terakhir 1 sebagai bagian dari nama variabel.
Catatan
Saat melakukan substitusi, disarankan agar nama dan perintah variabel dilampirkan dalam tanda kutip ganda untuk mencegah shell memecah garis menjadi kata-kata. Sangat penting untuk menggunakan tanda kutip ketika suatu variabel dapat berisi nama file.
Kami akan menggunakan kesempatan ini untuk menambahkan data tambahan ke laporan, yaitu tanggal dan waktu laporan, serta nama pengguna yang membuat laporan:
#!/bin/bash # TITLE="System Information Report For $HOSTNAME" CURRENT_TIME=$(date +"%x %r %Z") TIME_STAMP="Generated $CURRENT_TIME, by $USER" echo "<html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> <p>$TIME_STAMP</p> </body> </html>"
Dokumen Tertanam
Kami melihat dua metode output teks yang berbeda, dan keduanya menggunakan perintah gema. Namun, ada lagi, metode ketiga, yang disebut
dokumen inline (dokumen di sini), atau
skrip inline (skrip di sini). Dokumen yang disematkan adalah bentuk tambahan pengalihan I / O yang meneruskan teks yang disematkan dalam skrip ke input perintah standar. Pengalihan ini berfungsi seperti ini:
<<
di mana
perintah adalah nama perintah yang menerima teks yang ditentukan melalui input standar, dan
indikatornya adalah garis yang menandai akhir teks yang disematkan. Kami akan memodifikasi skenario menggunakan dokumen tertanam di dalamnya:
#!/bin/bash # TITLE="System Information Report For $HOSTNAME" CURRENT_TIME=$(date +"%x %r %Z") TIME_STAMP="Generated $CURRENT_TIME, by $USER" cat << _EOF_ <html> <head> <title>$TITLE</title> </head> <body> <h1>$TITLE</h1> <p>$TIME_STAMP</p> </body> </html> _EOF_
Alih-alih perintah gema, skrip sekarang menggunakan perintah cat dan dokumen yang disematkan. Baris _EOF_ dipilih untuk peran indikator (berarti
end-of-file -
end file , kesepakatan umum), dan menandai akhir teks yang disematkan. Harap dicatat bahwa garis indikator harus dalam garis yang terpisah, satu, dan tidak ada spasi yang harus mengikutinya.
Tapi apa manfaat menggunakan dokumen yang disematkan di sini? Hampir tidak ada, kecuali bahwa tanda kutip di dalam dokumen yang disematkan kehilangan makna khusus mereka untuk shell. Berikut ini adalah contoh penggunaan dokumen yang disematkan pada baris perintah:
[me@linuxbox ~]$ foo="some text" [me@linuxbox ~]$ cat << _EOF_ > $foo > "$foo" > '$foo' > \$foo > _EOF_ some text "some text" 'some text' $foo
Seperti yang Anda lihat, shell perintah tidak memperhatikan tanda kutip. Dia menafsirkannya sebagai karakter biasa. Berkat ini, kami dengan bebas memasukkan tanda kutip ke dalam dokumen yang disematkan. Keadaan ini dapat digunakan saat mengembangkan program pelaporan.
Dokumen tertanam dapat digunakan dengan perintah apa pun yang menerima data dari input standar. Contoh berikut menggunakan dokumen bawaan untuk mengirim urutan perintah ke program ftp untuk mengunduh file dari server FTP jarak jauh:
#!/bin/bash # FTP FTP_SERVER=ftp.nl.debian.org FTP_PATH=/debian/dists/stretch/main/installer-amd64/current/images/cdrom REMOTE_FILE=debian-cd_info.tar.gz ftp -n << _EOF_ open $FTP_SERVER user anonymous me@linuxbox cd $FTP_PATH hash get $REMOTE_FILE bye _EOF_ ls -l $REMOTE_FILE
Jika Anda mengganti operator pengalihan << dengan << -, shell perintah akan mengabaikan karakter tab awal dalam dokumen tertanam. Berkat ini, indentasi dapat ditambahkan ke dokumen yang disematkan agar lebih mudah dibaca:
#!/bin/bash # FTP FTP_SERVER=ftp.nl.debian.org FTP_PATH=/debian/dists/stretch/main/installer-amd64/current/images/cdrom REMOTE_FILE=debian-cd_info.tar.gz ftp -n <<- _EOF_ open $FTP_SERVER user anonymous me@linuxbox cd $FTP_PATH hash get $REMOTE_FILE bye _EOF_ ls -l $REMOTE_FILE
Namun, menggunakan fitur ini tidak selalu nyaman, karena untuk lekukan banyak editor teks (dan programmer sendiri) lebih suka menggunakan karakter spasi daripada tab.
Kesimpulan
Dalam bab ini, kami mulai mengembangkan proyek yang dengannya kami akan melalui semua tahap pembuatan skrip. Kami berkenalan dengan variabel dan konstanta dan fitur penggunaannya. Mereka lebih sering daripada komponen perangkat lunak lain yang digunakan untuk substitusi. Kami juga melihat bagaimana mengatur output informasi dalam sebuah skrip, dan berkenalan dengan berbagai metode menanamkan blok teks.
Tentang penulis
William Shotts adalah pengembang perangkat lunak profesional dengan pengalaman lebih dari 30 tahun yang telah aktif menggunakan sistem operasi Linux selama lebih dari 20 tahun. Ia memiliki pengalaman luas dalam pengembangan perangkat lunak, dukungan teknis, kontrol kualitas, dan dokumentasi penulisan. Dia juga pencipta LinuxCommand.org, sebuah situs pendidikan dan pendidikan yang didedikasikan untuk Linux, di mana berita, ulasan, dan dukungan disediakan menggunakan baris perintah Linux.
Tentang Editor Sains
Jordi Gutiérrez Hermoso adalah seorang programmer komputer, matematikawan, dan peretas etis. Sejak 2002, secara eksklusif menggunakan Debian GNU / Linux, tidak hanya di rumah, tetapi juga di tempat kerja. Jordi terlibat dalam pengembangan GNU Octave, lingkungan komputasi gratis yang sebagian besar kompatibel dengan Matlab, serta Mercurial, sistem kontrol versi terdistribusi. Ia menyukai matematika murni dan terapan, seluncur es, renang, dan rajutan. Baru-baru ini, ia banyak berpikir tentang masalah emisi gas rumah kaca dan ikut serta dalam tindakan untuk menyelamatkan badak.
»Informasi lebih lanjut tentang buku ini dapat ditemukan di
situs web penerbit»
Isi»
KutipanKupon diskon 25% untuk penjaja -
LinuxSetelah pembayaran versi kertas buku, sebuah buku elektronik dikirim melalui email.