Mời các bạn tham khảo Bài giảng Hệ điều hành Linux - Bài 9: Lập trình SHELL sau đây để nắm bắt được những kiến thức về SHELL, trình thông dịch SHELL, cấu hình phiên làm việc, lập trình SHELL.
1 LẬP TRÌNH SHELL Phạm Nguyên Khang, Đỗ Thanh Nghị pnkhang@cit.ctu.edu.vn Nội dung SHELL Trình thơng dịch SHELL Cấu hình phiên làm việc Lập trình SHELL SHELL Tất người dùng khai báo tài khoản + mật Sau đăng nhập vào hệ thống, người dùng giao tiếp với hệ thống (máy tính) Trình thơng dich cho phép người dùng giao tiếp tiếp với hệ thống LINUX gọi SHELL Có nhiều trình thơng dịch SHELL SHELL of BOURNE (sh) AT&T Korn SHELL (ksh) UNIX C SHELL (csh) Berkeley Tenex SHELL (tcsh) Bourne Again SHELL (bash) SHELL SHELL đóng vai trị khác Thơng dịch lệnh (giao tiếp người dùng hệ thống) Tùy chọn phiên làm việc Ngôn ngữ lập trình Trình thơng dịch SHELL Ngun lý: Vịng lặp vơ tận Hiển thị dấu nhắc ($) chờ người dùng gõ lệnh Sau người dùng ấn ENTER, SHELL đọc lệnh từ bàn phím Phân tích cú pháp (kiểm tra lỗi, tách tham số, …) Thay ký tự đại diện/mở rộng tham số (nếu có): SHELL Expansion Thực thi lệnh Ví dụ: SHELL hiển thị dấu nhắc $ đọc bàn phím Người dùng gõ vào ls –l /usr SHELL tách lệnh vừa đọc thành từ ls (tên lệnh) -l /usr (2 tham số lệnh ls) SHELL tạo tiến trình thực thi lệnh ls với tham số chờ tiến trình thực xong Hiển thị lại dấu nhắc $ thế, … Để kết thúc vịng lặp vơ tận này, ta gõ exit Trình thơng dịch SHELL Trích dẫn (quoting) Sử dụng để loại bỏ ý nghĩa đặc biệt số từ ký tự Có chế trích dẫn Ký tự \ (escape character) Bảo toàn ý nghĩa ký tự đứng sau \ Ví dụ \* có nghĩa ký tự * (nếu khơng có \, * hiểu ký tự mở rộng tên file) Ngoại lệ: \ đứng cuối dịng có nghĩa lệnh chưa kết thúc mà viết tiếp dịng phía Cặp nháy đơn ‘…’ Bảo toàn ý nghĩa ký tự bên cặp nháy đơn, dấu nháy đơn không đặt cặp dấu nhay đơn Cặp nháy đôi “…” Bảo toàn ý nghĩa ký tự bên cặp nháy đôi ngoại trừ $, ` \, dấu nháy đơi đặt cặp dấu nháy đơi trước \ Ví dụ: echo “Holmes noi: \“Thoi ta ve\”” cho kết Holmes noi: “Thoi ta ve” Trình thơng dịch SHELL Lệnh Lệnh đơn Tên lệnh danh sách tham số cách khoảng trắng Ví dụ: echo Hello world Ống dẫn (pipeline) |: chuyển đầu chương trình thành đầu vào chương trình Danh sách lệnh Ví dụ: who | wc -l lệnh 1; lệnh (lệnh thực lệnh thực xong) lệnh && lệnh (lệnh thực lệnh kết thúc trả 0) lệnh || lệnh (lệnh thực lệnh kết thúc trả khác 0) Lệnh phức Kết hợp nhiều lệnh đơn lại tạo thành lệnh phức Các cấu trúc rẽ nhánh, vòng lặp, … (xem phần sau) Trình thơng dịch SHELL Hàm Nhóm nhiều lệnh lại với Cú pháp: () { Lệnh Lệnh … } Ta quay lại phần lập trình SHELL Trình thông dịch SHELL Mở rộng lệnh Mở rộng với cặp dấu ngoặc {} Mở rộng với ~ Mở rộng tham số biến Thay lệnh Mở rộng phép toán số học Mở rộng tên tập tin Trình thơng dịch SHELL 10 Mở rộng với cặp dấu ngoặc {} Tương tự phép toán nhân số với tổng Ví dụ: echo 1{a,b,c} cho kết quả: 1a 1b 1c echo {a,b,c}{1,2,3} cho kết quả: a1 a2 a3 b1 b2 b3 Có thể sử dụng dấu muốn liệt kê số ký tự Ví du: echo {1 6} cho kết quả: 123456 echo {1 2} cho kết 135 echo {a d 2} cho kết ad Các cặp dấu ngoặc lồng Ví dụ: echo {a,b{3,5}} cho kết quả: a b3 b5 Cấu hình phiên làm việc 20 Bí danh (alias) Thay lệnh dài tên khác ngắn Ví dụ: alias dir=‘ls –l’ Thực thi: dir (tương đượng lệnh ls) alias ls=‘ls –a’ (định nghĩa lại) dir tương đương với ls -l -a Xem danh sách bí danh alias Kết quả: dir=‘ls -l’ ls=‘ls -a’ Xóa bí danh unalias dir Cấu hình phiên làm việc 21 Lịch sử lệnh (history) Lệnh history liệt kê tất lệnh gõ Có thể dùng phím mũi tên lên/xuống để quay lệnh trước Lập trình SHELL 22 Truyền tham số Gọi thực thi lệnh: … Để lấy giá trị tham số ta sử dụng chức mở rộng tham số: ${thứ tự tham số}, ví dụ $1 hay ${1}, {$12} Tên lệnh = $0 $* tất tham số $@ tương tự $* $# số lượng tham số $? Kết trả lệnh gần $$ pid SHELL shift [n] Bỏ bớt n tham số kể từ 1, mặc định n = Lập trình SHELL 23 Gán tham số Mặc định tham số $1, $2, … $# gán gọi lệnh Ta gán tường minh tham số lệnh set Ví dụ: set a b c Ta có: $1 = a, $2 = b, $3 = c Ví dụ: set `ls` Lập trình SHELL 24 Tập tin script Nhóm lệnh SHELL vào tập tin => tập tin trở thành tập tin khả thi Gồm danh sách lệnh, hàm Dòng phải là: #! /bin/bash Các tập tin phải đọc thực thi (quyền phải lớn 755) Lập trình SHELL 25 Truyền tham số cho script Truyền tham số cho script qua dòng lệnh Lấy giá trị tham số script sử dụng $ Ví dụ: tập tin my_cat có nội dung sau: #!/bin/bash cat $1 Để thực thi, gõ: my_cat /etc/lilo.conf, nội dung tập tin lilo.conf hiển thị Lập trình SHELL 26 Kiểm tra biểu thức logic Lệnh test [ Ví dụ: test = echo $? cho kết test = echo $? Cho kết Các phép toán kiểm tra khác -a file -b file -c file -d file -f file -h file -r file file file file file file file file tồn block file character file tồn thư mục tồn tập tin tồn liên kết mềm tồn đọc Lập trình SHELL 27 Các phép kiểm tra khác (tt) file1 –nt file2 file1 –ot file2 file1 file2 file1 cũ file2 -z string true chiều dài string = -n string string true chiều dài string > string1 = string2 true string1 giống string2 string1 != string2 true string1 khác string2 string1 < string2 String1 > string2 true arg1 OP arg2 so sánh hai số arg1 arg2, OP là: -gt -ge -lt -le -eq -ne lớn lớn nhỏ nhỏ bằng khác Lập trình SHELL 28 Đánh giá biểu thức số học Giống C let “biểu thức” Ví dụ: $((biểu thức)) A=3 echo $A let “A = A + 4” echo $A Ví dụ: echo $((4 * 2)) expr tốn_hạng OP toan_hạng Ví dụ: expr + Các phép toán id++, id , ++id, id +, -, *, /, % **: lũy thừa ~, &, |, ^: phép toán bit : dịch trái, phải , =, ==, != so sánh !, &&, ||: phép toán logic exp1 ? val1: val2 =, +=, *=, !=, …: gán exp1, exp2 Lập trình SHELL 29 Mảng (array) Khai báo [chỉ số]=val1 Hoặc declare –a Gán giá trị cho biến mảng: Truy xuất phần tử mảng: =(val1 val2 … valN) ${ten_bien[chi_so]} Số phần tử mảng: ${ten_bien[*]} Chú ý: Chỉ số tính từ Lập trình SHELL 30 Các lệnh vào, echo “thông báo”: echo –n “thông báo”: read Read TEN_BIEN read -p “Thông báo” Ví dụ: read -p “Ban ten gi: ” NAME echo “Chao ban $NAME” hiển thị thông báo hình hiển thị thơng báo khơng xuống dịng đọc từ bàn phím lưu giá trị vừa đọc vào biến REPLY đọc từ bàn phím lưu giá trị vừa đọc vào biến TEN_BIEN hiển thị thông báo đọc từ bàn phím, lưu giá trị vào biến REPLY Lập trình SHELL 31 Lệnh rẽ nhánh (if) if lệnh kiểm tra then Lệnh fi Ví dụ: if [ -f /etc/passwd ] then cat /etc/passwd Fi Chú ý: điều kiện gọi lệnh kiểm tra trả if lệnh kiểm tra then Lệnh else Lệnh fi if lệnh kiểm tra then Lệnh elif lệnh kiểm tra then Lệnh else Lệnh fi Lập trình SHELL 32 Vòng lặp for bien in danh_sach lệnh done for (( bt1; bt2; bt3 )) lệnh until lệnh kiểm tra lệnh done Ghi chú: lệnh ngăn cách vào dấu ; nên ta viết lệnh gọn sau: done until lệnh kiểm tra ; while lệnh kiểm tra done lệnh done lệnh Lập trình SHELL 33 Các lệnh điều kiện dùng if, while, until sử dụng phép tốn logic, ví dụ: test -x /bin/bash && test /etc/inittab [ -e /bin/bash ] || [ -f /etc/passwd ] Hay: test -x /bin/bash -a -f /etc/inittab [ -e /bin/kbash -o -f /etc/passwd ] break: khỏi vịng lặp for, while, until continue: tiếp tục vòng lặp for, while, until Lập trình SHELL 34 Lệnh case Cú pháp case biến in Th1) lệnh 1;; Th2) lệnh 2;; … Thn) lệnh n;; esac Ghi chú: Các trường hợp danh sách mẫu (pattern) Ví dụ: *.c) *.cc | *.cpp) *) ... dung SHELL Trình thơng dịch SHELL Cấu hình phiên làm việc Lập trình SHELL SHELL Tất người dùng khai báo tài khoản + mật Sau đăng nhập vào hệ thống, người dùng giao tiếp với hệ thống... tính) Trình thơng dich cho phép người dùng giao tiếp tiếp với hệ thống LINUX gọi SHELL Có nhiều trình thơng dịch SHELL SHELL of BOURNE (sh) AT&T Korn SHELL (ksh) UNIX C SHELL (csh)... Tenex SHELL (tcsh) Bourne Again SHELL (bash) SHELL SHELL đóng vai trị khác Thơng dịch lệnh (giao tiếp người dùng hệ thống) Tùy chọn phiên làm việc Ngơn ngữ lập trình Trình thơng dịch SHELL