GNU/Linux >> Belajar Linux >  >> Linux

Cara memprogram dengan Bash:Sintaks dan alat

Shell adalah penerjemah perintah untuk sistem operasi. Bash adalah shell favorit saya, tetapi setiap shell Linux menginterpretasikan perintah yang diketik oleh pengguna atau sysadmin ke dalam bentuk yang dapat digunakan sistem operasi. Ketika hasilnya dikembalikan ke program shell, ia mengirimkannya ke STDOUT yang, secara default, menampilkannya di terminal. Semua shell yang saya kenal juga merupakan bahasa pemrograman.

Fitur seperti penyelesaian tab, pemanggilan dan pengeditan baris perintah, dan pintasan seperti alias, semuanya berkontribusi pada nilainya sebagai shell yang kuat. Mode pengeditan baris perintah defaultnya menggunakan Emacs, tetapi salah satu fitur Bash favorit saya adalah saya dapat mengubahnya ke mode Vi untuk menggunakan perintah pengeditan yang sudah menjadi bagian dari memori otot saya.

Namun, jika Anda menganggap Bash hanya sebagai cangkang, Anda kehilangan banyak kekuatan sebenarnya. Saat meneliti kursus belajar mandiri Linux tiga volume (yang menjadi dasar rangkaian artikel ini), saya mempelajari hal-hal tentang Bash yang tidak pernah saya ketahui selama lebih dari 20 tahun bekerja dengan Linux. Beberapa pengetahuan baru ini terkait dengan penggunaannya sebagai bahasa pemrograman. Bash adalah bahasa pemrograman yang kuat, yang dirancang dengan sempurna untuk digunakan pada baris perintah dan skrip shell.

Seri tiga bagian ini mengeksplorasi menggunakan Bash sebagai bahasa pemrograman antarmuka baris perintah (CLI). Artikel pertama ini membahas beberapa pemrograman baris perintah sederhana dengan Bash, variabel, dan operator kontrol. Artikel lainnya membahas jenis file Bash; string, numerik, dan operator logika lain-lain yang menyediakan logika kontrol aliran eksekusi; berbagai jenis ekspansi shell; dan untuk , sementara , dan sampai loop yang memungkinkan operasi berulang. Mereka juga akan melihat beberapa perintah yang menyederhanakan dan mendukung penggunaan alat ini.

Cangkang

Shell adalah penerjemah perintah untuk sistem operasi. Bash adalah shell favorit saya, tetapi setiap shell Linux menginterpretasikan perintah yang diketik oleh pengguna atau sysadmin ke dalam bentuk yang dapat digunakan sistem operasi. Ketika hasilnya dikembalikan ke program shell, ini menampilkannya di terminal. Semua shell yang saya kenal juga merupakan bahasa pemrograman.

Bash adalah singkatan dari Bourne Again Shell karena Bash shell didasarkan pada Bourne shell yang lebih tua yang ditulis oleh Steven Bourne pada tahun 1977. Banyak shell lain yang tersedia, tetapi ini adalah empat yang paling sering saya temui:

  • csh: Shell C untuk programmer yang menyukai sintaks bahasa C
  • ksh: Shell Korn, ditulis oleh David Korn dan populer di kalangan pengguna Unix
  • tcsh: Versi csh dengan fitur yang lebih mudah digunakan
  • zsh: Shell Z, yang menggabungkan banyak fitur shell populer lainnya

Semua shell memiliki perintah bawaan yang melengkapi atau menggantikan perintah yang disediakan oleh utilitas inti. Buka halaman manual shell dan temukan bagian "BUILT-INS" untuk melihat perintah yang diberikannya.

Setiap shell memiliki kepribadian dan sintaksnya sendiri. Beberapa akan bekerja lebih baik untuk Anda daripada yang lain. Saya telah menggunakan cangkang C, cangkang Korn, dan cangkang Z. Saya masih menyukai shell Bash lebih dari mereka. Gunakan salah satu yang paling cocok untuk Anda, meskipun itu mungkin mengharuskan Anda untuk mencoba beberapa yang lain. Untungnya, mengganti shell cukup mudah.

Semua cangkang ini adalah bahasa pemrograman, serta juru bahasa perintah. Berikut tur singkat beberapa konstruksi dan alat pemrograman yang merupakan bagian integral dari Bash.

Bash sebagai bahasa pemrograman

Sebagian besar sysadmin telah menggunakan Bash untuk mengeluarkan perintah yang biasanya cukup sederhana dan lugas. Tetapi Bash dapat melampaui memasukkan perintah tunggal, dan banyak sysadmin membuat program baris perintah sederhana untuk melakukan serangkaian tugas. Program ini adalah alat umum yang dapat menghemat waktu dan tenaga.

