Nội dung bài học
Bài 5. Linux Shell
• Giới thiệu về Shells • Môi trường làm việc với Shell • Lập trình Shell (Bash) • Debugging Shell Scripts • Built-in Shell commands • Các tiện ích (tools) trong Shell
Vị trí của Shells
1. Giới thiệu về Shells
Vai trò của Shells
Vai trò của Shells
• Người dùng bị tách biệt với phần cứng bởi lớp
nhân (kernel).
• Người dùng tương tác với lớp nhân thông qua:
• Các chương trình tiện ích hệ thống nằm trong đĩa cứng, được nạp vào RAM khi người dùng cần thực hiện công việc.
• Tập các chương trình này được gọi là lớp vỏ
hay còn gọi là Shell.
– Các lời gọi hệ thống. – Các chương trình tiện ích hệ thống.
1
Công việc thực hiện với Shells
Công việc thực hiện với Shells
• Hỗ trợ người dùng môi trường xử lý dòng lệnh
làm các công việc sau: – Xử lý các câu lệnh và thực hiện chúng. – Hỗ trợ ngôn ngữ lập trình Shell và thông dịch các
chương trình viết trên Shell. – Điều khiển môi trường thông qua các biến và tham số.
– Hỗ trợ pipe để trao đổi giữa các tiến trình. – Hỗ trợ định hướng lại vào ra (I/O). – Làm việc với File System thông qua tên file.
Các loại Shells
Dấu nhắc đợi lệnh
• sh Bourne Shell (Original Shell) (Steven Bourne
• Nhận diện shell đang làm việc: lệnh echo
of AT&T)
• csh C-Shell (C-like Syntax)(Bill Joy of Univ. of
California)
• Dấu nhắc lệnh
• ksh Korn-Shell (Bourne+some C-shell)(David
Korn of AT&T)
• tcsh Turbo C-Shell (More User Friendly C-
hoặc %echo $shell $echo $SHELL /bin/sh /bin/csh
Shell).
• Khuyến khích dùng Bash Shell
• bash Bourne Again Shell (GNU Improved
Bourne Shell)
– # – % – $ khi ta là root, ở bất kỳ shell nào dấu nhắc khi chạy C shell dấu nhắc khi chạy Bash shell hoặc K shell
Các loại Shells
Login shell
• Truy nhập vào hệ thống:
– Local system : chạy trực tiếp trên máy : login. – Network system: kết nối với hệ thống thông
qua mạng: ssh, telnet, rlogin.
• Với mỗi kết nối (cid:198) hệ thống gọi chương
trình getty kích hoạt làm việc.
• Getty gọi chương trình login xử lý thông tin đăng nhập (cid:198) bật chương trình Shell tương ứng cho người dùng.
2
Login Shell
Xác định Shell
• Xác định Shell thông qua:
– $SHELL – /etc/passwd
• Đổi loại Shell: chsh
Nội dung cần biết
2. Môi trường làm việc Shell
• Start up Shell,Shell options. • Command processing, command types. • I/O standard,Pipe. • Shell variables,User’s variables. • Command syntax. • Filename substitution. • Command substitution. • Quotes. • Math, string operators.
~/.bashrc & ~/.bash_profile
Startup Shell
• Đọc nội dung các file, tự viết thêm các
• Đọc file cấu hình (cid:198) thiết lập môi trường: • Chế độ tương tác (interactive):
hàm hoặc các alias hoặc export của mình
• /etc/profile. • ~/.bash_profile.
– Login shell (/bin/login) đọc các file:
• Chế độ không tương tác (non-interactive):
– Non-login shell (/bin/bash, icon,..) đọc file: • Kế thừa từ Shell cha (parent enviroment). • ~/.bashrc.
– Kế thừa môi trường từ Shell cha.
3
Basic Shell options
Interactive Non-login Shell
Option
Description
emacs
Enters emacs editing mode (on by default)
• Kiểm tra kết quả của sự thay đổi trên bằng
Doesn't allow use of a single CTRL-D to log off; use the exit
cách chạy lại chương trình Shell
ignoreeof
command to log off immediately (this has the same effect as setting the shell variable IGNOREEOF=10)
noclobber
Doesn't allow output redirection (>) to overwrite an existing file
Doesn't expand filename wildcards like * and ? (wildcard
noglob
expansion is sometimes called globbing)
nounset
Indicates an error when trying to use a variable that is undefined
history
Save entered commands in history file
$ set +/-o (cid:198) liệt kê, đặt hoặc bỏ options
Các ký tự đặc biệt trong Shell
Basic Shell options
• Tự nghĩ các ví dụ thực hiện với các
options này: – Kiểm tra quyền on/off của option – Lấy các ví dụ với ký tự *, ?
Meaning
Character ; & ( ) | < > & * ? [ ] ~ + - @ ! “ ‘ \ ` Command separator Background execution Command grouping Pipe Redirection symbols Metacharacters for filename and pattern Used in quoting other characters Command substitution Variable substitution (or command or $ arithmetic substitution) space tab newline Word separators
Xử lý các dòng lệnh
Interactive Shell
• Các bước xử lý dòng lệnh trong Shell:
1. Bật chế độ ghi nhật ký (history). 2. Phân tích cú pháp thành các cụm từ (tokens) 3. Cập nhật lại nhật ký (history updated). 4. Xử lý các dấu nháy (quotes). 5. Xác định các aliases và functions. 6. Thiết lập: redirect, background, pipe. 7. Thay thế giá trị cho các biến (variables). 8. Thực hiện các câu lệnh đóng vai trò như tham số truyền (command substitution) 9. Thay thế tên file bởi các ký tự đặc biệt (metacharacters). 10. Thực hiện câu lệnh gốc.
4
Các loại câu lệnh
• Khi người dùng gõ 1 câu lệnh, Shell sẽ thực hiện kiểm tra theo các bước sau: – Kiểm tra xem có phải alias không? – Kiểm tra xem có phải functions không? – Kiểm tra xem có phải built-in command
không?
– Kiểm tra xem có phải chương trình thực hiện
không (executable programs)?
– Nếu không thỏa mãn (cid:198) thông báo lỗi. • Thực hiện chương trình trong Shell???
Cú pháp (Syntax)
Commands & Arguments
• $ mv oldfile newfile
$ command options arguments
• Có hai loại options:
• $ echo Smile, you are in Bridgeport City
– Short options: viết tắt bởi các chữ cái : -o – Long options: viết đầy đủ tên : --option_name
Smile, you are in Bridgeport City $
arguments mv oldfile newfile
arguments echo Smile, you are in Bridgeport City
Khoảng trắng là dấu phân cách giữa các tham số
Thực hiện chương trình trong Shell
Input, Output, Error
INPUT
shell
OUTPUT
ERROR
5
Common redirection examples
Chuyển hướng vào/ra (Redirect)
• Shell hỗ trợ các ký tự đặc biệt để thực
hiện chuyển hướng vào ra với file. – Chuyển hướng vào chuẩn: < – Chuyển hướng ra chuẩn : > – Chuyển hướng lỗi chuẩn : 2>
• Xét một số ví dụ:
– $ grep Tom datafile > temp – $ mail tom < memo – $ find . –name filex 2> errors
Biến môi trường trong Shell
Kênh truyền dữ liệu Pipe
Liệt kê thông qua lệnh $set hoặc $env
Tên biến = Giá trị Ý nghĩa
BASH = /bin/bash
Tên Shell sử dụng mặc định.
• Standard Output của command này sẽ là Standard Input của command kế tiếp.
BASH_VERSION = 3.1.17
Phiên bản Shell
COLUMNS = 80
Số cột thể hiện trong cửa sổ Shell.
LINES = 25
Số dòng hiển thị trong cửa sổ Shell.
LOGNAME = khmt
• Có thể thực hiện với nhiều pipes :
Tên người dùng đang làm việc với Shell (login).
OSTYPE = Linux
Kiểu hệ điều hành
HISTFILE = /home/khmt/.bash_history
Tên file lưu trữ các lệnh đã thực hiện (nhật ký)
HOSTNAME = khmt-laptop
Tên máy tính trong mạng.
HOME = /home/khmt
Tên thư mục gốc dành cho người dùng đăng nhập.
Biến môi trường trong Shell
Built-in Shell variables
IFS = $’ \t\n’
Giá trị ký tự phân cách.
PATH = /usr/bin:/usr/sbin:/bin
Các đường dẫn mặc định.
Variable Variable
PWD = /home/khmt
Thư mục làm việc hiện tại mặc định.
$# Tổng số tham số truyền vào chương trình
PS1, PS2
Các dấu nhắc lệnh (prompt) cấp bậc 1 và 2.
Tham số hoặc lựa chọn (option) đang thực hiện với
SHELL = /bin/bash
Tên chương trình Shell.
$_ câu lệnh (chương trình)
USER = khmt
Tên người dùng đang làm việc hiện tại.
USERNAME = khmt
Tên người dùng đăng nhập vào hệ thống lúc đầu.
$? Giá trị trả lại khi kết thúc thực hiện câu lệnh.
UID, EUID
User ID và Effective user ID number
$$ Chỉ số của tiến trình hiện tại (current process)
GROUPS
Liệt kê danh sách các nhóm chứa người dùng.
Chỉ số của tiến trình cuối cùng làm việc ở chế độ $! nền (background).
FUNCNAME
Tên của hàm đang làm việc hiện tại.
6
Built-in Shell variables
Ví dụ minh họa
• Tự nghĩ các ví dụ minh họa cho các biến
$0 Tên của (câu lệnh) chương trình đang thực hiện.
trong Shell – Chú ý dùng các lệnh: set để truyền tham số
vào chương trình.
Xác định giá trị của tham số thứ n truyền vào chương $n trình. Với n >9 thì dùng cú pháp ${n}
– Chú ý sử dụng IFS để thấy sự phân biệt “$*”
và “$@”
$*, $@ Tất cả các tham số truyền vào chương trình ($1 $2 ...). Hiển thị các tham số truyền vào dưới dạng xâu ("$1 "$*" $2..."). Phân cách các tham số bởi ký tự chứa trong biến IFS. Hiển thị các tham số phân cách riêng biệt bởi dấu nháy "$@" kép ("$1" "$2" ...).
Biến của người dùng
Giá trị của biến
• Cú pháp khai báo:
VARIABLE_NAME=VALUE
• Truy cập đến giá trị biến: $variable_name • Không nhất thiết phải định nghĩa kiểu của
• Chú ý khi làm việc với bash hoặc sh:
biến: – Mọi giá trị đều hiểu là xâu ký tự. – Về cơ bản bash chỉ hỗ trợ phép toán với số
nguyên.
– Tên biến: bắt đầu bằng 1 chữ cái hoặc dấu _ – Không dùng ký tự đặc biệt như: ? , * / ` “ ^ % – Không đặt khoảng trắng giữa bên cạnh dấu = – Có sự phân biệt viết hoa và viết thường – Giá trị NULL :
• Phụ thuộc vào thao tác làm việc với biến (cid:198) Shell xác định kiểu giá trị cần thiết.
• Hoặc không ghi gì ở bên phải • Hoặc gán bằng “”
declare’s options
Ví dụ minh họa
• Thực hiện ví dụ với các lệnh:
a Khai báo biến kiểu mảng
f Khai báo tên hàm
– Echo – Expr, let
i Khai báo biến kiểu số nguyên
p Hiển thị các thuộc tính và giá trị của biến
Khai báo biến chỉ đọc read-only r
x Khai báo biến có thể sử dụng trong các lệnh shell kế tiếp
• declare khai báo với các biến cục bộ (local). • Sử dụng +/- option để tắt/bật các thuộc tính
7
Ví dụ minh họa
Làm việc với mảng (array)
• Khai báo mảng:
• Khai báo biến dạng mảng:
declare –a array_name
• Khởi tạo mảng:
– Khởi tạo từ đầu 1 mảng – Thêm phần tử, truy cập đến phần tử – Lấy giá trị phần tử
array_name=(val1 val2 val3 …)
• Tìm hiểu readonly, declare –r, -p
• Gán giá trị cho các phần tử:
array_name[index]=value
• Lấy giá trị của phần tử:
${array_name[index]}
Variable substitution
Ví dụ minh họa
• Tự nghĩ các ví dụ để thực hiện các sự
Ý nghĩa Cú pháp
thay thế biến này.
${var:-value}
Nếu var bằng NULL hoặc bị unset thì value sẽ được thực hiện thay thế var trong các câu lệnh. Giá trị var không đổi ${var:=value}
Nếu var bằng NULL hoặc bị unset thì value sẽ được gán vào var và thực hiện trong các câu lệnh. ${var:?message} Nếu var bằng NULL hoặc bị unset thì thông báo message hiển thị ở standard error
${var:+value} Nếu var được set thì value sẽ được thực
hiện thay thế var trong các câu lệnh. Giá trị var không đổi
Filename substitution
Command substitution
• Ứng dụng:
– Thực hiện 1 câu lệnh nằm trong 1 câu lệnh
khác.
– Gán kết quả thực hiện 1 câu lệnh vào 1 biến
• Có hai cách thực hiện như sau:
– Cú pháp 1: `command options arguments` – Cú pháp 2: $(command options arguments)
Thay thế cho mọi cụm ký tự bất kỳ (kể cả số ký * tự là 0) Thay thế cho một ký tự bất kỳ ? Chứa 1 trong các ký tự liệt kê trong ngoặc. [abc] Không chứa ký tự nào liệt kê trong ngoặc. [!abc] { a, ile, ax } Chứa các ký tự hay cụm các ký tự khai báo trong ngoặc. Chứa 1 ký tự trong miền từ a-z. [a-z] Không chứa ký tự nào trong miền từ a-z. [!a-z]
Chú ý: chỉ thực hiện với Shell option : noglob off
8
Dấu nháy (quotes)
Arithmetic Expressions
• Có 3 loại dấu nháy được sử dụng trong
• Bash hỗ trợ các cách tính giá trị biểu thức
Shell như sau:
Dấu nháy đơn (single quote )
Dấu nháy kép (double quote )
Dấu nháy ngược (back quote)
‘ “ `
như sau: – Cách 1: $((expression)) – Cách 2: $[expression] – Cách 3: expr expression – Cách 4: let expression hoặc let “expression” – Cách 5: sử dụng chương trình tính : bc, dc – Cách 6: sử dụng awk script
Floating operators
String operators
• Sử dụng tiện ích bc:
Operators Description
• Sử dụng tiện ích dc:
variable=$(echo “OPTIONS; OPERATIONS” | bc) ${#param} ${param%word}
${param%%word} echo “ARGUMENTS OPTIONS OPERATIONS” | dc
• bc được sử dụng thông dụng hơn dc . • Sử dụng tiện ích awk hoặc nawk:
${param#word}
${param##word} Xác định độ dài của xâu Xóa từ cuối param cụm từ chứa word ngắn nhất Xóa từ cuối param cụm từ chứa word dài nhất Xóa từ đầu param cụm từ chứa word ngắn nhất Xóa từ đầu param cụm từ chứa word dài nhất variable=`awk ARGUMENTS AWK_SCRIPT`
Shell Scripts
• Shell Script chỉ là 1 file text (cid:198) soạn thảo bằng bất cứ chương trình soạn thảo nào.
3. Shell programming
• Nội dung của file script bao gồm:
– Các lệnh trong Shell. – Tên các chương trình thực thi. – Các dòng chú thích.
• Để script thực hiện được (cid:198) cần đặt thêm quyền thực hiện cho script (chmod + x ).
9
Shell Script
Shell Scripts
• Gán biến, các phép toán số học, logic. • Câu lệnh điều khiển: – Kiểm tra điều kiện. – Cú pháp rẽ nhánh: if .. then…else…fi.
• Câu lệnh lựa chọn : – Cú pháp: case. – Cú pháp: select
• Các vòng lặp: – Vòng lặp for. – Vòng lặp while. – Vòng lặp until
• Chương trình con : function
Kiểm tra điều kiện.
So sánh số trong test hoặc [ … ]
• Cách xác định giá trị biểu thức logic:
Operator
Returns TRUE (zero exit status) if
int1 –eq int2 int1 –ge int2
int1 is equal to int2 int1 is greater than or equal to int2
• Các phép toán logic: – Làm việc với số – Làm việc với xâu ký tự. – Làm việc với file.
int1 –gt int2
int1 is greater than int2
• Thực hiện với các số nguyên có thể dùng: – ((logic_expression)) hoặc let “logic_expression”
int1 –le int2
int1 is less than or equal int2
• Giá trị logic:
int1 –lt int2
int1 is less than int2
– [ logic_expression ] hoặc test logic_expression
int1 –ne int2
int1 is not equal to int2
Kiểm tra file bằng test hoặc [ … ]
So sánh xâu trong test và [ … ]
Operator
Returns TRUE (zero exit status) if
Operator
Returns TRUE (zero exit status) if
string
string is not null
-b file
file is a block special file
-n string
-c file
file is a character special file
string is not null (and string must be seen by test)
-d file
file is a directory
-z string
-f file
file is an ordinary
string is null (and string must be seen by test)
-g file
file has its set group id (SGID) bit set
String1 = string2
string1 is identical to string2
-k file
file has its sticky bit set
string1 ! = string2
string1 is not identical to string2
-p file
file is a named pipe
– TRUE nếu trả lại kết quả $? = 0 – FALSE nếu trả lại kết quả $? ≠ 0
10
Kiểm tra nhiều biểu thức logic
Kiểm tra file bằng test hoặc [ … ]
•Sử dụng test hoặc [ … ]
Operator
Returns TRUE (zero exit status) if
Operator
Returns TRUE (zero exit status) if
-r file
file is readable by the process
! expr
-s file
file has nonzero length
expr is FALSE; otherwise returns TRUE
-t file
file is open file descriptor associated with a terminal (1 is default)
expr1 –a expr2 expr1 –o expr2
expr1 is TRUE and expr2 is TRUE expr1 is TRUE or expr2 is TRUE
-u file
file has its set user id (SUID) bit set
-w file
file is writable by the process
•Uses: [[(expr1) && (expr2)]] or [[(expr1) || (expr2)]]
-x file
file is executable
•Nên dùng [[(…)]] thay cho […] ???
Ý nghĩa của && và ||
Cú pháp rẽ nhánh if…else…fi
• Thông thường mọi câu lệnh nào được gõ
trên Shell đều được thực hiện.
• Sử dụng &&: cmd1 && cmd2
if condition then if condition then
– Câu lệnh cmd2 chỉ thực hiện khi cmd1 trả lại
kết quả $? = 0
• Sử dụng ||: cmd1 || cmd2
– Câu lệnh cmd2 chỉ thực hiện khi cmd1 trả lại
command1 command2 … fi command1 command2 … else
kết quả $? ≠ 0
Cú pháp elif
condition là giá trị trả lại của biểu thức logic command3 command4 … fi
if_ex1.sh: kiểm tra login user
• Chú ý các hàm:
– Who – Grep – Giá trị trả lại $?
if codition1 then if condition1 then command … command command … else elif condition2 then if condition2 then command … command command … else … if condition3 then elif coditionn then command … else command command … else command … fi fi command command … fi fi
11
if_ex2.sh: print a greeting
Cú pháp case và select
case value in
• Chú ý hàm lấy thời gian: date
pat1) command;;
command;;
…
command;;
select var in wordlist do command(s) done
pat2) command
command;;
…
command;;
• case là 1 dạng câu lệnh rẽ nhánh, tương tự như cú pháp elif
patn) command;;
command;;
…
command;;
•select là cũng là cú pháp rẽ nhánh mở rộng hơn case,có hiển thị menu
esac
Một số ví dụ với for loop
Cú pháp vòng lặp for
for var in 1 2 3 4 5 do for var in $@ do
for var in word1 word2…wordn do
list=“$var $list” args=“$var $args”
done echo "$list" done echo "$args"
for var in [!ef]*.sh do for var do
command command … done
var lần lượt nhận các giá trị word1, word2,..
res="$var $res" args=“$var $args”
done echo "$res" done echo "$args"
Một số ví dụ với while loop
Cú pháp vòng while
• Minh họa công việc của hàm SELECT
thông qua while và case
while condition do
command1 command2 … done
Các câu lệnh command1, command2,.. thực hiện cho đến khi điều kiện condition trả lại giá trị FASLE
12
Ví dụ với until loop
Cú pháp vòng lặp until
• Viết chương trình minh họa bản cửu
chương
until condition do
command1 command2 … done
Các câu lệnh command1, command2,.. thực hiện cho đến khi điều kiện condition trả lại giá trị TRUE
Cú pháp break
Cú pháp continue
4. Debugging Shell Scripts
13
Một số quy tắc viết chương trình
Bố cục chương trình rõ ràng
• Xác định chính xác loại Shell dùng để
thông dịch (cid:198) xác định các cú pháp lệnh
• Dùng tên biến có ý nghĩa và không bị
trùng lặp: – Các biến export liệt kê bởi lệnh: env – Các biến của Shell liệt kê bởi: set
• Viết chú thích cho các dòng, hay khối lệnh
quan trọng.
• Bố cục chương trình hợp lý, dễ nhìn.
Sửa lỗi các chương trình
Chạy ở chế độ debug của Shell
• Shell hỗ trợ các chế độ làm việc sau giúp
• Sử dụng công cụ bash debugger (chỉ chạy
người lập trình dò tìm lỗi:
với bash version ≥ 3.0). Hỗ trợ: – Chạy từng câu lệnh, kiểm tra giá trị biến,.. – Hỗ trợ break point, và nhiều tính năng khác…
set –o option bash -option Ý nghĩa
• Dò lỗi thông qua các lệnh in kết quả ra
stdout hoặc file : echo, printf.
• Chạy ở chế độ debug của bash để hiển thị
các bước làm việc.
-n noexec Không chạy, chỉ kiểm tra cú pháp -v verbose Hiển thị câu lệnh trước khi chạy -x xtrace Hiển thị câu lệnh và kết quả sau khi xử lý nounset Thông báo lỗi nếu như biến chưa được đặt giá trị
Phân loại theo chức năng
5. Shell built-in commands
• Input/Output commands. • Working with Files. • Variables and expressions. • Working with script files. • Others
14
Input/Output commands
Working with files
(cid:131) Chuyển thư mục. vd: cd dir_name. cd
(cid:131) Print working directory – in thư mục làm việc hiện echo pwd tại. (cid:131) In ra stdout các biểu thức, xâu ký tự hay các biến. Kết thúc mỗi lệnh sẽ tự động xuống dòng. Dùng tùy chọn –n để viết trên cùng một dòng. (cid:131) Ví dụ: echo –n “hello” ; echo $A.
pushd (cid:131) Cú pháp: pushd dir_name : đưa thư mục dir_name vào ngăn xếp thư mục (directory stack), và chuyển dir_name thành thư mục làm việc hiện tại. printf (cid:131) In ra màn hình các biến với định dạng cho trước. Các định dạng sử dụng như trong hàm printf( ) trong ngôn ngữ C như: %d, %f, %s,.. (cid:131) Ví dụ: printf “%s -- %d -- %4.2f \n” “abc” 10 11.24 popd (cid:131) Đọc dữ liệu cho các biến từ stdin. Dùng tùy chọn –a (cid:131) Cú pháp: popd . Loại bỏ tên thư mục nằm ở đỉnh ngăn xếp thư mục, đồng thời chuyển thư mục làm việc hiện tại sang thư mục ở đỉnh ngăn xếp. để lấy giá trị của mảng. read (cid:131) Cú pháp: dirs . Liệt kê các thư mục nằm trong ngăn (cid:131) Ví dụ : read –a M => các phần tử mảng M truy cập dirs xếp thư mục. như sau: ${M[ind]}
Variables and Expressions
export (cid:131) Cú pháp: export list_var : cho phép các tiến trình con truy cập đến các biến nằm trong list_var của tiến trình cha. Chiều ngược lại không thực hiện. let (cid:131) Thực hiện một biểu thức toán học đối với các biến. Các phép toán số học được sử dụng trong biểu thức như: +, -, *, /, +=, -=, ++, --, << , >> , &&, ||,.. (cid:131) Xác định kiểu dữ liệu cho các biến. declare, typeset (cid:131) Ví dụ: let a=10 ; let a=a+10 ; (cid:131) Đọc giá trị của biến rồi thực hiện yêu cầu tương ứng (cid:131) Thuộc tính khai báo biến chỉ được đọc tức là biến với giá trị đó. readonly eval chỉ là hằng số. (cid:131) Cú pháp: eval [arg …] .Ví dụ: eval a=\$$i => a là tham số thứ i. (cid:131) Lệnh này dùng để xác định các tùy chọn và các getopts (cid:131) Thay đổi các tham số bên trong chương trình. tham số tương ứng được truyền vào chương trình. set (cid:131) Cú pháp: shift N .Sau mỗi lần gọi lệnh, vị trí các (cid:131) Cú pháp: unset X => Xóa giá trị của biến X, (gán X unset shift bằng rỗng NULL ). tham số sẽ dịch sang trái N vị trí, giá trị N mặc định là 1.
Các câu lệnh khác
Làm việc với script files
true
(cid:131) Câu lệnh trả lại giá trị TRUE (trong Unix là 0 ).
false
(cid:131) Câu lệnh trả lại giá trị FALSE (trong Unix là khác 0 ).
(cid:131) Lệnh này không thực hiện công việc gì, trả lại giá trị là 0 (
exit
:
TRUE )
(cid:131) Cú pháp: type command . Xem thông tin về kiểu câu lệnh, và
(cid:131) Cú pháp: exit VAL . Lệnh thoát khỏi script tại thời điểm gọi hàm, và trả lại giá trị là VAL khi đọc kết quả từ Shell thông qua biến $?. (cid:131) Cú pháp: exec Script_file . Lệnh này yêu cầu thực
type
đường dẫn.
exec hiện một file script tại thời điểm gọi.
enable
(cid:131) Liệt kê tất cả các lệnh Built-in cho phép thực hiện trong Shell.
(cid:131) Nếu không có tham số thì lệnh này sẽ liệt kê các câu lệnh
được đặt bí danh trong Shell.
alias
(cid:131) Cú pháp: alias [name [ = value ]..] gán giá trị value vào các
biến name. Ví dụ: alias la=’ls –la’ ;
(cid:131) Cú pháp: source file_name . Thường được sử dụng để nạp dữ liệu file_name vào script hiện tại. Dot command ( . ) tương tự như source.
unalias
(cid:131) Cú pháp: unalias name. xóa bỏ bí danh cho biến name.
source, dot (.) command (cid:131) Thông thường file_name chứa các biến, các hàm, .. và nó được coi như một module làm việc bổ sung. (cid:131) Ngoài ra, nếu file_name là 1 tập các lệnh Shell, khi
history
(cid:131) Liệt kê các lệnh đã thực hiện trong Shell.
(cid:131) Cú pháp: help command. Xem thông tin về cách sử dụng câu
help
lệnh.
gọi thông qua các hàm này, các lệnh đó sẽ được thực hiện tuần tự từ trên xuống.
15
Các chương trình tiện ích
6. Các tiện ích trong Shell
• Công cụ soạn thảo văn bản VI • Biểu thức chính quy (regular expression) • Công cụ xử lý pattern matching: grep • Streamlined editor – sed • AWK programs • Các công cụ khác
VI editor
Một số cách sử dụng vi
• VI là 1 chương trình soạn thảo tương tác với
người dùng theo 2 chế độ: – Chế độ dòng lệnh (command mode) – Chế độ soạn thảo (text mode)
• Bắt đầu chạy bằng cách gõ: vi text_file để soạn thảo hoặc chỉnh sửa nội dung file. • Chế độ comand được vi hỗ trợ như sau:
– Thêm, chèn text vào file. – Xóa, chỉnh sửa nội dung file. – Ghi nội dung vào file – Làm việc với các lệnh xử lý biểu thức chính
quy.
• Chế độ text : người dùng soạn thảo như
bình thường.
Dịch chuyển con trỏ
Thêm nội dung vào file
Nhấn phím Ý nghĩa Nhấn phím Ý nghĩa
h, l Sang trái, sang phải 1 ký tự;
k, j Lên trên, xuống dưới 1 dòng
G, nG Chuyển đến dòng cuối file, đến dòng thứ n
G$ Đến cuối dòng hiện tại
w, b Chuyển đến từ kế tiếp, từ đứng trước.
L,M,H Chuyển đến dòng đầu, giữa,cuối cửa sổ a A i I o O :r file :nr file :w, :q Thêm text vào sau con trỏ Thêm text vào cuối dòng hiện tại Thêm text vào trước con trỏ Thêm text vào đầu dòng hiện tại Chèn text vào dưới dòng hiện tại Chèn text vào trên dòng hiện tại Đọc file và thêm vào sau dòng hiện tại Đọc file và thêm vào sau dòng thứ n Ghi nội dung vào file, thoát khỏi vi editor
16
Tìm kiếm và thay thế
Xóa nội dung trong file
Cú pháp
Ý nghĩa
/text, ?text
Tìm text từ đầu , từ cuối file.
Nhấn phím Ý nghĩa
n, N
Tiếp tục tìm theo cùng ,ngược hướng đang
thực hiện
Xóa 1 ký tự đứng sau , trước vị trí con trỏ x , X
ftext, Ftext
Tìm từ đầu dòng, tìm từ cuối dòng hiện tại
Xóa n ký tự đứng sau , trước vị trí con trỏ nx, nX
:set ic, :set noic
Không phân biệt, phân biệt viết hoa viết
thường
Xóa 1 từ đứng sau, trước vị trị con trỏ dw, db ndw, ndb Xóa n từ đứng sau, trước vị trị con trỏ
:s/oldtext/newtext/
Thay thế oldtext bởi newtext
Xóa toàn bộ dòng dd
:m,ns/oldtext/newtext/
Thay thế oldtext bởi newtext từ dòng m đến
dòng n
Xóa tất cả từ dòng hiện tại đến hết file dG
:g/text1/s/text2/text3
Tìm dòng chứa text1, thay thế text2 bởi text3
Xóa từ dòng thứ n đến dòng thứ m :n,md
:g/text/command
Chạy lệnh trên các dòng chứa text
Xóa từ vị trí con trỏ đến hết file D, d$
:v/text/command
Chạy lệnh trên các dòng không chứa text
regular expression
Biểu thức chính quy
c k s
• Là một mẫu các ký tự (pattern of
UNIX Tools rocks.
characters) được dùng để so sánh với các cụm từ khác trong quá trình tìm kiếm.
match
• Biểu diễn pattern phụ thuộc vào tools xử lý
UNIX Tools sucks.
nó: – Trong sed,awk, vi: /pattern/ – Trong grep : ‘pattern’
match
• Sức mạnh của pattern là dùng các ký tự
đặc biệt (metacharacters).
UNIX Tools is okay.
no match
Bảng các ký tự đặc biệt
Bảng các ký tự đặc biệt
awk Action Action vi • sed • grep • Symbol . vi • sed • awk • grep • • * • • • • Symbol \n { } \{ \} • • Replay subpattern in match. Match a range of instances. Match a range of instances. Match word's beginning or ^ • • • • \< \> • end. $ • • • • Match one or more preceding • + characters. \ • • • • Match zero or one preceding • ? characters. [ ] • • • •
\( \) • • • Match any character. Match zero or more preceding characters. Match beginning of line/string. Match end of line/string. Escape following character. Match one from a set. Store pattern for later replay. • • | ( ) Separate choices to match. Group expressions to match
17
/^[A–Z]..$/ (cid:198) trả lại dòng số 5
Thực hiện ví dụ với VI
/^[A–Z][a–z ]*3[0–5]/ (cid:198) trả lại dòng số 2
/[a–z]*\./ (cid:198) trả lại dòng số 1,2,7,8
/^ *[A–Z][a–z][a–z]$/ (cid:198) 4: Tom 5:Dan
/^[A–Za–z]*[^,][A–Za–z]*$/ (cid:198) dòng số 5
18
Kết quả sau thay thế :1,$s/\([0o]ccur\)ence/\1rence/
Chú ý cách lưu trữ và thay thế tags
19
Chú ý cách lưu trữ và thay thế tags
Công cụ GREP
• GREP - General Regular Expression Parser: là công cụ xử lý các biểu thức chính quy với mục đích: tìm và in các dòng text trong file thỏa mãn biểu thức chính quy.
• Cùng họ với grep còn có:
– egrep – extended grep: hỗ trợ nhiều
metacharacters hơn.
– fgrep – fixed or fast grep: coi tất cả mọi ký tự
đều là các ký tự văn bản thường.
grep Family
Sử dụng grep
• Syntax
• Cú pháp : grep ‘pattern’ fname1 fname2 … • Một số chú ý:
grep [-hilnv] [-e expression] [filename] egrep [-hilnv] [-e expression] [-f filename] [expression] [filename]
– pattern trong grep nên để trong nháy đơn để loại bỏ các ý nghĩa đặc biệt khác của ký tự. – Tham số thứ hai có thể là tên file text hoặc có thể là output của 1 câu lệnh khác thông qua cơ chế pipe.
– Nếu tìm thấy thì trả lại $? = 0, ngược lại thì
giá trị $? ≠ 0.
Ignore case List only filenames containing matching lines fgrep [-hilnxv] [-e string] [-f filename] [string] [filename] – -h Do not display filenames – -i – -l – -n Precede each matching line with its line number
– -v Negate matches – -x Match whole line only (fgrep only) – -e expression Specify expression as option – -f filename Take the regular expression (egrep) a list of strings (fgrep) from filename or
Ví dụ với grep: datafile
Một số câu lệnh cơ bản
$grep NW datafile
northwest NW Charles Main 3.0 .98 3 34
•Tìm trên nhiều file
$ grep NW d*
datafile: northwest NW Charles Main 3.0 .98 3 34
db: northwest NW Joel Craig 30 40 5 123
20
Làm việc với biêu thức chính quy
Chú ý khoảng trắng
$ grep TB Savage datafile
$grep '4$' datafile
grep: Savage: No such file or directory
northwest NW Charles Main 3.0 .98 3 34
datafile: eastern EA TB Savage 4.4 .84 5 20
$ grep '^n' datafile
$ grep 'TB Savage' datafile
eastern EA TB Savage 4.4 .84 5 20
northwest NW Charles Main 3.0 .98 3 34 northeast NE AM Main Jr. 5.1 .94 3 13 north NO Margot Weber 4.5 .89 5 9
Chú ý cách sử dụng dấu \
Một số ví dụ khác
$ grep '5\..' datafile
$ grep '\ northwest NW Charles Main 3.0 .98 3 34
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9 western WE Sharon Gray 5.3 .97 5 23
southern SO Suan Chin 5.1 .95 4 15
northeast NE AM Main Jr. 5.1 .94 3 13
central CT Ann Stephens 5.7 .94 5 13 $ grep '\.5' datafile $ grep '[a-z]\{9\}' datafile north NO Margot Weber 4.5 .89 5 9 northwest NW Charles Main 3.0 .98 3 34
southwest SW Lewis Dalsass 2.7 .8 2 18
southeast SE Patricia Hemenway 4.0 .7 4 17
northeast NE AM Main Jr. 5.1 .94 3 13 • SED: non-interactive editor: – Hỗ trợ các chức năng giống như vi
– Người dùng thực hiện các lệnh thay vì trực tiếp chỉnh sửa nội dung trên màn hình. – Không thay đổi nội dung của file, trừ khi lưu trữ output thông qua shell redirection. • Nhận dữ liệu đầu vào là file text
• Đưa từng dòng (line) của file vào buffer và xử lý bởi các lệnh yêu cầu của người dùng. – Hỗ trợ SED-script: là 1 tập các câu lệnh được sed hỗ trợ. • In kết quả sau xử lý ra màn hình.
• Xóa dòng vừa xử lý trong buffer và thực hiện tương tự với dòng kế tiếp. • Syntax: sed [-n] [-e] [‘request’] [file…] • Cú pháp một yêu cầu: sed [-n] [-f scriptfile] [file…] – [address[, address]][!]command [arguments] • Một số chú ý: – Địa chỉ (address) có thể là – -n - only print lines specified with the print command (or the ‘p’ flag of the substitute (‘s’)
command) – -f scriptfile - next argument is a filename containing editing commands • Chỉ số dòng văn bản trong file text
• Dòng văn bản hỏa mãn điều kiện của 1 biểu thức chính quy /pattern/. – -e command - the next argument is an editing – Câu lệnh (command) là các ký tự
– Thông thường yêu cầu thực hiện được đặt
trong dấu nháy đơn: sed ‘user_request’ command rather than a filename, useful if multiple
commands are specified – If the first line of a scriptfile is “#n”, sed acts as though -n had been specified • Một số chú ý (tiếp): • Một số lệnh cơ bản trong SED (được sử – Một yêu cầu có tối đa là 2 địa chỉ: dụng thường xuyên): • Nếu chỉ có 1 địa chỉ thì câu lệnh sẽ thực hiện với 1 dòng văn bản tương ứng địa chỉ đó. – Dấu ! có nghĩa là phủ định. Ví dụ: addr!cmd • Nếu có 2 địa chỉ thì câu lệnh thực hiện với tất cả
các dòng văn bản từ địa chỉ thứ nhất đến địa chỉ
thứ hai. nghĩa là thực hiện câu lệnh cmd với các dòng
mà không có địa chỉ là addr. • d - delete
•p - print
• y - transform
• q - quit • s - substitute
• a - append
• i - insert
• c - change • d • 6d • /^$/d • 1,10d • 1,/^$/d • /^$/,$d • /^$/,10d • /^ya*y/,/[0-9]$/d deletes from the first line that begins deletes the all lines
deletes line 6
deletes all blank lines
deletes lines 1 through 10
deletes from line 1 through the first blank line
deletes from the first blank line through the last line of the file deletes from the first blank line through line 10 with yay, yaay, yaaay, etc. through
the first line that ends with a digit • Syntax: [address(es)]s/pattern/replacement/[flags]
– pattern - search pattern
– replacement - replacement string for pattern
– flags - optionally any of the following • n • g • p a number from 1 to 512 indicating which
occurrence of pattern should be
replaced
global, replace all occurrences of pattern
in pattern space
print contents of pattern space • Là công cụ xử lý văn bản rất mạnh: – Hỗ trợ bộ lọc (filter) với biểu thức chính quy (pattern matching) – Hỗ trợ làm việc với số (numerical)
– Hỗ trợ khả năng phân chia các trường (field) trên các dòng văn bản. – Hỗ trợ cú pháp lập trình như ngôn ngữ C.
– Lấy input từ : file, redirect, pipe,stdin,... • Mạnh hơn nhiều so với SED. Mặc định dấu phân cách là:
• Một hoặc nhiều khoảng trắng
• Tab • Các cách chạy 1 chương trình AWK: – awk 'program' input_file(s) • program và input_files được lấy từ các tham số – awk -f program_file input_files truyền vào awk
– awk 'program' • program được truyền vào dưới dạng tham số, dữ liệu lấy từ stdin (bàn phím) • Chương trình program được đọc từ file • Chương trình awk chứa các • Mỗi 1 chương trình đều có ít nhất một
pattern hoặc một action hoặc cả hai thành phần sau:
– Khối BEGIN: • pattern mặc định sẽ tương thích với mọi • Thực hiện trước khi đọc dữ liệu input dòng thỏa mãn biểu thức chính quy • action là in kết quả hiện tại ra màn hình
• patterns được viết trong cú pháp biểu thức chính quy; • Thực hiện sau khi đã đọc hết dữ liệu input. • actions được đặt trong ngoặc { } BEGIN {action} pattern {action} pattern {action} . – pattern - action pairs
• Lấy dữ liệu đầu vào
• Thực hiện các lệnh với các dữ liệu . . – Khối END pattern { action} END {action} Number of fields in current record • action có thể thực hiện các các câu lệnh Number of records so far Output format for numbers Output field separator kiểu ngôn ngữ C như:
– Các biểu thức với xâu ký tự hoặc với số.
– Các hàm in/out dữ liệu. Output record separator Length of string matched by match function Input record separator • action thực hiện trên các dòng được đọc
trong buffer thỏa mãn điều kiện pattern.
– Nếu pattern không thiết lập, action sẽ thực Offset of string matched by match function hiện với mọi dòng. The record terminator; gawk sets it to the input text that
matched the character or regex specified by RS – Nếu action không thiết lập, tất cả các dòng sẽ Subscript separator được hiển thị.. Number of fields in current record Number of records so far Output format for numbers Output field separator Output record separator Length of string matched by match function Input record separator Offset of string matched by match function The record terminator; gawk sets it to the input text that
matched the character or regex specified by RS Subscript separatorNhiệm vụ của SED
Streamlined editor - SED
21
Sử dụng SED
sed Syntax
Sử dụng SED
Sed Commands
Một số ví dụ minh họa
Address and Command
Examples
22
Substitute
23
Giới thiệu về AWK
Một số ví dụ minh họa
24
Thực hiện chương trình AWK
Cấu trúc chương trình AWK
Cấu trúc Pattern-Action
Các biến builtin trong awk
Actions
NF
NR
OFMT
OFS
ORS
RLENGTH
RS
RSTART
RT
SUBSEP
25
Các biến builtin trong awk
NF
NR
OFMT
OFS
Thank you!
ORS
RLENGTH
RS
RSTART
RT
SUBSEP
26