Tìm hiểu về lập trình shell trên linuxproject 2

45 30 0
Tìm hiểu về lập trình shell trên linuxproject 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Tìm hiểu lập trình shell Linuxproject_2 Mục lục Lời mở đầu Shell Unix, Linux .4 Sử dụng shell ngôn ngữ lập trình …………………………………….6 2.1 Điều khiển shell từ dịng lệnh .7 2.2 Điều khiển shell ngôn ngữ tập kịch ………………………… 2.3 Thực thi script Cú pháp ngôn ngữ shell 3.1 Sử dụng biến 3.1.1 Các ký tự đặc biệt shell ………………………………… 10 3.1.2 Biến môi trường ……………………………………………… 13 3.2 Điều kiện ……………………………………………………………… 15 3.2.1 Lệnh test [ ] …………………………………………… 16 3.3 Cấu trúc điều khiển …………………………………………………… 17 3.3.1 Lệnh if ……………………………………………………… 17 3.3.2 Lệnh elif ……………………………………………………… 17 3.3.3 Lệnh for ……………………………………………………….18 3.3.4 Lệnh while …………………………………………………….19 3.3.5 Lệnh case 20 3.4 Danh sách shell thực lệnh (list) ………………………………… 21 3.4.1 Danh sách AND (&&) 23 3.4.2 Danh sách OR ( | | ) 23 3.4.3 Khối lệnh 24 3.5 Hàm .25 3.5.1 Biến cục biến toàn cục ………………………………… 26 3.5.2 Hàm cách truyền tham số .27 3.6 Các lệnh nội shell ……………………………………………… 29 3.6.1 Lệnh break .29 3.6.2 Lệnh continue ………………………………………………… 30 3.6.3 Lệnh rỗng …………………………………………………… 31 3.6.4 Lệnh eval …………………………………………………… 32 3.6.5 Lệnh exit n .32 3.6.6 Lệnh export 32 Tìm hiểu lập trình shell Linuxproject_2 3.6.7 Lệnh expr 33 3.6.8 Lệnh printf .34 3.6.9 Lệnh shift 35 3.6.10 Lệnh unset .36 Dò lỗi (debug) script 37 Hiển thị màu chữ ……………………………………………………………… 38 5.1 Màu chữ 39 5.2 Thuộc tính văn .39 5.3 Màu 39 Kết chương …………………………………………………………………….41 Tài liệu tham khảo ……………………………………………… 42 Lời mở đầu Hiện thời đại khoa học kỹ thuật phát triển, bên cạnh phát triển phần mềm mã quyền, phần mềm mã nguồn đóng phần mềm mã nguồn mở có bước phát triển mạnh mẽ Càng ngày có nhiều người tham gia vào thiết kế, lập trình mã nguồn mở Việc phần mềm mã nguồn mở tung tồn chương trình lên mạng làm cho phần mềm mã nguồn mở dễ dàng tiếp cận với người, dễ dàng phát triển hơn, cộng đồng đóng góp chung sức phát triển Sự phát triển phần mềm mã nguồn mở, nảy sinh vấn đề phải có cơng cụ lập trình thích hợp tảng mã nguồn mở hệ điều hành linux, unix Trước u cầu xuất cơng cũ lập trình hiệu lập trình shell Để hiểu rõ ngơn ngữ shell, em xin trình bày báo cáo “Lập trình shell Linux” Shell UNIX/Linux Mọi thứ thực Linux tiến trình Vậy tạo tiến trình ? Cách thứ viết chương trình mà chương trình biết cách tạo tiến trình (C/C++) Tuy nhiên cách đòi hỏi nhiều hiểu biết nỗ lực Cũng hệ điều hành làm việc kiểu ảo khác, Linux hổ trợ phương tiện xử lí lệnh làm giao diện lệnh máy (mà người dùng đưa vào) việc thực thi lệnh (bởi Unix) Phương tiện gọi shell Từ đời Linux có vài kiểu shell, Bourne, C, Korn shell Thực shell làm ? Tồn mục đích shell để khởi động tiến trình xử lí lệnh đưa vào: u cầu đưa (dịng) lệnh vào, đọc đầu vào, thơng dịch dịng lệnh đó, tạo tiến trình để thực lệnh Nói cách khác shell qt dịng lệnh đưa vào máy tính, cấu hình mơi trường thực thi tạo tiến trình để thực lệnh Như tìm hiểu shell thực tế học ngôn ngữ lập trình, cho dù khơng phức tạp C, hay ngơn ngữ khác, phải qua địi hỏi cần thiết Trong Unix/Linux có lọai shell khác lựa chọn để dùng theo nhu cầu mà người dùng thấy phù hợp Hình mơ hình tương tác shell, chương trình ứng dụng, hệ X-Window hạt nhân Hình Linux/Unix tách biệt ứng dụng, lệnh gọi hàm chức nhân thành đơn thể nhỏ (tiến trình) Tuy nhiên, nhiều lệnh Linux kết hợp lại với để tạo nên chức tổng hợp mạnh mẽ Ví dụ: $ls -al | more lệnh kết hợp hai lệnh, ls liệt kê toàn danh sách tệp thư mục đĩa hình, danh sách dài, ls chuyển liệu kết xuất cho lệnh more xử lý hiển thị kết thành trang hình Linux có cách kết hợp liệu kết xuất lệnh với thông qua chế chuyển tiếp (redirect), ống dẫn (pipe) Kết hợp lệnh với dòng lệnh không chưa đủ Nếu muốn tổ hợp nhiều lệnh đồng thời với tùy vào điều kiện, kết xuất lệnh, mà có ứng xử thích hợp sao? Lúc dùng đến cấu trúc lập trình rẽ nhánh if, case Trường hợp bạn muốn thực thao tác vòng lặp, phải dùng lệnh for, while Shell trình diễn dịch cung cấp cho người dùng khả Hầu hết Shell Unix/Linux sử dụng ngôn ngữ gần giống với C (điều dễ hiểu giới Unix/Linux, C ngôn ngữ lập trình thống trị) Ngơn ngữ Shell giống C lập trình viên hay người điều khiển Linux cảm thấy thân thiện với HĐH Hệ thống cung cấp cho người dùng nhiều chương trình shell Mỗi shell có số tiện ích hỗ trợ chế độ gõ phím, ghi nhớ lệnh Kết hợp tiện ích shell để tạo chương trình chạy được, chương trình lưu dạng tệp, gọi tệp kịch (script, thử mở tệp quan sát cấu trúc tệp) Viết tệp script, thực chất lập trình theo shell Một quen thuộc với shell cách hoạt động shell đó, người dùng làm chủ shell khác cách để dàng Các shell Unix/Linux: Sh (Bourne) Shell nguyên thủy áp dụng cho linux, dòng shell sử dụng cấu trúc lệnh C làm ngôn ngữ kịch Được Csh, tcsh zsh tạo Bia Joy Là shell thông dụng thứ sau bash shell bash Shell chủ yếu linux Ra đời từ dự án GNU bash (viết tắt Bourne Again Shell có lợi mã nguồn cơng bố rộng rãi Nếu bash chưa có sẵn hệ thống linux, tải về, sử dụng biên dịch miễn phí địa www.gnu.org rc Shell mở rộng csh với nhiều tương thích với ngơn ngữ C rc đời từ dự án GNU Shell chuẩn thường nhà phân phối Linux sử dụng bash shell Khi cài đặt Linux, trình cài đặt thường mặc định bash shell khởi động Tìm hiểu lập trình shell Linuxproject_2 Có thể tìm thấy chương trình shell thư mục /bin với tên chương trình bash bash đơi chương trình nhị phân đơi script gọi đến liên kết nhị phân khác Có thể dùng lệnh file để xem bash tập tin nhị phân hay script sau: $ file /bin/bash /bin/bash: ELF 32-bit LSB executable Intel 80386 kết kết xuất dạng ELF có nghĩa bash chương trình nhị phân Tuy bash shell sử dụng phổ biến Linux, ví dụ lập trình sử dụng ngơn ngữ lệnh shell sh sh shell ngun thủy, chạy Unix Bằng lệnh file ta thấy hầu hết Linux sh liên kết đến bash mà thơi Ví dụ: $ file /bin/sh /bin/sh: symbolic link to bash điều có nghĩa bash hồn tồn diễn dịch điều khiển lệnh shell sh Sử dụng shell ngơn ngữ lập trình 2.1 Điều khiển shell từ dòng lệnh Chúng ta bắt đầu, giả sử đĩa cứng có nhiều file mã nguồn.c, bạn muốn truy tìm hiển thị nội dung tệp nguồn chứa chuỗi main() Thay vị dùng lệnh grep để tìm file sau dùng lệnh more để hiển thị file, ta sử dụng lệnh shell sau: $ for file in * if grep -l 'main( ) ' $file then more $fỉle fi done Khi gõ lệnh chưa hoàn chỉnh từ dấu nhắc shell, shell chuyển dấu nhắc thành >, shell chờ nhập đầy đủ lệnh trước thực tiếp shell tự trạng hiểu lệnh bắt đầu kết thúc Trong ví dụ lệnh for, kết thúc done Khi gõ xong done, shell bắt đầu thực thi tất gõ vào for Ở đây, file biến shell, * tập hợp đại diện cho tên tệp tìm thấy thư mục hành Tìm hiểu lập trình shell Linuxproject_2 Bất tiện việc điều khiển ngơn ngữ shell từ dịng lệnh khó lấy lại khối lệnh trước để sửa đổi thực thi lần Nếu ta nhấn phím Up/Down shell trả lại khối lệnh sau: $ for file in * ; ; if grep -1 'main( )’ $file; then ; more $file; fi; done Đây cách shell Linux thường làm phép thực thi nhiều lệnh lúc dòng lệnh Các lệnh cách dấu (;) Ví dụ: $ mkdir myfolder; cd myfolder; tạo thư mục myfolder lệnh mkdir sau chuyển vào thư mục lệnh cd Chỉ cần gõ Enter lần để thực thi hai lệnh lúc Tuy nhiên sửa chữa khối lệnh không dễ dàng dễ gây lỗi Chúng thuận tiện cho kết hợp khoảng vài ba lệnh Để dễ bảo trì bạn đưa lệnh vào tập tin yêu cầu shell đọc nội dung tập tin để thực thi lệnh Những tập tin gọi tập tin kịch (shell script) 2.2 Điều khiển shell tập kịch script file Trước hết bạn dùng lệnh $cat > first.sh hay trình soạn thảo vi hay emacs (hoặc mc) để soạn nội dung tập tin first.sh sau: # ! /bin/ sh # first.sh # Script se tìm thư mục hành chuỗi # mang nội dung main( ) , nội dung fìle hiển thị hình tìm thấy for file in * if grep -l 'main( ) ' $file then more $fỉle fi done exit Khơng thích C, dịng thích comment shell bắt đầu # Tuy nhiên có thích đặc biệt #! /bin/sh Đây khơng phải lệnh thích Cặp #! shell triệu shell sh nằm thư mục /bin Shell sh có nhiệm vụ thông dịch lệnh nằm tập tin scrip tạo Tìm hiểu lập trình shell Linuxproject_2 Chỉ thị #! Còn dùng để gọi chương trình ta muốn chạy trước script dịch Lệnh exit bảo đảm script sau thực thi trả mã lỗi, cách mà hầu hết chương trình nên làm, mã lỗi trả vế dùng đến trường hợp thực tương tác trực tiếp từ dòng lệnh Tuy nhiên, nhận biết mã trả đoạn script sau thực thi, lại thường có ích bạn triệu gọi script từ script khác Trong đoạn chương trình trên, lệnh exit trả 0, cho biết script thực thi thành cơng khỏi shell gọi Mặc dù lưu tập tin script với tên sh, UNIX Linux không bắt buộc điều Hiếm Linux sử dụng phần đuôi mở rộng tập tin làm dấu hiệu nhận dạng, tệp tệp script tùy ý Tuy sh cách nhận tập tin script shell cách nhanh chóng 2.3 Thực thi script Chúng ta vừa tạo tập tin script first.sh, gọi thực thi theo cách Cách đơn giản triệu gọi trình shell với tên tập tin script làm đối số Ví dụ: $ /bin/ sh first.sh Cách gọi bình thường, quen thuộc ta gọi first.sh từ dòng lệnh, tương tự lệnh Linux thông thường Để làm điều này, trước hết cần chuyển thuộc tính thực thi (x) cho tập tin script lệnh chmod sau: $ chmod +x first.sh Sau triệu gọi script theo cách thứ hai tiện lợi hơn: $ first.sh Có thể lệnh không thực thành công ta nhận thơng báo lỗi 'command not found' (khơng tìm thấy lệnh) Điều xảy biến mơi trường PATH bạn thường khơng chứa đường dẫn hay vị trí thư mục hành Để khắc phục, ta thêm vào biến môi trường PATH định thư mục hành sau: $ PATH=$PATH: Nếu muốn Linux tự động nhớ thư mục hành đăng nhập bạn thêm lệnh PATH=$PATH : vào cuối tệp bash_profile (file triệu gọi lúc hệ thống nhập - tương tự autoexec.bat DOS) Tuy nhiên cách gọn đơn giản mà ta thường làm định rõ dấu thư mục hiên hành / lệnh Ví dụ: $ / first.sh Lưu ý: Đối với tài khoản root, không nên thay đổi biến môi trường PATH (bằng cách thêm dấu định ) cho phép truy tìm thư mục hành Điều khơng an tồn dễ tạo lỗ hổng bảo mật Ví dụ, quản trị hệ đăng nhập quyền root, triệu gọi chương trình Linux mà họ tưởng thư mục qui định /bin, biến PATH cho phép tìm thư mục hành nhà quản trị thực thi chương trình thay chương trình Linux /bin Vậy nên tạo thói quen đặt dấu / trước tập tin để ám truy xuất thư mục hành Cú pháp ngôn ngữ shell Chúng ta thấy cách viết lệnh gọi thực thi tập tin scirpt Phần dành cho bạn khám phá sức mạnh ngơn ngữ lập trình shell Trái với lập trình trình biên dịch khó kiểm lỗi nâng cấp, lập trình script cho phép bạn dễ dàng sửa đổi lệnh ngôn ngữ văn Nhiều đoạn script nhỏ kết hợp lại thành script lớn mạnh mẽ hữu ích Trong giới UNIX Linux đôi lúc gọi thực thi chương trình, bạn khó mà biết chương trình viết script hay thực thi theo mã chương trình nhị phân, tốc độ thực thi uyển chuyển chúng gần ngang Phần học về: • Biến: kiểu chuỗi, kiểu số, tham số biến môi trường • Điều kiện: kiểm tra luận lý Boolean shell • Điều khiển chương trình: if, elif, for , while, until, case • Danh shell • Hàm • Các hình nội shell • Lấy kết lệnh 3.1 Sử dụng biến Thường bạn không cần phải khai báo biến trước sử dụng Thay vào biến tự động tạo khai báo lần tên biến xuất hiện, chảng hạn phép gán Mặc định, tất biến khởi tạo chứa trị kiểu chuỗi (string) Ngay liệu mà bạn đưa vào biến số xem định dạng chuỗi Shell vài lệnh tiện ích tự động chuyển chuỗi thành số để thực phép tính có u cầu Tương tự thân hệ điều hành ngôn ngữ C, cú pháp shell phân biệt chữ hoa chữ thường, biến mang tên foo, Foo, FOO ba biến khác 10 lý đối số truyền cho hàm gọi Ví dụ tạo script có tên là: get_name.sh !#/bin/sh yes_or_no() { echo "In function parameters are $*" echo "Param $1 and Param2 $2" while true echo -n "Enter yes or no" read x case "$x" in y | yes ) return 0;; n | no ) return 1;; * )echo "Answer yes or no" esac done } echo “Original parameter are S*” if yes_or_no "Is your name” “ $1?" then echo "Hi $1" elif echo "Never mind" fi exit Kết kết xuất gọi lệnh sau: $,/get_name.sh HoaBinh SV Original parameters are HoaBinh SV In function parameters are Is your name HoaBinh Param Is your name param HoaBinh Is your name HoaBinh ? Enter yes or no : yes Hi HoaBinh, nice name Cách làm làm việc: Hàm yes_or_no( ) định nghĩa script thực thi chưa gọi Trong mệnh đề if, hàm yes_or_no sử dụng với tham số truyền cho ham nội dung biến môi trường thứ (ở ví dụ $1 thay HoaBinh) chuỗi “Is your name” Bên hàm nội dung $1 $2 in (Hãy để ý chúng khác với giá trị $1, $2 môi trường shell ban đầu) Hàm yes_or_no xây dựng cấu trúc case tùy theo lựa chọn Tìm hiểu lập trình shell Linuxproject_2 người dùng mà trả vế trị hay Khi người dùng chọn yes, hàm trá giá trị (true) Lệnh bên if gọi để in chuỗi “nice name” 3.6 Các lệnh nội shell Ngoài lệnh điều khiển, shell cung cấp cho lệnh nội (build-in) khác hữu ích Chúng gọi lệnh nội khơng thể thấy chúng hữu tập tin thực thi thư mục hệ thống tệp (Có thể xem lệnh tương tự khái niệm lệnh nội trú DOS) Trong trình lập trình shell, chúng thường xuyên sử dụng 3.6.1 Lệnh break Tương tự ngơn ngữ lập trình C, shell cung cấp lệnh break để khỏi vịng lặp for, while util điều kiện lệnh có diễn hay khơng Ví dụ tạo script có tên break.sh #!/bin/sh rm -rf fred* echo > fred1 echo > fred2 mkdir fred3 echo > fred4 for file in fred* if [ -d "$file" ]; then break; fi done echo first directory fred was $file exit Đoạn script dùng lệnh for để duyệt toàn bạ tên tập tin thư mục hành bất đầu chuỗi fred Khi phát thư mục danh shell tập tin, in tên thư mục dùng break rể khỏi vịng lặp (khơng cần duyệt tiếp tập tin khác) Lệnh break thường ngắt ngang logic chương trình , nên hạn chế dùng break Lệnh break khơng có tham số cho phép khỏị vịng lặp hành Nếu đặt tham số cho lệnh ví dụ, break 2, break chẳng hạn, khỏi nhiều vịng lặp lúc Tuy nhiên chúng làm cho chương trình khó 32 Tìm hiểu lập trình shell Linuxproject_2 theo dõi Tốt ta nên dùng break không tham số 3.6.2 Lệnh continue Lệnh continue thường sử dụng bên vòng lặp, continue yêu cầu quay lại thực bước mà khơng thực lệnh cịn lại bên vịng lặp Ví dụ tạo script có tên continue.sh #!/bin/sh rm -rf fred* echo > fred1 echo > fred2 mkdir fred3 echo > fred4 for file in fred* if [ -d "$file" ]; then continue fi echo file is $file done exit Đoạn script dùng lệnh for để duyệt toàn tên tập tin thư mục hành bắt đầu chuỗi fred Nếu kiểm tra tên tập tin thư mục, continue yêu cầu quay lại duyệt tiếp file khác Ngược lại lệnh echo in tên tệp continue cho phép truyền tham số để xác định số lần lặp cần quay lại Ví dụ: for x in echo before $x if [ $x = =2 ] ; then continue fi echo after $x done Kết before after before before after 3.6.3 Lệnh : (lệnh rỗng) Lệnh : gọi (null command) Đôi lúc lệnh dùng với ý nghĩa logic true Khi dùng : thực nhanh với lệnh dùng true Một số shell cũ sử dụng lệnh : với ý nghĩa thích cho dòng lệnh Tuy nhiên trường hợp sử dụng # thay cho : 3.6.4 Lệnh eval Lệnh eval cho phép ước lượng biểu thức chứa biến Cách đơn giản xem lệnh eval làm việc ví dụ sau: foo=10 x=foo y=’$’$x echo $y Đoạn lệnh in kết $foo Bây bạn dùng lệnh eval foo=10 x=foo eval y=’$’$x echo $y Kết in 10 Lý y = '$' $x diễn dịch thành chuỗi y=$x Lệnh eval tiếp đến ước lượng y=$x biểu thức gán Kết y mang giá trị nội dung biến x (10) eval hữu dụng, cho phép sinh đoạn lệnh thực thi động trình script thi hành 3.6.5.Lệnh exit n Lệnh exit thoát khỏi shell gọi trả mã trạng thái lỗi n Trước ta gọi exit bên shell phụ Nếu gọi exit từ dòng lệnh, khiến khỏi shell trở hình đăng nhập ln (đây cách thường dùng để thoát khỏi user hành, đăng nhập làm việc tên user khác) exit hữu dụng script, trả mã lỗi cho biết script thực thi thành công hay không Mã lỗi có nghĩa thành cơng Các giá trị từ 1-125 script tùy nghi sử dụng cho nhiều mục đích khác Các giá trị lại dành cho mục đích riêng Cụ thể là: 126: file khơng thể thực thi 127: Lệnh khơng tìm thấy Lớn 128: Đã nhận tín hiệu (signal) phát sinh Sử dụng giá trị thành cơng gây lầm lẫn cho số lập trình viên C (ở coi false khác true) Tuy nhiên cách này, ưu điểm tận dụng giá trị khác làm mã qui định lỗi, khơng cần phải dùng thêm biến tồn cục để lưu giữ mã lỗi trả Ví dụ đơn giản exit đay kiểm tra xem tệp profile có tồn hay khơng, có trả lại 0, cịn không trả #!/bin/sh if [ -f profile ] ; then exit fi exit 3.6.6 Lệnh export Khi bắt đầu thực thi shell, biến môi trường lưu lại Khi có khai báo sử dụng biến script, có giá trị shell phụ gọi script Để biến thấy tất script shelll phụ hay script gọi từ shell khác, dùng lệnh export Lệnh export có tác dụng khai báo biến tồn cục Ví dụ sau cho thấy cách sử dụng export Tạo file script có tên export2.sh #! /bin/sh echo "Value : $foo” echo "Value : $bar" Tiếp theo tạo file script khác có tên export1.sh #! /bin/sh foo="This is foo" export bar = “This is bar" Chạy lệnh, xuất biến bar $./export2.sh Kết gọi export1.sh $./export1.sh Value : Value: This is bar Dòng đầu cho kết biến $foo rỗng foo khơng khai báo tồn cục từ export1.sh, nên export2.sh khơng thấy biến Dịng thứ cho kết nội dung biến $bar bắt khai báo export Biến bar trở nên tồn cục script khác nhìn thấy bar Chú ý: Nếu muốn tất biến mặc định tồn cục tất script, gọi lệnh set –a hay set-allexport trước thiết lập nội dung cho biến 3.6.7 Lệnh expr Lệnh expr tính đối đầu vào biểu thức Thường expr dùng trọngviệc tính tốn kết qủa tốn học đổi giá trị từ chuỗi sang số Ví dụ : x= “12" x= `expr $x + 1` Kết x=13 Lưu ý, cặp dấu ‘ ‘ bọc biểu thức expr dấu nháy đơn (Ký tự phím nằm phím ESC bên trái phím 1, chung với phím ~ Các tốn hạng tốn tử phải cách khoảng trắng Ở $x cách ký tự + khoảng trắng Nếu để chúng sát nhau, diễn dịch shell báo lỗi biểu thức Dưới số biểu thức ước lượng mà expr cho phép: Biểu thức Ý nghĩa expr1 | expr2 Kết expr1 expr1 khác không ngược lại expr2 expr1 & expr2 hai biểu thức zero ngược lại expr1=expr2 Bằng expr1>expr2 Lớn expr1>=expr2 Lớn expr1

Ngày đăng: 04/01/2022, 10:37

Hình ảnh liên quan

Hình 2 - Tìm hiểu về lập trình shell trên linuxproject 2

Hình 2.

Xem tại trang 5 của tài liệu.
1. Shell của UNIX/Linux - Tìm hiểu về lập trình shell trên linuxproject 2

1..

Shell của UNIX/Linux Xem tại trang 5 của tài liệu.

Mục lục

    7. Tài liệu tham khảo

    1. Shell của UNIX/Linux

    2. Sử dụng shell như một ngôn ngữ lập trình

    3. Cú pháp ngôn ngữ shell

    3.3 Cấu trúc điều khiển

    3.4 Danh sách shell thực hiện lệnh (list)

    3.6 Các lệnh nội tại của shell

    4. Dò lỗi (debug) của script

    5. Hiển thị màu chữ

Tài liệu cùng người dùng

Tài liệu liên quan