Tujuan saya ketika menulis program CLI adalah untuk menghemat waktu dan tenaga (yaitu, menjadi sysadmin yang malas). Program CLI mendukung ini dengan membuat daftar beberapa perintah dalam urutan tertentu yang dijalankan satu demi satu, jadi Anda tidak perlu melihat kemajuan dari satu perintah dan mengetikkan perintah berikutnya ketika yang pertama selesai. Anda dapat melakukan hal lain dan tidak harus terus memantau kemajuan setiap perintah.

Apa itu "program"?

Free On-line Dictionary of Computing (FOLDOC) mendefinisikan program sebagai:"Instruksi yang dijalankan oleh komputer, sebagai lawan dari perangkat fisik tempat mereka dijalankan." WordNet dari Princeton University mendefinisikan sebuah program sebagai:"...urutan instruksi yang dapat ditafsirkan dan dijalankan oleh komputer..." Wikipedia juga memiliki entri yang bagus tentang program komputer.

Oleh karena itu, sebuah program dapat terdiri dari satu atau lebih instruksi yang melakukan tugas tertentu yang terkait. Sebuah instruksi program komputer juga disebut pernyataan program. Untuk sysadmin, sebuah program biasanya merupakan urutan perintah shell. Semua shell yang tersedia untuk Linux, setidaknya yang saya kenal, setidaknya memiliki bentuk dasar kemampuan pemrograman, dan Bash, shell default untuk sebagian besar distribusi Linux, tidak terkecuali.

Meskipun seri ini menggunakan Bash (karena sangat umum), jika Anda menggunakan shell yang berbeda, konsep pemrograman umum akan sama, meskipun konstruksi dan sintaksnya mungkin agak berbeda. Beberapa shell mungkin mendukung beberapa fitur yang lainnya tidak, tetapi mereka semua menyediakan beberapa kemampuan pemrograman. Program Shell dapat disimpan dalam file untuk penggunaan berulang, atau dapat dibuat pada baris perintah sesuai kebutuhan.

Program CLI sederhana

Program baris perintah yang paling sederhana adalah satu atau dua pernyataan program berurutan, yang mungkin terkait atau tidak, yang dimasukkan pada baris perintah sebelum Enter tombol ditekan. Pernyataan kedua dalam sebuah program, jika ada, mungkin bergantung pada tindakan yang pertama, tetapi tidak perlu demikian.

Ada juga sedikit tanda baca sintaksis yang perlu dinyatakan dengan jelas. Saat memasukkan satu perintah pada baris perintah, tekan tombol Enter key mengakhiri perintah dengan titik koma implisit (; ). Ketika digunakan dalam program shell CLI yang dimasukkan sebagai satu baris pada baris perintah, titik koma harus digunakan untuk mengakhiri setiap pernyataan dan memisahkannya dari pernyataan berikutnya. Pernyataan terakhir dalam program shell CLI dapat menggunakan titik koma eksplisit atau implisit.

Beberapa sintaks dasar

Contoh berikut akan memperjelas sintaks ini. Program ini terdiri dari satu perintah dengan terminator eksplisit:

[student@studentvm1 ~]$ echo "Hello world." ;
Hello world.

Itu mungkin tidak tampak seperti sebuah program, tetapi ini adalah program pertama yang saya temui dengan setiap bahasa pemrograman baru yang saya pelajari. Sintaksnya mungkin sedikit berbeda untuk setiap bahasa, tetapi hasilnya sama.

Mari kita kembangkan sedikit tentang program sepele tapi ada di mana-mana ini. Hasil Anda akan berbeda dari saya karena saya telah melakukan eksperimen lain, sementara Anda mungkin hanya memiliki direktori dan file default yang dibuat di direktori home akun saat pertama kali masuk ke akun melalui desktop GUI.

[student@studentvm1 ~]$ echo "My home directory." ; ls ;
My home directory.
chapter25   TestFile1.Linux  dmesg2.txt  Downloads  newfile.txt  softlink1  testdir6
chapter26   TestFile1.mac    dmesg3.txt  file005    Pictures     Templates  testdir
TestFile1      Desktop       dmesg.txt   link3      Public       testdir    Videos
TestFile1.dos  dmesg1.txt    Documents   Music      random.txt   testdir1

Itu sedikit lebih masuk akal. Hasilnya terkait, tetapi pernyataan program individu tidak tergantung satu sama lain. Perhatikan bahwa saya suka memberi spasi sebelum dan sesudah titik koma karena itu membuat kode lebih mudah dibaca. Coba program CLI kecil itu lagi tanpa titik koma eksplisit di akhir:

[student@studentvm1 ~]$ echo "My home directory." ; ls 

Tidak ada perbedaan dalam output.

Sesuatu tentang variabel

Seperti semua bahasa pemrograman, shell Bash dapat menangani variabel. Variabel adalah nama simbolis yang mengacu pada lokasi tertentu dalam memori yang berisi semacam nilai. Nilai suatu variabel dapat diubah, yaitu variabel.

