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

Nhiệm vụ của SED

Streamlined editor - SED

• 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.

21

Sử dụng SED

sed Syntax

• 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

Sử dụng SED

Sed Commands

• 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

Một số ví dụ minh họa

Address and Command Examples

• 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

22

Substitute

• 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

23

Giới thiệu về AWK

• 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ột số ví dụ minh họa

Mặc định dấu phân cách là: • Một hoặc nhiều khoảng trắng • Tab

24

Thực hiện chương trình AWK

• 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

Cấu trúc chương trình AWK

Cấu trúc Pattern-Action

• 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}

Các biến builtin trong awk

Actions

Number of fields in current record

NF

• action có thể thực hiện các các câu lệnh

Number of records so far

NR

Output format for numbers

OFMT

Output field separator

OFS

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

ORS

Length of string matched by match function

RLENGTH

Input record separator

RS

• 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

RSTART

hiện với mọi dòng.

RT

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

SUBSEP

được hiển thị..

25

Các biến builtin trong awk

Number of fields in current record

NF

Number of records so far

NR

Output format for numbers

OFMT

Output field separator

OFS

Thank you!

Output record separator

ORS

Length of string matched by match function

RLENGTH

Input record separator

RS

Offset of string matched by match function

RSTART

RT

The record terminator; gawk sets it to the input text that matched the character or regex specified by RS

Subscript separator

SUBSEP

26