Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
158,31 KB
Nội dung
Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài Bởi: CS Võ Quang Nhân Loạt "Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux" tác giả Làng Đậu giữ quyền 2006 Người đọc sử dụng cho mụch đích học tập hay giảng dạy cho cá nhân Cấm hình thức chép, đăng lại, hay in lại nhằm mụch đích mua bán hay trục lợi mà khơng có cho phép thức tác giả Mọi thông tin việc phổ biến rộng rãi có tính quảng bá tài liệu cho mụch đích giáo dục hay phê bình, đề nghị nội dung giảng xin liên lạc vo_quang_nhan@yahoo.com Kí tự quy ước lệnh dạng kí tự Những lưu ý tổng quát Các văn lệnh tập tin văn (text) thông thường cần thoả mãn luật chung Linux/UNIX tên định dạng tập tin văn đủ Mặc dù vậy, để thi hành trọn vẹn, tập tin văn phải có thuộc tính khả thi (executable) dĩ nhiên phải khơng có lỗi viết mã Hãy dùng lệnh chmod +x [TÊN_VĂN_LỆNH] để thị giá trị khả thi cho chương trình mà bạn viết thử Bạn mượn chưong trình soạn thảo văn đơn giản để viết mã vi (vim), KWrite, Late hay Word Perfect để tạo văn lệnh nhớ lưu giữ đưới dạng văn thơng thường (text) hay ASCII Bạn soạn thử văn lệnh wordpad hay chương trình soạn thảo Windows; Tuy nhiên, chạy Linux cần phải chuyển dịch dạng văn Linux (thí dụ dùng lệnh: dos2unix [TÊN_TẬP_TIN] để chuyển đổi định dạng Tuy nhiên, không khuyên bạn làm cách lẽ người dùng Linux khơng thể cách tạo văn đơn giản cơng cụ Linux mà khơng phải mượn thứ bên ngồi (Nếu mượn Windows để soạn thảo văn lệnh Linux giống người lấy kìm nhổ đinh để nhổ răng: kìm phải bị "mài" dũa lại không bạn làm hại "cái gốc người") 1/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài Một có script bạn thi hành (gọi) script dịng lệnh bash [TÊN_VĂN_LỆNH] hay cần nhập [TÊN_VĂN_LỆNH] để thực thi mệnh lệnh tập tin Khi viết script lần đầu tiên, bạn nên tìm hiểu cách dùng số lệnh hệ thống quan trọng ls, cat, cp, mkdir, rm, rmdir, chmod, Bạn tìm thấy lệnh phần phụ luc cuối Bạn phải có đầu cuối hình (console screen) để viết thử nghiệm văn lệnh Trong da số trường hợp, ban dùng đầu cuối X (X terminal) - cách gõ lệnh xterm hay cách nhấn vào trình đơn (menu) gọi hình Terminal Emulation) Tuy nhiên, chạy script X Window, nhiều thơng báo từ lệnh mà bạn dùng script bị cắt bỏ phần mềm bạn có dịp để tìm hiểu sai sót (nếu có) Một cách tốt nhấn tổ hợp phím ++ để đăng nhập vào đầu cuối riêng biệt Nếu bạn người dùng "root" dùng dạng bạn toàn quyền chạy tất lệnh hệ thống không bị giới hạn Tuy nhiên, dao hai lưỡi bạn có thao tác sai lầm ảnh hưởng tới máy Lưu ý: Khi thực tập máy, thật cẩn thận với câu lệnh mà bạn dùng văn lệnh Nhất câu lệnh có tính chất phá hủy lệnh xố tập tinh, xóa người dùng, hay lệnh có tính thay đổi đặc tính quản lý hệ thống Quy ước chung dùng giảng: Để tiện trình bày thơng tin cho thật xác quy ước sau sử dụng Lưu ý rằng, điều quy ước riêng loạt giảng Do kiến trúc Linu/UNIX quy định nên thư mục hay thiết thiết bị khác xem tập tin Và tên đầy đủ của tập tin bao gồm đường dẫn (path) tên tập tin Tên đầy đủ thư mục mà chứa tập tin gọi đường dẫn tập tin Nếu khơng có lưu ý thêm cụm từ [TÊN_TẬP_TIN] hay [TÊN_VĂN_LỆNH] hiểu tên đủ tập tin bao gồm đường dẫn (path) tên riêng tập tin hay văn lệnh Chữ tên riêng (hay chữ "tên" không bị nhầm lẫn) có nghiã tên tập tin mà khơng có đường dẫn kèm Thí dụ: tên riêng thư mục dạng tên đầy đủ /usr/local/share/man man Tương tự, tên riêng tập tin mà có dạng đầy đủ /etc/init.d/crond / /crond 2/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài Kí tự quy ước lệnh dạng kí tự Trong BASH, kí tự đặc biệt ~,`,@,#.$.%,&,*,?,,;,", mang ý nghiã quy ước riêng Một số lớn chúng thực mệnh lệnh đặc trưng Sau số kí tự ý nghĩa quy ước cần biết viết mã Số khác dùng phép toán hay mệnh lệnh mở rộng đặc biệt trình bày giảng sau Dòng bị với dấu # Tương tự ngơn ngữ khác, BASH người ta viết dịng thơng tin mà trình dịch khơng có tác động trực tiếp dùng làm dịng bị Dịng bị thơng thường Trong BASH, để tạo dòng bị cần đặt đầu dịng dấu # Khác với C++, người ta khơng thể viết bị với nhiều dòng liên tục (bằng cách sử dụng dấu kiểu /* dòng bị */ Dịng bị thơng báo trình dịch Đặc biệt dịng bi bắt đầu #![đường_dẫn_cho_trình_dịch] dành riêng để máy biết người viết mã muốn dùng trình thơng dịch để chạy mã nguồn (Vì BASH ngơn ngữ tương thích với nhiều loại khác Korn C-shell) Dịng thơng báo nên đặt dòng mã tập tin Với cách người ta chạy tập tin văn lệnh nhiều phiên hay trình dịch khác (chỉ cần thay đổi dòng bị trình dịch) Thí dụ: #!/bin/bash # the line above request to run bash from /bin (not from anywhere else) #File name: test1 #This is comment line echo "Hello World!" #the only command to be run in this script is 'ls -al' 3/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài Hãy soạn lưu nội dung tập tin tên test1 thư mục hoạt động, dùng lệnh chmod 755 /test1 (hay lệnh chmod +x /test) để làm cho khả thi chạy lệnh /test1 Từ sau, thí dụ khơng nhắc lại làm văn lệnh trở thành thi hành Dấu phân cách ; thay cho kí tự xuống hàng (cariage return) Trong văn lệnh Linux, câu lệnh đơn giản tự đứng riêng thành dịng Để viết dịng với nhiều lệnh dùng dấu ; để ngăn cách câu lệnh Hơn nữa, trường hợp câu lệnh bao gồm nhiều dòng người lập trình viết chung thành dòng phải để dấu ; ngăn cách câu lệnh với dùng ; thay cho dấu xuống hàng câu lệnh có nhiều dịng Tuy nhiên, lưu ý rằng, hai câu lệnh tập tin mã nguồn BASH, kí tự xuống hàng hay kí tự "space", "tab" đặt nhiều lần đó, hai câu lệnh, bạn hồn tồn đặt vào tùy ý nhiều dấu ; điều gây bất tiện không làm thay đổi chức vận hành ngoại trừ việc làm cho trình dịch đọc thi hành mã lâu Thí dụ: Hãy xem thi dụ sau gán cho biến a giá trị 1, sau kiểm nghiệm lại câu lệnh if - else: Nếu giá trị a hiển thị dịng "succeed", ngược lại hiển thị dòng "failed" ($a biểu thức nội dung giá trị mà biến a lưu giữ) #!/bin/bash a=1 if [ $a = ] then echo "succeed" else echo "failed" fi # gán cho biến a giá trị # a có giá trị 4/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài #thì #in dịng chữ "succeed" #nếu khơng #in dịng chữ "failed" #kết thúc câu lệnh "if" Có thể dùng cách viết khác cách thơng thường trên, người viết mã thay xuống hàng thay vào dấu ; nội dung tập tin trở thành: #!/bin/bash a=1; if [ $a = ]; then echo "succeed"; else echo "failed"; fi Hay là: #!/bin/bash a=1; if [ $a = ] then echo "succeed" else echo "failed" fi Dĩ nhiên, cách viết có ưu khuyết điểm riêng trình bày viết chúng khơng ảnh hưởng đến chức hay thứ tự vận hành Tuỳ theo thói quen cách nhìn người viết mã trình bày cho dể hiểu Cùng nội dung viết lại sau: #!/bin/bash a=1 if [ $a = ]; then echo "succeed" 5/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài else echo "failed" fi Lưu ý: Khơng thể đặt dịng lệnh bắt đầu dấu # làm hàng bị ngăn với câu lệnh thực thụ khác với câu bị dấu ; Vì đó, tồn dịng trình dịch hiểu câu bị nên bỏ qua Lệnh trống Trong BASH, dấu : quy ước lệnh trống tức câu lệnh khơng thi hành hết (tương đương với dấu ; C/C++ hay tương đương với lệnh nop; ASM) Lệnh ln ln có gía trị luận lý trả true Thí dụ #!/bin/bash let "n = 1" while : echo "value of n is $n" let "n += 1" if [ $n -ge ] then echo "program terminated." break fi done Khối mã hoàn toàn tương đương với khối mã sau trình bày khác thay : (true): 6/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài #!/bin/bash let "n = 1" while (true); echo "value of n is $n" let "n+=1" if [ $n -ge ]; then echo "program terminated." break fi done Cả hai khối thực thi cho kết : value of n is value of n is value of n is program terminated Trong thí dụ trên, sau biến n cài đặt giá trị ban đầu vịng lặp tiến hành Trong chu kì, biến n tăng giá trị đơn vị; câu lệnh if kết thúc vòng lặp n > Như vịng lặp chạy vơ hạn lần thiếu câu lệnh break trường hợp "con kiến mày lèo cành đa leo phải vòng lặp leo leo vào" Lưu ý: Trong mệnh đề điều kiện lệnh gán trực tiếp giá trị (chẳng hạn [ $n -ge ] a=1) số luợng khoảng trống (space) toán tử phép tốn phải theo cú pháp chặc chẽ khơng trình dịch báo lỗi hay khơng thực mong muốn (trong chẳng hạn khơng thể viết thành [$n -gt 3] hay a = Tuy nhiên lệnh let lại cho phép đặt toán tử phép tốn vị trí thỏi mái (tức cách viết let "n+=1", hay let " n += 1", hay let "n +=1" chấp nhận tương đương 7/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài Nhóm lệnh (dùng trình bao con) ([KHỐI_LỆNH]) Trong mã nguồn, có nhóm lệnh muốn thực thi riêng lẽ độc lập cách gọi lại trình bao để thực thi nhóm chung lại cặp dấu ngoặc đơn Vì trình bao chương trình chịu trách nhiệm gọi lại để thực thi khối lệnh nằm dấu ngoặc nên ta gọi "trình bao con" (sub shell) Thí dụ #!/bin/bash touch myfile mkdir test (cd test; cp /myfile ; cd ) Trong thí dụ trên, lệnh touch tạo tập tin khơng có nội dung myfile, lệnh mkdir dùng để tạo thư mục test (cd test; cp /myfile ; cd ) gọi trình bao để thực thi nhóm lệnh bao gồm di chuyển thư mục hoạt (current directory) tới thư mục test, chép tập tin myfile từ thư mục cha vơ đó, di chuyển hoạt vị trở Nhóm lệnh { [KHỐI_LỆNH;] } Giống 2.2.4 đây, trình bao chuyển sang thực thi nhóm lệnh mà khơng tự gọi trình bao khác thực thi Khi sử dụng cách này, lưu ý câu lệnh phải có dấu '; ' dấu đầu dòng (xuống hàng mới) phải có khoảng trống dấu ngoặc nhọn với câu lệnh Cách dùng nhóm lệnh thơng dụng định nghiã hàm hay dùng vòng lặp Thi dụ: hai nhóm lệnh sau tương đương { cd test; cp /myfile ; cd ; } hay: { cd test cp /myfile cd 8/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài } Ngoặc mở rộng lệnh {THAM_SỐ1 THAM_SỐ2 THAM_SỐ3} Trong trường hợp lệnh BASH chấp nhận tham số để yêu cầu lệnh thi hành lại vói tham số khác đặt tham số vào cặp dấu móc Cách thức gọi mở rộng dấu ngoặc (brace expansion) Thí dụ1: dịng lệnh sau cho phép người đọc yêu cầu hiển thị danh sách tập tin có tên mở rộng (extension) h cpp bên thư mục tên test: ls test/{*.cpp,*.h} Lệnh tương đương với hai lệnh: ls test/*.cpp; ls test/*.h Thí dụ dịng lệnh sau cho phép chép (copy) hai tập tin myfile.cpp myfile.h vào thư mục test: cp {myfile.cpp,myfile.h} test Thí dụ Dịng lệnh giúp tạo lúc thư mục /home/myname old ,new report mkdir /home/myname/{old,new,report} Lưu ý: Không phải lệnh hệ thống hổ trợ dấu ngoặc mở rộng (như lệnh find chẳng hạn) Để thử nghiệm mã nêu trên, hai thí dụ, thư mục test phải tồn thêm vào đó, thí dụ2, thư mục (current directory) phải có sẵn hai tập tin myfile.cpp myfile.h dấu phẩy ',' bên cặp dấu móc { } không để khoảng trống từ ngoại trừ tên tham số Nếu viết sai cú pháp trình dịch báo lỗi Ngoặc khối mã {} Để phân lập riêng đọan mã người lập trình đặt mã vào cặp dấu móc { } tạo thành khối mã Tuy nhiên, trường hợp dùng khối mã thơng thường việc viết mã khối có tính hình thức, việc dùng cặp dấu móc có ý nghĩa hồn tồn chúng có giá trị phân lập thực thụ (như trường hợp dùng khối mã để định nghiã hàm) 9/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài Thí dụ Hai đoạn sau hoàn toàn tương đương #!/bin/bash ls { cd test cp myfile yourfile cd } #!/bin/bash ls cd test cp myfile yourfile cd Thí dụ Thí dụ hàm sau làm cho định nghiã khối mã trở nên có ý nghiã #!/bin/bash function Welcome { echo "Welcome to $NAME" echo "today is `date`" } NAME="myName" Welcome 10/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài Lưu ý: Trong nhiều ngơn ngữ lập trình (như C/C++ chẳng hạn) biến định định nghĩa bên khối lệnh có giá trị nội chúng hiệu lực (hay bị trình dịch bắt lỗi) dùng chúng bên khối lệnh Điều không với BASH, nghiã là, biến định nghiã, có giá trị địa phương cho tồn tập tin chứa định nghiã mà không bị giới hạn nội bên khối mã trường hợp C/C++ Thực thi mệnh lệnh gán kết cho biến hay biểu thức [KHỐI_LỆNH] hay $([KHỐI_LỆNH]) Dấu huyền ` (backtick) tốn tử Linux Nếu đặt dịng lệnh vào hai dấu ` (xem dấu ngoặc đặc biệt) có nghiã u cầu trình dịch BASH thực thi câu lệnh ngặc trả liệu xuất từ ngỏ câu lệnh (Do đó, lệnh khơng gán vào giá trị biến hay biểu thức bạn bị báo lỗi Thí dụ Đoạn mã sau đọc nội dung tập tin account_file lọc string "Dung Vo" a=`cat account_file | grep "Dung Vo"` if [ "$a" = "" ]; then echo "There is no string 'Dung Vo' in the account_file" else echo "the sring :'Dung Vo' matched in account_file!" if Thí dụ Vịng lặp for sau nhận liệu từ ngỏ lệnh ls sau kiểm xem tên thư mục (directory), tập tin (file), hay thành phần đặc biệt.để hiển thị for file in `ls`; if [ -d $file ]; then echo "$file if a directory" elif [ -f $file ]; then echo "$file is a regular file" 11/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài else echo "$file is a specific file" fi done Thí dụ Gán tất thơng tin tập tin list.txt thêm vào dịng có chữ congratulation dòng để sử dụng vào nhiều nơi khác mà gọi lại tổ hợp mệnh lệnh WIN_LIST=$(echo "*** Congratulation ***"; cat list.txt) echo "$WIN_LIST" Các kí tự đổi hướng xuất nhập Đổi hướng xuất từ stdout sang tập tin > Để chuyển hướng thông tin từ ngỏ xuất (output) mệnh lệnh đưa trực tiếp vào tạo thành nội dung tập tin hay ngỏ chuẩn (stderr, stdout) (3) , ta dùng kí tự lớn > để làm việc (Xem thêm phụ lục thiết bị quan trọng Linux) Thí dụ Câu lệnh dùng để chuyển tất hiển thị từ stdout lệnh myscript tạo thành nội dung tập tin my_file việc làm xóa tồn tập tin my_file tên (nếu có) myscript > my_file Thí dụ Tất liệu xuất từ hai ngỏ stdout stderr chuyển vào nội dung tập tin my_file myscript &>my_file Lưu ý: Câu lệnh tương đương với câu lệnh: myscript > my_file 2>&1 Thí dụ Chuyển nội dung thơng tin xuất từ lệnh myscript vào thẳng stderr; với cách tất thơng tin xuất myscript theo ngỏ stdout trở thành thông tin xuất từ ngỏ stderr (nghĩa cách dùng để thông báo lỗi) 12/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài myscript >&2 Thí dụ mycommand 1>/dev/null 2>/dev/null Thí dụ Sử dụng kĩ thuật nhóm lệnh để xuất thông báo chuẩn từ stdout câu lệnh vào làm thành tập tin myfile: (echo "The file list of the current directory today are:"; date; ls -A)> my_log_file Đổi hướng xuất từ stdout chép nối vào tập tin >> Tương tự dùng dấu > Điểm khác thay xố tập tin tên có dấu thực thi lệnh chuyển hướng >> chép thông nối tiếp vào phần sau tập tin Thí dụ Câu lệnh sau có chức gần giống với thí dụ5 (2.3.1) dĩ nhiên thí dụ ; tập tin my_log_file có từ trước bị thay tập tin my_log_file thí dụ sau khơng xố mà chép tiếp vào echo "The file list of the current directory today are:" >> my_log_file date >> my_log_file ls -A >> my_log_file Xem tập: Hãy điều chỉnh dịng lệnh thí dụ cho trở thành hồn tồn tương đương với thí dụ 2.3.1 Đổi hướng nhập stdin để nhập từ tập tin (hay dòng mã trực tiếp) < Đổi hướng từ stdin sang đọc từ tập tin Thí dụ Dịng lệnh sau dùng để hiển thị nội dung tập tin my_file Nó tương đương với lệnh cat my_file cat < my_file Thí dụ Dịng lệnh sau dùng để chép tồn liệu thiết bị /dev/sda (thường ổ cứng) sang thành tập tin (nhằm mục đích lưu trữ) tương đương với lệnh dd if=/dev/sda of=my_backup dd my_backup 13/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài Và để phục hồi lại truờng hợp ổ cứng tên /dev/sda bị hư dùng lệnh dd /dev/sda Lưu ý: Đây cách lưu trữ "thô" nhằm giúp bạn hiểu thêm Trong trường hợp lưu trữ thực tế; bạn nén liệu đọc để giảm chống chỗ hay dùng tiện ích chuyên dụng cho lư trữ khác dở nén phục hồi Đổi hướng đọc dòng từ tập tin Đơi muốn truy cập dịng một tập tin làm cách sau: while read my_line echo "$my_line" done found.txt echo "continue" ls #Not Using background process echo "searching and printing result into found.txt " find /etc -name "*log" > found.txt & echo "continue" ls Chú thích 1: : Sự khác biệt tập tin ASCII Windows Linux tập tin định dạng kiểu DOS/Windows dấu xuống hàng (cariage return - 0D) thường kèm với dấu đầu dòng (newline - 0A) tập tin dạng Linux có dấu đầu dịng Nhiệm vụ lệnh dos2unix để lấy kí tự khơng tương thích thay vào cần thiết để làm cho tập tin trở nên tương thích với Linux 2: Cái răng, tóc gốc người (tục ngữ) 3: Trong BASH mơ tả tập tin (file descriptor) ngỏ vào chuẩn stdin kí hiệu 0< (hay ), stdout kí hiệu 1> (hay 1), stderr 2> (hay 2) Xem thêm phụ lục tới loại tập tin thiết bị 4: Root (dịch nghiã gốc, hay tổ tiên) người dùng có quyền truy cập tập tin, tiến hành thao tác hệ thống Linux Root hiểu tài khoản người quản trị Khái niệm root tương đương với khai niệm administrator (người quản trị) hệ thống Windows 18/19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài 5: Wildcard: Một đạng kí tự đặc biệt, tùy theo quy ước, đại diện cho hay dãy kí chưa xác định rõ ràng Có nơi dịch "kí tự thay thế" 19/19 ... phần) ngỏ lệnh biến thành ngỏ vô lệnh 16 /19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài Thí dụ Câu lệnh sau chuyển nội dung myFile (đọc từ lệnh cat) sang ngỏ vào lệnh grep (và lệnh grep... stderr (nghĩa cách dùng để thông báo lỗi) 12 /19 Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài myscript >&2 Thí dụ mycommand 1> /dev/null 2>/dev/null Thí dụ Sử dụng kĩ thuật nhóm lệnh để.. .Các Lược Giảng Chuyên Sâu Sử Dụng Văn Lệnh BASH Linux/Bài Một có script bạn thi hành (gọi) script dịng lệnh bash [TÊN_VĂN_LỆNH] hay cần nhập [TÊN_VĂN_LỆNH] để thực thi mệnh lệnh tập