Bash tidak mengetik variabel seperti C dan bahasa terkait, mendefinisikannya sebagai integer, floating point, atau tipe string. Di Bash, semua variabel adalah string. String yang merupakan bilangan bulat dapat digunakan dalam aritmatika bilangan bulat, yang merupakan satu-satunya jenis matematika yang mampu dilakukan Bash. Jika matematika yang lebih kompleks diperlukan, bc perintah dapat digunakan dalam program dan skrip CLI.

Variabel diberi nilai dan dapat digunakan untuk merujuk ke nilai tersebut dalam program dan skrip CLI. Nilai suatu variabel diatur menggunakan namanya tetapi tidak didahului oleh $ tanda. Tugas VAR=10 menyetel nilai variabel VAR menjadi 10. Untuk mencetak nilai variabel, Anda dapat menggunakan pernyataan echo $VAR . Mulai dengan variabel teks (yaitu, non-numerik).

Variabel bash menjadi bagian dari lingkungan shell sampai tidak disetel.

Periksa nilai awal variabel yang belum ditetapkan; itu harus nol. Kemudian tetapkan nilai ke variabel dan cetak untuk memverifikasi nilainya. Anda dapat melakukan semua ini dalam satu program CLI:

[student@studentvm1 ~]$ echo $MyVar ; MyVar="Hello World" ; echo $MyVar ;

Hello World
[student@studentvm1 ~]$

Catatan:Sintaks penugasan variabel sangat ketat. Tidak boleh ada spasi di kedua sisi yang sama (= ) masuk ke pernyataan tugas.

Baris kosong menunjukkan bahwa nilai awal MyVar adalah nol. Mengubah dan mengatur nilai variabel dilakukan dengan cara yang sama. Contoh ini menunjukkan nilai asli dan baru.

Seperti disebutkan, Bash dapat melakukan perhitungan aritmatika bilangan bulat, yang berguna untuk menghitung referensi ke lokasi elemen dalam array atau melakukan masalah matematika sederhana. Ini tidak cocok untuk komputasi ilmiah atau apa pun yang membutuhkan desimal, seperti perhitungan keuangan. Ada alat yang jauh lebih baik untuk jenis perhitungan tersebut.

Berikut perhitungan sederhananya:

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1*Var2))"
Result = 63

Apa yang terjadi ketika Anda melakukan operasi matematika yang menghasilkan bilangan floating-point?

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1/Var2))"
Result = 0
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var2/Var1))"
Result = 1
[student@studentvm1 ~]$

Hasilnya adalah bilangan bulat terdekat. Perhatikan bahwa penghitungan dilakukan sebagai bagian dari gema penyataan. Matematika dilakukan sebelum perintah gema terlampir karena urutan prioritas Bash. Untuk detailnya lihat halaman manual Bash dan cari "precedence."

Operator kontrol

Operator kontrol Shell adalah salah satu operator sintaksis untuk dengan mudah membuat beberapa program baris perintah yang menarik. Bentuk paling sederhana dari program CLI hanya merangkai beberapa perintah secara berurutan pada baris perintah:

command1 ; command2 ; command3 ; command4 ; . . . ; etc. ;

Perintah-perintah itu semua berjalan tanpa masalah selama tidak terjadi kesalahan. Tapi apa yang terjadi ketika terjadi kesalahan? Anda dapat mengantisipasi dan membiarkan kesalahan menggunakan && . bawaan dan || Operator kontrol bash. Kedua operator kontrol ini menyediakan beberapa kontrol aliran dan memungkinkan Anda untuk mengubah urutan eksekusi kode. Titik koma juga dianggap sebagai operator kontrol Bash, seperti karakter baris baru.

&& operator hanya mengatakan, "jika command1 berhasil, jalankan command2. Jika command1 gagal karena alasan apa pun, maka command2 dilewati." Sintaksnya terlihat seperti ini:

command1 && command2

Sekarang, lihat beberapa perintah yang akan membuat direktori baru dan—jika berhasil—jadikan direktori kerja saat ini (PWD). Pastikan direktori home Anda (~ ) adalah PD. Coba ini dulu di /root , direktori yang tidak dapat Anda akses:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir/ && cd $Dir
mkdir: cannot create directory '/root/testdir/': Permission denied
[student@studentvm1 ~]$

Kesalahan dipancarkan oleh mkdir memerintah. Anda tidak menerima galat yang menunjukkan bahwa berkas tidak dapat dibuat karena pembuatan direktori gagal. && operator kontrol merasakan kode pengembalian bukan nol, jadi sentuh perintah dilewati. Menggunakan && operator kontrol mencegah sentuh perintah dari berjalan karena ada kesalahan dalam membuat direktori. Jenis kontrol aliran program baris perintah ini dapat mencegah kesalahan dari peracikan dan membuat kekacauan nyata. Tapi sudah waktunya untuk menjadi sedikit lebih rumit.

