Hệ điều hành unix - Linux - Chương 8: Lập trình Shell

Chương trình shell là một tập hợp các câu lệnh viết trong một file text

 Nó giống chương trình .bat trong MSDOS nhưng có sức mạnh lớn hơn

nhiều

 Chương trình shell có thể nhận dữ liệu từ người dùng, từ file và in kết quả

ra màn hình

 Có thể dùng ñể tạo ra một lệnh riêng cho mình

 Shell giúp tiết kiệm thời gian ñể làm các công việc hàng ngày

 Các bước ñể tạo ra một chương trình shell

 Sử dụng một chương trình soạn thảo text ñể tạo ra mộtfile chương

trình

 Thay ñổi thuộc tính của file vừa tạo ra thêm thuộc tính khả thi:

chmod +x ./script.sh

 Có thể chạy luôn chương trình bằng lệnh: sh

pdf38 trang | Chia sẻ: Mr Hưng | Lượt xem: 813 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Hệ điều hành unix - Linux - Chương 8: Lập trình Shell, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1Unix operating system - Nguyen Tri Thanh - Sep-10 Hệ ñiều hành UNIX-Linux Chương 8. Lập trình Shell 2Unix operating system - Nguyen Tri Thanh - Sep-10 Chương trình shell  Chương trình shell là một tập hợp các câu lệnh viết trong một file text  Nó giống chương trình .bat trong MSDOS nhưng có sức mạnh lớn hơn nhiều  Chương trình shell có thể nhận dữ liệu từ người dùng, từ file và in kết quả ra màn hình  Có thể dùng ñể tạo ra một lệnh riêng cho mình  Shell giúp tiết kiệm thời gian ñể làm các công việc hàng ngày  Các bước ñể tạo ra một chương trình shell  Sử dụng một chương trình soạn thảo text ñể tạo ra một file chương trình  Thay ñổi thuộc tính của file vừa tạo ra thêm thuộc tính khả thi: chmod +x ./script.sh  Có thể chạy luôn chương trình bằng lệnh: sh script.sh  Các chương trình shell nên ñặt ñuôi là .sh 3Unix operating system - Nguyen Tri Thanh - Sep-10 Trình soạn thảo văn bản trong Linux • Trình soạn thảo vim 4Unix operating system - Nguyen Tri Thanh - Sep-10 Trình soạn thảo văn bản trong Linux • Trình soạn thảo của mc 5Unix operating system - Nguyen Tri Thanh - Sep-10 Các loại shell  Muốn xem các loại shell có trong hệ thống ta sử dụng lệnh: cat /etc/shells  Muốn xem shell hiện tại: echo $SHELL  Phần này chỉ ñề cập ñến lập trình shell trong bash 6Unix operating system - Nguyen Tri Thanh - Sep-10 Các ký hiệu ñặc biệt trong shell Khi ñặt tên biến cần tránh xung ñột với các ký tự ñặc biệt này 7Unix operating system - Nguyen Tri Thanh - Sep-10 Sử dụng biến trong shell  Biến hệ thống ñược Linux tạo ra và quản lý (CHỮ IN HOA)  Biến người dùng: ñược người dùng tạo ra và quản lý (chữ thường) 8Unix operating system - Nguyen Tri Thanh - Sep-10 Quy tắc ñặt tên biến  Tên biến phải bắt ñầu với một ký tự chữ cái hoặc dấu gạch dưới (_), tiếp theo là một hoặc một số ký tự chữ hoặc số  Biến ñược khởi tạo khi ta gán giá trị cho biến  Không thêm các dấu cách vào trước và sau dấu gán, khi gán giá trị cho biến  Biến trong Linux phân biệt chữ HOA thường  Tìm các biến hợp lệ và khong hợp lệ:  no=10  new_variable=“Test”  number= 10  1stnumber=10  Truy cập giá trị của một biến ta dùng ký tự $ trước tên biến, xóa 1 biến sử dụng lệnh unset var  echo $new_variable  Lệnh echo [tùy chọn] [chuỗi, biến] dùng ñể hiển thị văn bản hoặc giá trị của biến ra màn hình  Tùy chọn: -n không hiển thị ký hiệu xuống dòng, -e hiển thị các ký tự ẩn ñặc biệt sau trong chuỗi 9Unix operating system - Nguyen Tri Thanh - Sep-10 Trích dẫn (quoting)  Trích dẫn là cách bao quanh một chuỗi bằng cặp dấu nháy  Cho phép một số ký tự ñặc biệt giữ nguyên như các ký tự bình thường  Có 2 loại trích dẫn mạnh (‘ ’) và trích dẫn yếu (“ ”)  Trích dẫn yếu vẫn biên dịch các biến trong chuỗi  echo “Giá trị của biến là: $var”  Trích dẫn mạnh bảo toàn toàn bộ các ký tự trong chuỗi  echo ‘Giá trị của tham số ñầu tiên là: $var’ → Giá trị của tham số ñầu tiên là: $var  ls -l '[Vv]*‘ → ls: [Vv]*: No such file or directory 10Unix operating system - Nguyen Tri Thanh - Sep-10 Tính toán số học trên các biến  Tính toán trong shell ñược thực hiện với các ñối số nguyên  Các phép toán gồm có: cộng (+), trừ (-), nhân (*), chia (/), mod (%)  Tính toán trên shell có dạng:  `expr `  Ví dụ var1=10 var2=20 sum=`expr $var1 + $var2 ` product=`expr $var1 \* $var2 ` echo “Tổng của $var1 và $var2 là: $sum, tích của chúng là $product” 11Unix operating system - Nguyen Tri Thanh - Sep-10 Tham số dòng lệnh trong chương trình shell  Là tham số ñược truyền vào cho chương trình trên dòng lệnh  Dùng ñể thông báo cho chương trình các tùy chọn, file cần xử lý  rm test.txt  ls –a /usr/local  myshell 10 30  Truy cập các tham số dòng lệnh thông qua các biến hệ thống $1, , $9  echo $1 # hiển thị 10  echo $2 # hiển thị 30  Tổng số tham số trả lại qua biến $#, toàn bộ tham số thông qua $* hay $@, biến $0 trả lại tên chương trình  echo "Total number of command line argument are $#“  echo "$0 is script name“  echo "$1 is first argument“  echo "$2 is second argument“  echo "All of them are :- $* or $@" 12Unix operating system - Nguyen Tri Thanh - Sep-10 Tham số dòng lệnh trong chương trình shell (tiếp)  Làm sao truy cập các tham số có số thứ tự > 9?  Truy xuất thông qua $@ hay $*  Dùng lệnh shift  shift sẽ gán lại giá trị của các tham số vị trí bằng cách dịch trái giá trị của danh sách các biến  $1 <--- $2, $2 <--- $3, $3 <--- $4, ...  Ví dụ echo “Giá trị của tham số thứ nhất là: $1” shift echo “Giá trị của tham số thứ 2 là: $1”  Kết quả trả về khi truyền vào cho chương trình tham số: 3 6 5 ? 13Unix operating system - Nguyen Tri Thanh - Sep-10 Giá trị logic trong shell  Ngược với C hay các ngôn ngữ lập trình thông dụng, trong shell giá trị 0 nghĩa là true còn giá trị khác 0 là false  Giá trị logic là một giá trị quan trọng trong các cấu trúc ñiều khiển  Giá trị logic trong bc 14Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc chương trình shell  Là một tập hợp các lệnh và các cấu trúc ñiều khiển  Mỗi lệnh ñược viết trên 1 dòng  Chú thích trong chương trình là phần nằm sau dấu #  Dòng chú thích ñầu tiên trong file chương trình shell sẽ báo cho hệ thống chọn shell (chương trình) nào ñể thực hiện chương trình (ngầm ñịnh là shell hiện tại)  #!/bin/bash  #!/usr/bin/perl  #!/bin/csh  #!/bin/rm ñiều gì sẽ xảy ra??? 15Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc ñiều khiển if  ðiều kiện if ñược sử dụng ñể ñưa ra các quyết ñịnh trong chương trình shell  Nếu ñiều kiện ñược cung cấp là ñúng thì các lệnh trong ñó ñược thực thi  ðiều kiện là một phép so sánh giữa 2 giá trị, một lệnh kiểm tra hay kết quả trả về của 1 chương trình  Cấu trúc if ñiều_kiện then #Khối ệnh sẽ ñược thực hiện nếu ñiều_kiện là ñúng fi  Ví dụ: if cat $1 then echo -e "\n\nFile $1, found and successfully echoed" fi  Trong linux các lệnh thường trả về trạng thái thành công hay lỗi, nếu thành công thì trả về giá trị 0, nếu bị lỗi thì sẽ trả về mã lỗi khác 0 16Unix operating system - Nguyen Tri Thanh - Sep-10 Lệnh test hay []  ðược dùng ñể kiểm tra xem một biểu thức ñúng (0) hay sai (0)  Cú pháp  test biểu_thức  [ biểu_thức ]  Ví dụ: if test $1 -gt 0 then echo "$1 number is positive" fi if [ $1 -lt 0 ] then echo "$1 number is negative" fi 17Unix operating system - Nguyen Tri Thanh - Sep-10 Các toán tử số học trong chương trình shell 18Unix operating system - Nguyen Tri Thanh - Sep-10 Các toán so sánh chuỗi  Sử dụng toán tử so sánh chuỗi trong toán tử [[ ]] if [[ $1 != "-c" ]] ; then echo "The first argument must be -c!" fi if [[ -z $2 ]]; then echo “Missing the second argument!” fi Ví dụ 19Unix operating system - Nguyen Tri Thanh - Sep-10 Các toán tử kiểm tra file/thư mục  Chương trình hiển thị nội dung của 1 file nếu nó khác rỗng if [[ -f $1 ]] ; then if [[ -s $1 ]]; then cat $1 fi fi Ví dụ 20Unix operating system - Nguyen Tri Thanh - Sep-10 Các toán tử logic  Chương trình hiển thị nội dung của 1 file nếu nó khác rỗng if [[ -n $1 ]] ; then if [ -s $1 –a –f $1 ]; then cat $1 fi fi Ví dụ 21Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc rẽ nhánh if else fi  Nếu ñiều kiện ñúng thì thực hiện khối lệnh thứ nhất, nếu không thì thực hiện khối lệnh thứ 2 if test $1 -gt 0 then echo "$1 number is positive" else echo "$1 number is negative" fi Ví dụ if ñiều_kiện ; then Khối_lệnh_1 else Khối_lệnh_2 fi 22Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc if then else fi ña mức  Rất hiệu quả khi phải kiểm tra nhiều trường hợp/giá trị của 1 biến if [ $1 -gt 0 ]; then echo "$1 is positive" elif [ $1 -lt 0 ]; then echo "$1 is negative" elif [ $1 -eq 0 ]; then echo "$1 is zero" else echo "Opps! $1 is not number, give number" fi  Ví dụ if ñiều_kiện_1 ; then Khối_lệnh_1 elif ñiều_kiện_2 ; then Khối_lệnh_2 else Khối_lệnh_n fi 23Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc lựa chọn  Cấu trúc case expr in pattern1 ) Khối lệnh 1 ;; pattern2 ) Khối lệnh 2 ;; * ) Khối lệnh n ;; esac  expr ñược ñem ñi so sánh với từng pattern, nếu nó bằng nhau thì các lệnh tương ứng sẽ ñược thi hành  Dấu ;; là tương ñương với lệnh break của C, tạo ra ñiều khiển nhảy tới dòng ñầu tiên sau mã esac  Không như từ khoá switch của C, lệnh case của bash cho phép ta kiểm tra giá trị của expr dựa vào pattern, nó có thể chứa các kí tự ñại diện *, ?  Biểu thức *) có ý nghĩa như nhãn default trong lệnh switch của C 24Unix operating system - Nguyen Tri Thanh - Sep-10 Ví dụ lệnh case  Lệnh read var sẽ ñọc giá trị nhập vào từ bàn phím, sau khi ấn Enter và lưu giữ vào biến var echo; echo "Hit a key, then hit return." read Keypress case "$Keypress" in [a-z] ) echo "Lowercase letter";; [A-Z] ) echo "Uppercase letter";; [0-9] ) echo "Digit";; * ) echo "Punctuation, whitespace, or other";; esac # Allows ranges of characters in [square brackets]. 25Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc lặp for  Lặp ñi lặp lại 1 số lần một khối lệnh nào ñó for i in 1 2 3 4 5 do echo "Welcome $i times" done  Ví dụ for variable in danh_sách do # Khối lệnh thao tác với giá trị của $variable done  In ra bảng nhân của 1 số n=$1 for i in 1 2 3 4 5 6 7 8 9 10 do echo "$n * $i = `expr $i \* $n`" done 26Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc lặp for  Lặp ñi lặp lại 1 số lần một khối lệnh nào ñó for (( i = 0 ; i <= 5 ; i++ )) do echo "Welcome $i times" done Ví dụ for (( expr1; expr2; expr3 )) do # Thực hiện khối lệnh cho ñến khi expr2 có giá trị TRUE done 27Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc lặp while  Lặp ñi lặp lại một khối lệnh nào ñó trong khi biểu thức ñiều kiện có giá trị TRUE n=$1 i=1 while [ $i -le 10 ] do echo "$n * $i = `expr $i \* $n`" i=`expr $i + 1` done  Ví dụ while ñiều_kiện do #Khối lệnh ñược thực hiện khi ñiều_kiện là TRUE done 28Unix operating system - Nguyen Tri Thanh - Sep-10 Cấu trúc lặp until  Lặp ñi lặp lại một khối lệnh nào ñó trong khi biểu thức ñiều kiện có giá trị FALSE until [[ "$var1" = end ]] do echo "Input variable #1 " echo "(end to exit)" read var1 echo "variable #1 = $var1" done  Ví dụ until ñiều_kiện do #Khối lệnh ñược thực hiện khi ñiều_kiện là FALSE done 29Unix operating system - Nguyen Tri Thanh - Sep-10 ðường ống (Pipe)  ðường ống là cách ñể ñưa ñầu ra của một chương trình thành dữ liệu ñầu vào của một chương trình khác mà không cần qua một file trung gian  ðường ống thực chất là một vùng bộ nhớ tạm thời, nơi lưu trữ ñầu ra của một lệnh và sau ñó chuyển chúng cho ñầu vào của lệnh thứ hai  Lệnh_1 | Lệnh_2  ls | sort  ls | sort | less 30Unix operating system - Nguyen Tri Thanh - Sep-10 Thay thế biến (variable substitution)  Thao tác và mở rộng biến 31Unix operating system - Nguyen Tri Thanh - Sep-10 Ví dụ option=$1 var=${option:-”20”} echo $var option=$1 var=${option:=”20”} echo $var  Kết quả trả về khi $1 không xác ñịnh và $1 có giá trị là 10? 32Unix operating system - Nguyen Tri Thanh - Sep-10 Các toán tử string (tiếp) 33Unix operating system - Nguyen Tri Thanh - Sep-10 Ví dụ về các toán tử pattern -matching #!/bin/bash myfile=/usr/src/linux/Documentation/ide.txt echo ‘${myfile##*/}=’ ${myfile##*/} echo ‘basename $myfile =’ $(basename $myfile) echo ‘${myfile%/*}=’ ${myfile%/*} echo ‘dirname $myfile =’ $(dirname $myfile)  Lệnh thứ 2 xoá xâu matching “*/” dài nhất trong tên file và trả về tên file.  Lệnh thứ 4 làm khớp tất cả mọi thứ sau “/”, bắt ñầu từ cuối biến, bỏ tên file và trả về ñường dẫn của file  Kết quả của tập lệnh này $ ./pattern.sh ${myfile##*/} = ide.txt basename $myfile = ide.txt ${myfile%/*} = /usr/src/linux/Documentation dirname $myfile = /usr/src/linux/Documentation 34Unix operating system - Nguyen Tri Thanh - Sep-10 Thay thế lệnh  Dùng ñể gán kết quả trả về của 1 lệnh làm tham số cho 1 lệnh khác hay cho 1 biến  Câu lệnh cần lấy kết quả ñược bao trong cặp (` `)  rm `cat danh_sach_file_can_xoa.txt`  script_name=`basename $0`  echo "The name of this script is `basename $0`."  textfile_listing=`ls *.txt`  echo $textfile_listing 35Unix operating system - Nguyen Tri Thanh - Sep-10 ðịnh hướng lại các thiết bị ñầu vào/ra chuẩn  Hầu hết tất cả các lệnh hiển thị kết quả ñầu ra ra màn hình, và lấy dữ liệu ñầu vào từ bàn phím  Có thể gửi kết quả ñầu ra ra file cũng như ñọc ñầu vào từ file bằng cách sử dụng ñịnh hướng lại (redirect)  Ghi kết quả của 1 lệnh ra 1 file (thay vì màn hình)  Lệnh > tên_file_ñầu_ra  ls > danh_sach_file  ðịnh hướng ñầu vào  Lệnh < tên_file_ñầu_vào  cat < a.txt  sort a.sorted.txt  tr “[a-z]” “[A-Z]” b.txt 36Unix operating system - Nguyen Tri Thanh - Sep-10 ðịnh hướng ñầu vào vào khối lệnh  ðưa dữ liệu vào 1 khối lệnh  Có thể lấy dữ liệu từ 1 file filename=“dulieu.txt” name=“” while `true` do read name # ðọc từ file thay vì từ bàn phím echo $name if [[ "$name" = Smith ]] then break fi done <"$filename" 37Unix operating system - Nguyen Tri Thanh - Sep-10 Thủ tục / hàm trong chương trình shell  ðịnh nghĩa hàm  function_name(){ #Nội dung hàm }  Muốn hàm trả về giá trị ta dùng lệnh return  Trong hàm có thể truy cập biến toàn cục  Muốn tạo biến cục bộ trong hàm ta dùng từ khóa local  Gọi hàm bằng cách sử dụng tên hàm  Có thể truyền tham số cho hàm  Khi gọi hàm truyền theo tham số  Trong hàm truy cập các tham số thông qua các biến vị trí function1(){ echo “This is the first argument $1” } function1 ARGUMENT 38Unix operating system - Nguyen Tri Thanh - Sep-10 Danh sách lệnh  ðể chạy tuần tự một dãy lệnh trên 1 dòng lệnh ta phân cách giữa các lệnh dấu ;  Danh sách lệnh AND  Các lệnh ñược phân cách nhau bởi dấu &&  Lệnh ñằng sau chỉ ñược thực hiện khi tất cả các lệnh trước nó ñều trả về giá trị TRUE  cat a.txt && rm a.txt  Danh sách lệnh OR  Các lệnh ñược phân cách bởi dấu ||  Lệnh sau chỉ ñược thực hiện khi tất cả các lệnh ñứng trước nó trả về giá trị FALSE  cat a.txt || touch a.txt  Danh sách lệnh AND và OR có thể thay thế cho cấu trúc if - then

Các file đính kèm theo tài liệu này:

  • pdfbai_giang_8_2688.pdf
Tài liệu liên quan