ngo duy hoa - khmt - cntt - dhbk - hn
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 lời gọi hệ thống.
– Các chương trình tiện ích hệ thống.
• 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.
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
1
ngo duy hoa - khmt - cntt - dhbk - hn
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
• sh Bourne Shell (Original Shell) (Steven Bourne
of AT&T)
• csh C-Shell (C-like Syntax)(Bill Joy of Univ. of
California)
• ksh Korn-Shell (Bourne+some C-shell)(David
Korn of AT&T)
• tcsh Turbo C-Shell (More User Friendly CShell).
• bash Bourne Again Shell (GNU Improved
Bourne Shell)
Các loại Shells
Dấu nhắc đợi lệnh
• Nhận diện shell đang làm việc: lệnh echo
$echo $SHELL
/bin/sh
hoặc
%echo $shell
/bin/csh
• Dấu nhắc lệnh
–#
–%
–$
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
• Khuyến khích dùng Bash Shell
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 Ỉ 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 Æ bật chương trình Shell
tương ứng cho người dùng.
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
2
ngo duy hoa - khmt - cntt - dhbk - hn
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 lm vic Shell
Startup Shell
ã c file cu hỡnh ặ thit lập mơi trường:
• Chế độ tương tác (interactive):
•
•
•
•
•
•
•
•
•
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
• Đọc nội dung các file, tự viết thêm các
hàm hoặc các alias hoặc export của mình
– Login shell (/bin/login) đọc các file:
• /etc/profile.
• ~/.bash_profile.
– Non-login shell (/bin/bash, icon,..) đọc file:
• Kế thừa từ Shell cha (parent enviroment).
• ~/.bashrc.
• Chế độ khơng tương tác (non-interactive):
– Kế thừa môi trường từ Shell cha.
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
3
ngo duy hoa - khmt - cntt - dhbk - hn
Basic Shell options
Interactive Non-login Shell
• Kiểm tra kết quả của sự thay đổi trên bằng
cách chạy lại chương trình Shell
Option
Description
emacs
Enters emacs editing mode (on by default)
ignoreeof
Doesn't allow use of a single CTRL-D to log off; use the exit
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
noglob
Doesn't expand filename wildcards like * and ? (wildcard
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 ặ lit kờ, t hoc b options
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ự *, ?
Interactive Shell
Các ký tự đặc biệt trong Shell
Character
;
&
()
|
<>&
*?[]~+-@!
“‘\
`
Meaning
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
•
Các bước xử lý dòng lệnh trong Shell:
1.
2.
3.
4.
5.
6.
7.
8.
Bật chế độ ghi nhật ký (history).
Phân tích cú pháp thành các cụm từ (tokens)
Cập nhật lại nhật ký (history updated).
Xử lý các dấu nháy (quotes).
Xác định các aliases và functions.
Thiết lập: redirect, background, pipe.
Thay thế giá trị cho các biến (variables).
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.
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
4
ngo duy hoa - khmt - cntt - dhbk - hn
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)?
Nu khụng tha món ặ thụng bỏo li.
ã Thực hiện chương trình trong Shell???
Cú pháp (Syntax)
$ command options arguments
• Có hai loại options:
– Short options: viết tắt bởi các chữ cái : -o
– Long options: viết đầy đủ tên : --option_name
Commands & Arguments
• $ mv oldfile newfile
mv
arguments
oldfile
newfile
• $ echo Smile, you are in Bridgeport City
Smile, you are in Bridgeport City
Smile,
$
you
echo
arguments
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
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
5
ngo duy hoa - khmt - cntt - dhbk - hn
Chuyển hướng vào/ra (Redirect)
Common redirection examples
• 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
Kênh truyền dữ liệu Pipe
• Standard Output của command này sẽ là
Standard Input của command kế tiếp.
• Có thể thực hiện với nhiều pipes :
Biến môi trường trong Shell
Liệt kê thông qua lệnh $set hoặc $env
Tên biến = Giá trị
Tên Shell sử dụng mặc định.
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
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
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.
PWD = /home/khmt
Thư mục làm việc hiện tại mặc định.
PS1, PS2
Các dấu nhắc lệnh (prompt) cấp bậc 1 và
2.
SHELL = /bin/bash
Tên chương trình Shell.
USER = khmt
Tên người dùng đang làm việc hiện tại.
USERNAME = khmt
Ý nghĩa
BASH = /bin/bash
Built-in Shell variables
Variable
Variable
$#
Tổng số tham số truyền vào chương trình
$_
Tham số hoặc lựa chọn (option) đang thực hiện với
câu lệnh (chương trình)
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.
$!
FUNCNAME
Tên của hàm đang làm việc hiện tại.
Chỉ số của tiến trình cuối cùng làm việc ở chế độ
nền (background).
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
6
ngo duy hoa - khmt - cntt - dhbk - hn
Built-in Shell variables
$0
Tên của (câu lệnh) chương trình đang thực hiện.
$n
Xác định giá trị của tham số thứ n truyền vào chương
trình. Với n >9 thì dùng cú pháp ${n}
$*, $@
"$*"
"$@"
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" ...).
Ví dụ minh họa
• Tự nghĩ các ví dụ minh họa cho các biến
trong Shell
– Chú ý dùng các lệnh: set để truyền tham số
vào chương trình.
– Chú ý sử dụng IFS để thấy sự phân biệt “$*”
và “$@”
Biến của người dùng
• Cú pháp khai báo:
VARIABLE_NAME=VALUE
• Chú ý khi làm việc với bash hoặc sh:
– 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 :
• Hoặc khơng ghi gì ở bên phải
• Hoặc gán bằng “”
Giá trị của biến
• 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
biến:
– Mọi giá trị đều hiểu là xâu ký tự.
– Về cơ bản bash chỉ hỗ trợ phép tốn với số
ngun.
• Phụ thuộc vào thao tác làm việc với biến
Ỉ Shell xác định kiểu giá trị cần thiết.
declare’s options
Ví dụ minh họa
• Thực hiện ví dụ với các lệnh:
– Echo
– Expr, let
a
Khai báo biến kiểu mảng
f
Khai báo tên hàm
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
r
Khai báo biến chỉ đọc read-only
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
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
7
ngo duy hoa - khmt - cntt - dhbk - hn
Làm việc với mảng (array)
• Khai báo biến dạng mảng:
declare –a array_name
• Khởi tạo mảng:
array_name=(val1 val2 val3 …)
• Gán giá trị cho các phần tử:
Ví dụ minh họa
• Khai bá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ử
• Tìm hiểu readonly, declare –r, -p
array_name[index]=value
• Lấy giá trị của phần tử:
${array_name[index]}
Variable substitution
Cú pháp
Ý nghĩa
${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
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.
Nếu var bằng NULL hoặc bị unset thì thơng
báo message hiển thị ở standard error
${var:=value}
${var:?message}
${var:+value}
• Tự nghĩ các ví dụ để thực hiện các sự
thay thế biến này.
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
*
Ví dụ minh họa
?
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ỳ
[abc]
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.
{ a, ile, ax }
[a-z]
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.
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)
Chú ý: chỉ thực hiện với Shell option : noglob off
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
8
ngo duy hoa - khmt - cntt - dhbk - hn
Dấu nháy (quotes)
• Có 3 loại dấu nháy được sử dụng trong
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)
Floating operators
• Sử dụng tiện ích bc:
variable=$(echo “OPTIONS; OPERATIONS” | bc)
• Sử dụng tiện ích dc:
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:
variable=`awk ARGUMENTS AWK_SCRIPT`
Arithmetic Expressions
• Bash hỗ trợ các cách tính giá trị biểu thức
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
String operators
Operators
${#param}
${param%word}
Description
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
${param%%word} Xóa từ cuối param cụm từ chứa word
dài nhất
${param#word}
Xóa từ đầu param cụm từ chứa word
ngắn nhất
${param##word}
Xóa từ đầu param cụm từ chứa word
dài nhất
Shell Scripts
3. Shell programming
• Shell Script chỉ là 1 file text Ỉ soạn thảo
bằng bất cứ chương trình soạn thảo nào.
• 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 thc hin c ặ cn t thờm
quyn thực hiện cho script (chmod + x ).
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
9
ngo duy hoa - khmt - cntt - dhbk - hn
Shell Script
Shell Scripts
• Gán biến, các phép tố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:
– [ logic_expression ] hoặc test logic_expression
• 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.
• Thực hiện với các số ngun có thể dùng:
– ((logic_expression)) hoặc let “logic_expression”
• Giá trị logic:
– TRUE nếu trả lại kết quả $? = 0
– FALSE nếu trả lại kết quả $? ≠ 0
So sánh xâu trong test và [ … ]
Operator
Returns TRUE (zero exit status) if
int1 –eq int2
int1 is equal to int2
int1 –ge int2
int1 is greater than or equal to int2
int1 –gt int2
int1 is greater than int2
int1 –le int2
int1 is less than or equal int2
int1 –lt int2
int1 is less than int2
int1 –ne int2
int1 is not equal to int2
Kiểm tra file bằng test hoặc [ … ]
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
string is not null (and string must
be seen by test)
-c file
file is a character special file
-z string
string is null (and string must be
seen by test)
-d file
file is a directory
-f file
file is an ordinary
String1 = string2
string1 is identical to string2
-g file
file has its set group id (SGID) bit set
-k file
file has its sticky bit set
-p file
file is a named pipe
string1 ! = string2 string1 is not identical to string2
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
10
ngo duy hoa - khmt - cntt - dhbk - hn
Kiểm tra file bằng test hoặc [ … ]
Kiểm tra nhiều biểu thức logic
•Sử dụng test hoặc [ … ]
Operator
Returns TRUE (zero exit status) if
-r file
file is readable by the process
-s file
file has nonzero length
-t file
Operator
Returns TRUE (zero exit status) if
! expr
expr is FALSE; otherwise returns
TRUE
file is open file descriptor associated with
a terminal (1 is default)
expr1 –a expr2
expr1 is TRUE and expr2 is TRUE
-u file
file has its set user id (SUID) bit set
expr1 –o expr2
expr1 is TRUE or expr2 is TRUE
-w file
file is writable by the process
-x file
file is executable
Ý nghĩa của && và ||
• 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
– 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
kết quả $? ≠ 0
if_ex1.sh: kiểm tra login user
• Chú ý các hàm:
– Who
– Grep
– Giá trị trả lại $?
•Uses: [[(expr1) && (expr2)]] or [[(expr1) || (expr2)]]
•Nên dùng [[(…)]] thay cho […] ???
Cú pháp rẽ nhánh if…else…fi
if condition
then
command1
command2
…
fi
condition là giá trị trả lại
của biểu thức logic
if condition
then
command1
command2
…
else
command3
command4
…
fi
Cú pháp elif
if condition1
then
command
…
else
if condition2
then
command
…
else
if condition3
then
command
…
else
command
…
fi
fi
fi
if codition1
then
command
command
…
elif condition2
then
command
command
…
…
elif coditionn
then
command
command
…
else
command
command
…
fi
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
11
ngo duy hoa - khmt - cntt - dhbk - hn
if_ex2.sh: print a greeting
• Chú ý hàm lấy thời gian: date
Cú pháp vòng lặp for
for var in word1 word2…wordn
do
command
command
…
done
var lần lượt nhận các giá trị word1, word2,..
Cú pháp vòng while
while condition
do
command1
command2
…
done
Cú pháp case và select
case value in
pat1) command;;
command;;
…
command;;
pat2) command
command;;
…
command;;
patn) command;;
command;;
…
command;;
esac
select var in wordlist
do
command(s)
done
• case là 1 dạng câu lệnh rẽ
nhánh, tương tự như cú
pháp elif
•select là cũng là cú pháp rẽ
nhánh mở rộng hơn case,có
hiển thị menu
Một số ví dụ với for loop
for var in 1 2 3 4 5
do
list=“$var $list”
done
echo "$list"
for var in $@
do
args=“$var $args”
done
echo "$args"
for var in [!ef]*.sh
do
res="$var $res"
done
echo "$res"
for var
do
args=“$var $args”
done
echo "$args"
Một số ví dụ với while loop
• Minh họa cơng việc của hàm SELECT
thơng qua while và case
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
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
12
ngo duy hoa - khmt - cntt - dhbk - hn
Cú pháp vịng lặp until
until condition
do
command1
command2
…
done
Ví dụ với until loop
• Viết chương trình minh họa bản cửu
chương
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
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
13
ngo duy hoa - khmt - cntt - dhbk - hn
Bố cục chương trình rõ ràng
Một số quy tắc viết chương trình
• Xác định chính xác loại Shell dùng để
thơng dch ặ xỏc nh cỏc cỳ phỏp lnh
ã 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
• Sử dụng cơng cụ bash debugger (chỉ chạy
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…
• 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.
Chạy ở chế độ debug của Shell
• Shell hỗ trợ các chế độ làm việc sau giúp
người lập trình dị tìm lỗi:
set –o option bash -option
noexec
-n
Ý nghĩa
Không chạy, chỉ kiểm tra cú pháp
verbose
-v
Hiển thị câu lệnh trước khi chạy
xtrace
-x
Hiển thị câu lệnh và kết quả sau khi
xử lý
Thông báo lỗi nếu như biến chưa
được đặt giá trị
nounset
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
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
14
ngo duy hoa - khmt - cntt - dhbk - hn
Input/Output commands
echo
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.
Ví dụ: echo –n “hello” ; echo $A.
printf
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,..
Ví dụ: printf “%s -- %d -- %4.2f \n” “abc” 10 11.24
read
Đọc dữ liệu cho các biến từ stdin. Dùng tùy chọn –a
để lấy giá trị của mảng.
Ví dụ : read –a M => các phần tử mảng M truy cập
như sau: ${M[ind]}
Working with files
Chuyển thư mục. vd: cd dir_name.
cd
Print working directory – in thư mục làm việc hiện
tại.
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
pushd
dir_name thành thư mục làm việc hiện tại.
pwd
popd
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.
dirs
Cú pháp: dirs . Liệt kê các thư mục nằm trong ngăn
xếp thư mục.
Variables and Expressions
let
eval
set
unset
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ư: +, -, *, /, +=, -=, ++, --, << , >> , &&, ||,..
Ví dụ: let a=10 ; let a=a+10 ;
Đọc giá trị của biến rồi thực hiện yêu cầu tương ứng
với giá trị đó.
Cú pháp: eval [arg …] .Ví dụ: eval a=\$$i => a là
tham số thứ i.
Thay đổi các tham số bên trong chương trình.
Cú pháp: unset X => Xóa giá trị của biến X, (gán X
bằng rỗng NULL ).
Làm việc với script files
declare,
typeset
Xác định kiểu dữ liệu cho các biến.
readonly
Thuộc tính khai báo biến chỉ được đọc tức là biến
chỉ là hằng số.
getopts
Lệnh này dùng để xác định các tùy chọn và các
tham số tương ứng được truyền vào chương trình.
shift
Cú pháp: shift N .Sau mỗi lần gọi lệnh, vị trí các
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
true
Câu lệnh trả lại giá trị TRUE (trong Unix là 0 ).
Câu lệnh trả lại giá trị FALSE (trong Unix là khác 0 ).
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 $?.
false
exit
exec
Cú pháp: exec Script_file . Lệnh này yêu cầu thực
hiện một file script tại thời điểm gọi.
type
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.
source,
Thông thường file_name chứa các biến, các hàm, ..
dot (.)
và nó được coi như một module làm việc bổ sung.
command
Ngoài ra, nếu file_name là 1 tập các lệnh Shell, khi
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.
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.
export
:
enable
alias
Lệnh này khơng thực hiện cơng việc gì, trả lại giá trị là 0 (
TRUE )
Cú pháp: type command . Xem thông tin về kiểu câu lệnh, và
đường dẫn.
Liệt kê tất cả các lệnh Built-in cho phép thực hiện trong Shell.
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.
Cú pháp: alias [name [ = value ]..] gán giá trị value vào các
biến name. Ví dụ: alias la=’ls –la’ ;
unalias Cú pháp: unalias name. xóa bỏ bí danh cho biến name.
history Liệt kê các lệnh đã thực hiện trong Shell.
help
Cú pháp: help command. Xem thông tin về cách sử dụng câu
lệnh.
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
15
ngo duy hoa - khmt - cntt - dhbk - hn
Các chương trình tiện ích
6. Các tiện ích trong Shell
VI editor
• 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)
•
•
•
•
•
•
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
Một số cách sử dụng vi
• 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ỏ
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ổ
Thêm nội dung vào file
Nhấn phím
a
A
i
I
o
O
:r file
:nr file
:w, :q
Ý nghĩa
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
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
16
ngo duy hoa - khmt - cntt - dhbk - hn
Tìm kiếm và thay thế
Xóa nội dung trong file
Nhấn phím
Ý nghĩa
Cú pháp
Ý nghĩa
/text, ?text
Tìm text từ đầu , từ cuối file.
n, N
Tiếp tục tìm theo cùng ,ngược hướng đang
thực hiện
x,X
Xóa 1 ký tự đứng sau , trước vị trí con trỏ
nx, nX
Xóa n ký tự đứng sau , trước vị trí con trỏ
ftext, Ftext
Tìm từ đầu dịng, tìm từ cuối dịng hiện tại
dw, db
Xóa 1 từ đứng sau, trước vị trị con trỏ
:set ic, :set noic
ndw, ndb
Xóa n từ đứng sau, trước vị trị con trỏ
Không phân biệt, phân biệt viết hoa viết
thường
:s/oldtext/newtext/
Thay thế oldtext bởi newtext
dd
Xóa tồn bộ dịng
:m,ns/oldtext/newtext/
dG
Xóa tất cả từ dòng hiện tại đến hết file
Thay thế oldtext bởi newtext từ dịng m đến
dịng n
:n,md
Xóa từ dịng thứ n đến dịng thứ m
:g/text1/s/text2/text3
Tìm dịng chứa text1, thay thế text2 bởi text3
D, d$
Xóa từ vị trí con trỏ đến hết file
:g/text/command
Chạy lệnh trên các dòng chứa text
:v/text/command
Chạy lệnh trên các dịng khơng chứa text
Biểu thức chính quy
regular expression
• Là một mẫu các ký tự (pattern of
characters) được dùng để so sánh với các
cụm từ khác trong quá trình tìm kiếm.
• Biểu diễn pattern phụ thuộc vào tools xử lý
nó:
c k s
UNIX Tools rocks.
match
UNIX Tools sucks.
– 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
Symbol
.
vi
•
sed
•
awk
•
*
•
•
•
^
•
•
•
$
•
•
•
\
•
•
•
[]
•
•
•
\( \)
•
•
grep
Action
•
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.
Bảng các ký tự đặc biệt
Symbol vi
\n
•
{}
\{ \}
\< \>
sed
•
awk
•
•
•
+
•
?
•
|
()
•
•
grep
Action
•
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.
Separate choices to match.
Group expressions to match
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
17
ngo duy hoa - khmt - cntt - dhbk - hn
Thực hiện ví dụ với VI
/^[A–Z]..$/ Ỉ trả lại dịng số 5
/^[A–Z][a–z ]*3[0–5]/ Ỉ trả lại dịng số 2
/[a–z]*\./ Ỉ trả lại dịng số 1,2,7,8
/^ *[A–Z][a–z][a–z]$/ Ỉ 4: Tom 5:Dan
/^[A–Za–z]*[^,][A–Za–z]*$/ Æ dòng số 5
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
18
ngo duy hoa - khmt - cntt - dhbk - hn
Kết quả sau thay thế
:1,$s/\([0o]ccur\)ence/\1rence/
Chú ý cách lưu trữ và thay thế tags
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
19
ngo duy hoa - khmt - cntt - dhbk - hn
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.
Sử dụng grep
• Cú pháp : grep ‘pattern’ fname1 fname2 …
• Một số chú ý:
– 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.
Ví dụ với grep: datafile
grep Family
• Syntax
grep [-hilnv] [-e expression] [filename]
egrep [-hilnv] [-e expression] [-f filename] [expression]
[filename]
fgrep [-hilnxv] [-e string] [-f filename] [string] [filename]
– -h Do not display filenames
– -i Ignore case
– -l List only filenames containing matching lines
– -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)
or
a list of strings (fgrep) from filename
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
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
20
ngo duy hoa - khmt - cntt - dhbk - hn
Làm việc với biêu thức chính quy
Chú ý khoảng trắng
$grep '4$' datafile
$ grep TB Savage datafile
northwest NW Charles Main 3.0 .98 3 34
grep: Savage: No such file or directory
datafile: eastern EA TB Savage 4.4 .84 5 20
$ grep '^n' datafile
$ grep 'TB Savage' datafile
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 \
WE
SO
NE
CT
Sharon Gray
Suan Chin
AM Main Jr.
Ann Stephens
Một số ví dụ khác
$ grep '\
$ grep '5\..' datafile
western
southern
northeast
central
eastern EA TB Savage 4.4 .84 5 20
5.3
5.1
5.1
5.7
.97
.95
.94
.94
5
4
3
5
23
15
13
13
$ grep '\.5' datafile
north NO Margot Weber 4.5 .89 5 9
Streamlined editor - SED
northwest NW Charles Main 3.0 .98
northeast NE AM Main Jr.
5.1 .94
north
NO Margot Weber 4.5 .89
3 34
3 13
5 9
$ grep '[a-z]\{9\}' datafile
northwest NW
southwest SW
southeast SE
northeast NE
Charles Main
Lewis Dalsass
Patricia Hemenway
AM Main Jr.
3.0
2.7
4.0
5.1
.98 3
.8
2
.7 4
.94 3
34
18
17
13
Nhiệm vụ của 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.
– Hỗ trợ SED-script: là 1 tập các câu lệnh được
sed hỗ trợ.
• 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.
• 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.
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
21
ngo duy hoa - khmt - cntt - dhbk - hn
Sử dụng SED
sed Syntax
• Syntax: sed [-n] [-e] [‘request’] [file…]
sed [-n] [-f scriptfile] [file…]
– -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
– -e command - the next argument is an editing
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
• Cú pháp một yêu cầu:
– [address[, address]][!]command [arguments]
• Một số chú ý:
– Địa chỉ (address) có thể là
• 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/.
– 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’
Sử dụng SED
• Một số chú ý (tiếp):
– Một yêu cầu có tối đa là 2 địa chỉ:
• 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ỉ đó.
• 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.
– Dấu ! có nghĩa là phủ định. Ví dụ: addr!cmd
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.
Address and Command
Examples
• d
• 6d
• /^$/d
• 1,10d
• 1,/^$/d
• /^$/,$d
• /^$/,10d
10
Sed Commands
• Một số lệnh cơ bản trong SED (được sử
dụng thường xuyên):
- substitute
• a - append
• i - insert
• c - change
•s
- delete
•p - print
• y - transform
• q - quit
•d
Một số ví dụ minh họa
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
• /^ya*y/,/[0-9]$/d
deletes from the first line that begins
with yay, yaay, yaaay, etc. through
the first line that ends with a digit
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
22
ngo duy hoa - khmt - cntt - dhbk - hn
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
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
23
ngo duy hoa - khmt - cntt - dhbk - hn
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
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
24
ngo duy hoa - khmt - cntt - dhbk - hn
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ố
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)
– awk -f program_file input_files
• Chương trình program được đọc từ file
Cấu trúc chương trình AWK
• Chương trình awk chứa các
thành phần sau:
– Khối BEGIN:
• Thực hiện trước khi đọc dữ liệu
input
– 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
thỏa mãn biểu thức chính quy
BEGIN {action}
pattern {action}
pattern {action}
.
.
.
– Khối END
• Thực hiện sau khi đã đọc hết dữ
liệu input.
pattern { action}
Cấu trúc Pattern-Action
• Mỗi 1 chương trình đều có ít nhất một
pattern hoặc một action hoặc cả hai
• pattern mặc định sẽ tương thích với mọi
dịng
• 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;
• actions được đặt trong ngoặc { }
END {action}
Các biến builtin trong awk
Actions
• action có thể thực hiện các các câu lệnh
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.
• 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
hiện với mọi dịng.
– Nếu action khơng thiết lập, tất cả các dịng sẽ
được hiển thị..
NF
Number of fields in current record
NR
Number of records so far
OFMT
Output format for numbers
OFS
Output field separator
ORS
Output record separator
RLENGTH
Length of string matched by match function
RS
Input record separator
RSTART
Offset of string matched by match function
RT
The record terminator; gawk sets it to the input text that
matched the character or regex specified by RS
SUBSEP
Subscript separator
ngo duy hoa - khmt - cntt - dhbk - hn
bai giang Linux Shell
25