|| operator kontrol memungkinkan Anda untuk menambahkan pernyataan program lain yang dijalankan ketika pernyataan program awal mengembalikan kode yang lebih besar dari nol. Sintaks dasarnya terlihat seperti ini:

command1 || command2 

Sintaks ini berbunyi, "Jika command1 gagal, jalankan command2." Itu menyiratkan bahwa jika command1 berhasil, command2 dilewati. Coba ini dengan mencoba membuat direktori baru:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$

Ini persis seperti yang Anda harapkan. Karena direktori baru tidak dapat dibuat, perintah pertama gagal, yang mengakibatkan eksekusi perintah kedua.

Menggabungkan kedua operator ini memberikan yang terbaik dari keduanya. Sintaks operator kontrol menggunakan beberapa kontrol aliran mengambil bentuk umum ini ketika && dan || operator kontrol yang digunakan:

preceding commands ; command1 && command2 || command3 ; following commands

Sintaks ini dapat dinyatakan seperti ini:"Jika command1 keluar dengan kode pengembalian 0, maka jalankan command2, jika tidak jalankan command3." Cobalah:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$

Sekarang coba lagi perintah terakhir menggunakan direktori home Anda alih-alih /root direktori. Anda akan memiliki izin untuk membuat direktori ini:

[student@studentvm1 ~]$ Dir=~/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
[student@studentvm1 testdir]$

Sintaks operator kontrol, seperti command1 &&command2 , berfungsi karena setiap perintah mengirimkan kode pengembalian (RC) ke shell yang menunjukkan apakah itu berhasil diselesaikan atau apakah ada beberapa jenis kegagalan selama eksekusi. Dengan konvensi, RC nol (0) menunjukkan keberhasilan, dan setiap angka positif menunjukkan beberapa jenis kegagalan. Beberapa alat yang digunakan sysadmin hanya mengembalikan satu (1) untuk menunjukkan kegagalan, tetapi banyak yang menggunakan kode lain untuk menunjukkan jenis kegagalan yang terjadi.

Variabel shell Bash $? berisi RC dari perintah terakhir. RC ini dapat diperiksa dengan sangat mudah oleh skrip, perintah berikutnya dalam daftar perintah, atau bahkan sysadmin secara langsung. Mulailah dengan menjalankan perintah sederhana dan segera periksa RC. RC akan selalu untuk perintah terakhir yang dijalankan sebelum Anda melihatnya.

[student@studentvm1 testdir]$ ll ; echo "RC = $?"
total 1264
drwxrwxr-x  2 student student   4096 Mar  2 08:21 chapter25
drwxrwxr-x  2 student student   4096 Mar 21 15:27 chapter26
-rwxr-xr-x  1 student student     92 Mar 20 15:53 TestFile1
<snip>
drwxrwxr-x. 2 student student 663552 Feb 21 14:12 testdir
drwxr-xr-x. 2 student student   4096 Dec 22 13:15 Videos
RC = 0
[student@studentvm1 testdir]$

RC, dalam hal ini, adalah nol, yang berarti perintah berhasil diselesaikan. Sekarang coba perintah yang sama pada direktori home root, direktori yang tidak Anda miliki izinnya:

[student@studentvm1 testdir]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 testdir]$

Dalam hal ini, RC adalah dua; ini berarti izin ditolak untuk pengguna non-root untuk mengakses direktori di mana pengguna tidak diizinkan mengaksesnya. Operator kontrol menggunakan RC ini untuk memungkinkan Anda mengubah urutan eksekusi program.

Ringkasan

Artikel ini melihat Bash sebagai bahasa pemrograman dan menjelajahi sintaks dasarnya serta beberapa alat dasar. Ini menunjukkan cara mencetak data ke STDOUT dan cara menggunakan variabel dan operator kontrol. Artikel berikutnya dalam seri ini membahas beberapa dari banyak operator logika Bash yang mengontrol aliran eksekusi instruksi.


Linux
  1. Bagaimana cara menambahkan akun pengguna DAN kata sandi secara otomatis dengan skrip Bash?

  2. Bagaimana caranya:Riwayat Bash/Shell yang tidak terbatas?

  3. Bagaimana cara menggunakan perintah jam tangan dan pekerjaan bersama di Bash?

  1. Menavigasi shell Bash dengan pushd dan popd

  2. Cara Mengurai Dan Mencetak JSON Dengan Alat Baris Perintah Linux

  3. Cara grep bagian file di bash shell

  1. Tujuan .bashrc Dan Bagaimana Cara Kerjanya?

  2. Bagaimana Cara Mengubah Cron Shell (sh ke Bash)?

  3. Bagaimana Membandingkan String di Bash Shell Scripting