You are on page 1of 53

Lập trình Hệ thống

Unix Programming

Part 1: Shell Programming

Nguyễn Quốc Tuấn

Network and Communication System Department


Faculty of Electronics and Communications
UNIVERSITY OF ENGINEERING AND TECHNOLOGY

1
Shell Programming
 CÁC YẾU TỐ CƠ BẢN CỦA SHELL

 Chương trình Shell được thực hiện dựa trên file script
- Một chương trình shell dựa trên các lệnh shell
- Dùng tiến trình vi để soạn thảo
+ Chú thích bắt đầu bằng dấu # :
+ Chú thích đặc biệt chỉ thông dịch lệnh sh: #!/bin/bash
 Dùng lệnh chmod để chuyển đặc tính file
- Có nhiều cách: sh < <tên chương trình>
chmod u+x <tên chương trình> # Chỉ cần làm 1 lần
- Vận hành file
./<tên chương trình>

2
Nguyen Quoc Tuan - Unix Programming
Shell Programming

 CÁC YẾU TỐ CƠ BẢN CỦA SHELL

 Các công cụ dùng lập trình


set variable_name = ‘command’
- Các biến `
echo Svariable.name
- Các hàm vào / ra
- Các biểu thức điều kiện
- Các cấu trúc lựa chọn
if ( expression ) then
- Các cấu trúc lặp block of statements
Ví dụ: while ( expression ) else
block of statements block of statements
end endif
foreach variable ( word list )
block of statements
end

3
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL
 Các loại biến
- Biến môi trường
- Biến người dùng
- Biến tự động
 Biến môi trường
(liên quan với biến toàn cục trong C/C++)
- Một số biến đặc biệt do hệ thống tạo ra như $HOME, $PATH, .... , $PS1,
- Một số khác do người sử dụng tạo ra, được đặt trong tệp $HOME/.profile
- Cách tạo biến môi trường của người sử dụng:
export <tên biến không có $> = <giá trị biến>
Ví dụ: export MYNAME=“Tux Linux”

4
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL
 Biến môi trường đặc biệt

EDITOR Chỉ đường dẫn mặc định của tiến trình editor
GROUP Thông báo nhóm login với người dùng
HOME Đường dẫn tới thư mục login
HOST Tên trạm đang login
IFS Tập các kí tự mà shell hiểu là dấu phân cách trường
MAIL Đường dẫn tới thư mục chứa mail người dùng
LOGNAME Tên user truy cập #!/bin/sh
# This is the first Bourne shell program
echo "Hello SLOGNAME, it's nice talking to you."
echo "Your present working directory is `pwd` “
echo "You are working on machine called `uname –n`.”
echo "Here is a list of your files."
Is
Nguyen Quoc Tuan - Unix Programming echo "Bye for now SLOGNAME. The time is `date +%T`!"
Shell Programming
 BIẾN CỦA SHELL
 Biến môi trường

PATH Đường dẫn tới thư mục


PS1 Dấu nhắc hệ thống 1
PS2 Dấu nhắc hệ thống 2
TERM Loại term đang sử dụng
USER Tên người dùng login
PWD Đường dẫn thư mục đang làm việc

 Biến người dùng (biến cục bộ)


Ví dụ
$ biến = giá trị
#!/bin/sh
$ set biến = giá trị
# This is the shell program changing prompt
- Biến người dùng  môi trường
PS1="$(uname -n) ! $ “
$ export biến export PS1

6
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 CÁC TOÁN TỬ STRING
 Lệnh unset để xoá biến/hàm khỏi môi trường shell
- Khuôn dạng unset [-fv] biến $ export radius = 10
Lệnh alias cho phép đổi tến lênhj $ echo $radius
10
S alias ci=“cat dsach”
$ unset $radius
$ ci
$ echo $radius
An anh 7.4 5.6
Anh trung 8.8 6.4
Nghia han 9 8
Ngoc anh 9 9
Auc anh 7 5
$alias changedir= 'set dirname=projects; cd $dirname; unset dirname'

Lệnh này tạo một bí danh theo tên changeir đặt giá trị của biến shell dirname vào thư mục, các
projects, thay đổi thư mục thành các projects và xóa dirname biến shell khỏi môi trường bằng cách
hủy đặt nó

7
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL
 Biến môi trường $ set
Ví dụ: DISPLAY=:0.0
FMHOME=/usr/local/Frame-2.1X
$ env FONTPATH=/usr/local/0W3/lib/fonts
L0GNAME= tuannq HELPPATH=/usr/local/0W3/lib/local:/usr/local/0W3/lib/heIp
TERMCAP=sun-cmd HOME=/home/qtuan
USER=tuannq HZ=100
DISPLAY=:0.0 IFS=
5HELL=/bin/sh LANG=C
HOME=/home/jody/eHie LD_LIBRARY_PATH=/usr/loca l/OHS/lib
TERM=sun-cmd LDMBRARY_ LOCNAME=qtuan
PATH=/usr/loca l/0m/lib MAICHECK=600
PWD=/home//tuannq MANPATH=/usr/local/OW3/share/man;/usr/local/OW3/man
;/usr/local/man ; /usr/local/doctooIs/man:/usr/man
0PTIND=1
8
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL
 Biến môi trường

Ví dụ: PATH=/home/qtuan:/usr/local/0W3/bin;
/usr/ucb:/usr/local/ doctooIs/bin;
/usr/bin:/usr/local ; /etc ; /usr/spool/news/bin;
# Biến user  env
/home/qtuan/bin; /usr/lo ; /usr/etc;
#!/bin/sh
PS1= $
TERM=wyse
PS2= >
export TERM
PWD=/home/qtuan/btap
NAME=“qtuan"
SHELL=/bin/sh
export NAME
TERM=sun-cmd
echo $NAME
TERMCAP=sun-cmd; te=\E[>4h; ti=\E[>4] ; tc=sun:
# Hủy biến
U5ER= qtuan
unset name
unset TERM

9
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL
 Biến tự động

- Là các biến do hệ thống tự động tạo ra


- Biến tự động là biến chỉ đọc, tức là chúng ta chỉ được đọc giá trị của biến
tự động và không được gán giá trị cho biến tự động
Đúng: echo $2
Sai: 2=“gan gia tri cho bien du dong”

- Biến tự động: $1, $2, …. $9: Giá trị tại vị trí các đối (là tên lệnh, $1,…,$9
hay là giá trị các tham số dòng lệnh
- Biến $0 tham chiếu shell hiện hành
Ví dụ : $cat file1 file2 | echo $1

10
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL

- Biến tự động: $* Danh sách các thông số là toàn bộ các tham số


dòng lệnh được ghép thành 1 xâu
- Biến tự động : $# Só lượng các thông số - chứa tổng số các tham số
dòng lệnh không tính biến $0
- Biến tự động : $$ Tên tiến trình đính kèm
- Biến tự động : $@ Danh sách tham số
- Biến tự động : $? Mã trở lại của lệnh thực hiện cuối cùng Chứa giá
trị kết quả trả lại của trạng thái lệnh trước đó
0 - Thành công . 1 – Lỗi
- Biến tự động : $! Tên của tiến trình được đưa ra sau cùng

11
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL
 Ví dụ biến tự động
$ ls -l test
-rwxr-xr-x 1 qtuan qtuan 146 Oct 1 21:15 test*
$cat test
echo -n "So luong tham so: " ; echo $#
echo -n "Cac tham so: " ; echo $*
echo -n "Tham so thu 2: "; echo $2
echo -n "Ten chuong trinh: "; echo $0
$ ./test –l ts1 ts2 "tham so 3"
So luong tham so: 4
Cac tham so: -l ts1 ts2 tham so 3
Tham so thu 2: ts1
Ten chuong trinh: ./test
12
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL
 Ví dụ biến tự động

$ ls -l test
-rwxr-xr-x 1 qtuan qtuan 146 Oct 1 21:15 test*
$ echo $? $ echo The pid of this shell is $$
0: Tốt The pid of t his shell is 4725
$ ls -l test123 $ echo The options for this shell are $-
The options for this shell are s
/bin/ls:
$ grep tuannq /etc/passwd
test123: No such file or directory $ echo $?
$ echo $? 1
1 : Có lỗi thực hiện lệnh $ sleep 25&
4736
$ echo S!
Nguyen Quoc Tuan - Unix Programming
4736 13
Shell Programming
 BIẾN CỦA SHELL
 Gán giá trị biến từ bàn phím
- Cú pháp:
$ read answer Đọc một dòng từ stdin và gán nó cho biến answer
$ read first last Đọc một dòng từ stdin đến khoảng trống đầu tiên hoặc dòng mới,
đặt word đầu tiên vào biến first và phần còn lại vào biến last
 Ví dụ (The Script)
#!/bin/sh
# Scriptname: qtuan
$ echo "Are you happy? \c"
(The Output)
$ read answer
Are you happy? Yes
$ echo "Sanswer is the right response."
Yes is the right response.
$ echo "What is your full name? \c"
What is your full name? Tuan Nguyen Quoc
$ read first middle last
Hello Tuan
$ echo "Hello Sfirst"
14
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL
 Thay thế biến
- Sau khi biến được gán giá trị nó có thể cần được thay thế giá trị trong script
Format Description
${ var } dùng giá trị var
${ var1 :- var2 } dùng var1 nếu đặt còn không dùng var2
${ var1 := var2 } dùng var1 nếu đặt còn không dùng var2 và gán giá trị nó cho var1
${ var1 :? var2 } dùng var1 nếu đặt còn không prints va r2 và exits, nếu var2 không
có prints: null ..
${ var1 :+ var2 } dùng var2 nếu var1 được đặt $ p=Hello
$ q=World
$ d=10 $ r=
$ echo $d $ echo ${p:-q}
10 Hello
$ echo ${d} $ echo ${q:-p}
10 World
$ echo ${r:-`date`}
Tue Oct 5 11:12:34 +07 2021
$ echo ${r:=“Go”}
Nguyen Quoc Tuan - Unix Programming Go 15
Shell Programming
 BIẾN CỦA SHELL

 Thay thế lênh


- Khi một lệnh được đặt trong (backquotes) – dấu dưới phím ESC (`), nó sẽ được
thực thi và kết quả trả về. Nó được sử dụng khi gán đầu ra của một lệnh cho một
biến hoặc khi thay thế đầu ra của một lệnh trong một chuỗi.

$ name= `awk -F: '{print $1}' database`


$ echo $name
Nam
$ lich = `date`
$ echo $lich
Fri Oct 22 09:35:21 PDF 2020
$ grep –n Fri lich
error!!!

16
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL

 Lệnh shift

- Khi ta có hơn 10 tham số dòng lệnh: Sử dụng shift để lấy các tham số từ 10 trở lên
Cú pháp:
$shift [<số nguyên từ 1..9>]
shift 1 tương đương với shift
Sau khi thực hi ện shift 3: Giá trị của $1 được thay bởi giá trị của $4
Giá trị của $2 được thay bởi giá trị của $5

Giá trị của $9 được thay b ởi giá trị của tham số dòng lệnh thứ 13

17
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL

 Lệnh shift
Ví dụ: $ cat tong
echo `expr $1 + $2`
echo -n "Tham so 1: " $1 ;
echo " Tham so 2: " $2
shift 2
echo -n "Tham so 1: " $1 ;
echo " Tham so 2: " $2
$ ./tong 1 2 3 4 3
3
Tham so 1: 1
Tham so 2: 2
Tham so 1: 3
Tham so 2: 4
18
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL
 Đặt biến vị trí cho các biến/đối

Lệnh set [data list][`executable command`]


set đối
ví dụ: $ date
Wed Oct 3 19:16:32 MDT 2020
$ set `date`

$ echo $1
Web,
$ echo $2
Oct
$ echo $#
6

19
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 BIẾN CỦA SHELL

 Ví dụ:

#!/bin/bash
# Script tset
set word1 word2 word3
echo $1 $3 $2 ./tset
set apples peaches plums word1 word3 word2
shift peaches
echo $1 plums
echo $2 peaches plums
echo $*

20
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 CÁC PHÉP TOÁN SHELL $ expr 1 + 4
5
 Các phép toán số học gồm có: $ expr 1+4
cộng (+), trừ (-), nhân (*), chia (/), mod (%) 1+4
 Tính toán trên shell có dạng: `expr <biểu thức>` $ expr 5 + 9/3
$ expr $a + $b 8
$ expr 5 * 4
$ echo `expr $a + $b`
expr: syntax error
5 $ expr 5 \* 4 - 2
18
$ expr 11 % 3
2
 Các tính toán trong shell được thực hiện với các đối số nguyên (trừ bc, awk)
bc: Base Conversion – lệnh tính số thực
Chú ý: Giữa các toán hạng $a, $b và phép toán + -*/ phải có dấu cách
Sinh viên tự tìm hiểu lệnh bc
21
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 CÁC PHÉP TOÁN SHELL
$ num= 1
 Ví dụ:
$ num= `expr $num + 1`
$ echo $num
$ cat tinhs
2
# Script tinh
$ n =`echo “scale=3; 13 / 2" | bc `
$3==0{next}
$ echo $n
{
6.500
total +=$3
count++
}
END $ chmod 755 tinhs
{ avrg = total/count $ awk –f tinhs dsach
printf "Total Amount :%d\n", total Total Amount : 144
printf "Number Of Customer :%d\n ", count Number Of Customer : 17
printf "Average Amount :%9.2f\n", avrg Average Amount : 6.71
}

Nguyen Quoc Tuan - Unix Programming 22


Shell Programming
 CÁC PHÉP TOÁN SHELL
 Só thực
factor: Factorizing Numbers
- Được sử dụng để phân tích một số đã cho và in ra các thừa số nguyên tố của nó.
Khi thừa số được gọi mà không có đối số, nó sẽ đợi một số được nhập và in các
thừa số của số đã nhập. Sau đó, nó đợi một số khác và thoát ra nếu gặp phải không
hoặc bất kỳ ký tự không phải số nào.
Khuôn dạng : factor [số]
Ví dụ: $ factor 15
3
5

$ factor 28
2
2
7
23
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 CÁC PHÉP TOÁN SHELL
 Lệnh test – kiểm tra biểu thức hợp lệ
 Kiểm tra xâu
string1 = string2 Xâu1 bằng xâu2 ( có khoảng trống quang dấu =)
stringl != string2 Xâu1 khác xâu2
string Xâu not null
-z string Độ dài xâu zero
-n string Độ dài xâu nonzero
$ name=qtuan
$ grep “$name" /etc/passwd
qtuan:8ZKX2F:5102:40: Tuan Nguyen Quóc:/home/torn:/bin/ksh 3
$ echo $? S [ $name = qtuan] # Brackets replace the test command
0 Success! $ echo $?
$ test $name != qtuan 0 Success
$ echo $? $ [ $name = [Tt]?m ] # not evaluated by the test command
1 Failure $ echo S?
24
Nguyen Quoc Tuan - Unix Programming 1 Failure
Shell Programming
 CÁC PHÉP TOÁN SHELL
 Lệnh test – kiểm tra biểu thức hợp lệ
 Kiểm tra số nguyên
Ví dụ
intl -eq int2 intl bằng int2
$ echo "Enter the numbers to be"
intl -ne int2 intl không bằng int2
$ s=0
intl -gt int2 intl lớn hơn int2
$ read h
intl -ge int2 intl lớn hơn hoặc bằng int2
$ test $h != –1
intl -It int2 intl is bé hơn int2
$ echo $?
intl -le int2 intl bé hơn hoặc bằng int2
Các phép toán kiểm tra thường dùng là điều kiện cho các lệnh for, while, loop …
exprl1- a expr2 Logical AND
 Kiểm tra logic expr1 -o expr2 Logical OR
!expr Logical NOT

25
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 CÁC PHÉP TOÁN SHELL checktype
 Lệnh test – kiểm tra biểu thức hợp lệ #!/bin/bash
 Kiểm tra file echo –n "Enter the name: "
read f
-b filename Block special file
if test –f $f
-c filename Character special file
then
-d filename Directory existence
echo "$f is a fi le"
-f filename Regular file existence and not a directory
else
-g filename Set-group-ID is set
if test –d $f
-p filename File is a named pipe
then
-r filename File is readable
echo "$f is a directory"
-s filename File is nonzero size
else
-u filename Set-user-ID bit is set
echo "$f is something else"
-w filename File is writable
fi
-x filename File is executable
fi

26
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 CÁC PHÉP TOÁN SHELL
 Ví dụ:
$ chmod 755 ctest
#!/bin/bsh $ ./ctest dsach
#Script ctest dsach is a regular file.
if [[ ! -e $1 ]]; then $ ./ctest accounts
print "file $1 does not exist." accounts is a directory
elif [[ -d $1 ]]; then $ ./ctest course.lst
print "$1 is a directory " file course.lst does not exist.
elif [[ -f $1 ]]; then
print "$1 is a regular file."
else
print "$1 is a special type of file."
fi

27
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL

 Lệnh điều kiện if Khuôn dạng


- Lệnh if /elif/else cho ra quyết định nhiều chiều. if command
+ Nếu if không thành công, elif sẽ được kiểm tra. then command(s)
+ Nếu if thành công, các lệnh sau then thực thi. el if command
then
+ Nếu elif không thành công, elif nữa được chọn.
commands(s)
+ Nếu không lệnh nào thành công, các lệnh khác sẽ el if command
được thực hiện. then
command(s)
else
command(s)
fi

28

Nguyen Quoc Tuan - Unix Programming


Shell Programming
 LỆNH SHELL
 Ví dụ 1 (if)
$ cat vui
#!/bin/sh
# Scriptname: qtuan
echo -n "How old are you? "
read age
if [ Sage -It 0 -o Sage -gt 120 ]
then
echo "Welcome to our planet! "
exit 1
fi
if [ Sage -ge 0 -a Sage -It 13 ]
then
echo "A child is a garden of verses"

29
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL
 Ví dụ (tiếp)
elif [ Sage -ge 13 -a Sage -It 20 ]
then
echo “You without a cause"
elif [ Sage -ge 20 -a Sage -It 30 ] $ ./vui
then How old are you? 200
echo "You got the world by the tail!!" Welcome to our planet!
elif [ Sage -ge 30 -a Sage -It 40] $ ./vui
then How old are you? 13
echo "Thirty something..” You without a cause
else $ ./vui
echo "Sorry I asked" How old are you? 55
fi Sorry I asked

30
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL # Script fn
 Ví dụ 2 name = qtuan
#!/bin/sh if grep "Sname“databasefile > /dev/null 2>&1
file=./testing then
if [ -d $file ] :
then else
echo "Sfile is a directory" echo "$1 not found in databasefile"
elif [ -f Sfile ] exit 1
then fi
if [ -r Sfile -a -w Sfile -a -x Sfile ]
then # nested if command
echo "You have read, write, and execute permission on Sfile.“
fi
else
echo "Sfile is neither a file nor a directory."
fi
31
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL
 Lệnh case
- Lệnh rẽ nhánh nhiều đường được sử dụng thay thế
Khuôn dang:
cho lệnh if/elif.
case variable in
- Giá trị của biến case so khớp với valuel, value2, v.v.,
valuel)
cho đến khi tìm thấy khớp.
commancKs)
- Khi một giá trị khớp với biến trường hợp, các lệnh
;;
theo sau giá trị được thực thi cho đến khi đạt đến
value2)
dấu chấm phẩy kép. Sau đó, việc thực thi bắt đầu sau
comniand(s)
từ esac (viết hoa chữ thường).
;;
- Nếu biến trường hợp không khớp, chương trình sẽ *) command(s)
thực hiện các lệnh sau dấu *), giá trị mặc định, cho ;;
đến khi ;; hoặc esac đạt được. esac

32
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL
 Lệnh case #!/bin/sh
# Scriptname: colors
echo -n "Which color do you like?"
read color
case “$color" in
[Bb]l??)
echo I feel Scolor
echo The sky is Scolor ; ;
[Gg]ree*)
echo Scolor is for trees echo Scolor is for seasick ; ;
red | orange) # The vertical bar means "OR"
echo Scolor is very warm! ; ;
8 *)
echo No such color as Scolor ; ;
esac
33
Nguyen Quoc Tuan - Unix Programming echo "Out of case"
Shell Programming
 LỆNH SHELL (The .profile file)
 Lệnh case echo "Select a terminal type: "
cat « ENDIT
1) vt 120
2) wyse50
3) sun
ENDIT
read choice
case "Schoice" in
1) TERM=vtl20
export TERM ; ;
2) TERM=wyse50
export TERM ; ;
3) TERM=sun
export TERM ; ;
esac
Nguyen Quoc Tuan - Unix Programming
echo "TERM is STERM." 34
Shell Programming
 LỆNH SHELL
 Lệnh for
- Thực hiện các lệnh một số lần hữu hạn trên một
danh sách các mục.
- Theo sau lệnh for là một biến do người dùng xác
Khuôn dạng:
định, từ khóa trong và danh sách các từ.
+ Lần đầu tiên trong vòng lặp, từ đầu tiên từ danh for variable in wordjist
sách từ được gán cho biến, sau đó được chuyển ra do
khỏi danh sách. Khi từ được gán cho biến, phần nội coinniand(s)
dung của vòng lặp được nhập và các lệnh giữa từ done
khóa do và done được thực thi.
+ Lần tiếp theo trong vòng lặp, từ thứ hai được gán
cho biến, v.v.

35
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL (The Command Line)
$ cat mylist
 Lệnh for
Cuong
(The Script) Chien
#!/bin/sh Binh
# Scriptname: forloop Thông
for pal in Cuong Chien Binh Thông
(The Script)
do
#!/bin/sh
echo "Hi $pal"
# Scriptname: mailer
done
for person in `cat mylist`
echo "Out of loop"
do
mail Sperson < letter
echo Sperson was sent a letter.
done
echo "The letter has been sent”

36
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL
 Ví dụ for
(The Script)
#!/bin/sh
# Scriptname: backup
# Purpose: Create backup files
dir=/home/qtuan/tam
for file in memo[l-5]
do (The Output)
if [ -f Sfile ] memol is backed up in /home/qtuan/tam
then memo2 is backed up in /home/jqtuan/tam
cp Sfile $dir/$file.bak memo3 is backed up in /home/qtuan/tam
echo "Sfile is backed up in $dir" memo4 is backed up in /home/qtuan/tam
fi memoS is backed up in /home/qtuan/tam
done

37
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL
 Lệnh while
- Lệnh while đánh giá lệnh ngay sau nó và nếu nó
trạng thái 0 là thoát ,
- Các lệnh trong phần thân của while (lệnh giữa do
Khuôn dạng:
và done) được thực thi. Khi đạt đến từ khóa done,
quyền điều khiển được đưa trở lại đầu vòng lặp và while command
lệnh while sẽ kiểm tra lại trạng thái thoát của lệnh. do
Cho đến khi trạng thái thoát của lệnh được đánh giá coinniand(s)
bởi while trở thành khác không, vòng lặp tiếp tục. done

38
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL

 Ví dụ while
(The Script)
#!/bin/sh /
# Scriptname: num
num=0 # Initialize num
while [ Snum -It 10 ] # num with test command
do
echo -n Snum
num=, expr Snum + 1' # Increment num done
echo "\n After loop exits, continue running here"
(The Output)
0123456789
After loop exits, continue running here

39
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL

 Ví dụ while (The Script)


#!/bin/sh
# Scriptname: sayit
echo Type q to quit. (The Output)
go=start $ sayit
while [ -n "$go”] Type q to quit.
do I love you. <- When Enter key,
echo -n I love you. I love you.
read word I love you.
if [ "Sword" = q -o "Sword" = Q ] I love you.
then I love you. <- q
echo "I'll always love you!" I'll always love you!
go= $
fi
done
40
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL

 Ví dụ while
(The Script)
#!/bin/sh
# Scriptname: quiz
echo "Who was the chief defense lawyer in the OJ case?"
read answer
(The Output)
while [ "Sanswer" != “Nam" ]
$ quiz
do
Who was the chief defense lawyer in the OJ case? Binh
echo "Wrong try again!"
Wrong try again!
read answer
Who was the chief defense lawyer in the OJ case? Chau
done
Wrong try again!
echo You got it!
Who was the chief defense lawyer in the OJ case? Nam
You got it!

41
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL
 Lệnh nntil
- Được sử dụng giống như lệnh while, nhưng chỉ
thực hiện các câu lệnh lặp nếu lệnh sau until là fail;
nghĩa là,
- Nếu lệnh sau until trả về trạng thái là nonzero.
Khuôn dạng
Sau khi các lệnh thực hiện đạt đến từ khóa done,
quyền điều khiển được đưa trở lại đầu vòng lặp until command
và lệnh until kiểm tra lại trạng thái của lệnh tiếp do
theo lần nữa. command(s)
- Cho đến khi trạng thái của lệnh sau until được done
đánh giá trở thành 0, sau khi các lệnh thực hiện
đạt đến từ khóa done vòng lặp sẽ thoát ra

42
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL

 Ví dụ until

(The Script)
#!/bin/sh
until who | grep qtuan
do
sleep 5
done
talk qtuan@vnu.edu.vn

43
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL (The Script)
#!/bin/sh
 Ví dụ until # Scriptname: hour
hour=1
(The Output) until [ $hour -gt 24 ]
$ hour do
Good morning! case "Shour" in
Good morning! [0-9] |1[0-1]) echo "Good morning!“
….. ;;
Lunch time. 12) echo "Lunch time.“
…… ;;
Siesta time. [3-7]) echo "Siesta time."
….. ;;
Good night. *) echo "Good night."
…… ;;
esac
hour= `expr Shour + 1` 44
Nguyen Quoc Tuan - Unix Programming
done
Shell Programming
 LỆNH SHELL

 Lệnh Break
- Được sử dụng để buộc thoát ngay lập tức từ một
vòng lặp, (không phải từ một chương trình.
- Sau khi lệnh break được thực hiện, điều khiển bắt
đầu sau từ khóa done.
- Lệnh break gây ra một lối ra khỏi vòng lặp trong cùng,
vì vậy nếu có nhiều vòng lặp lồng nhau, lệnh break sẽ
lấy một số làm đối số, cho phép thoát ra khỏi một
vòng lặp cụ thể bên ngoài.

Khuôn dạng
break [n]

45
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL

 Ví dụ break
#!/bin/sh
while true;
do
echo Are you ready to move on\?
read answer
if [ "Sanswer" = Y -o "Sanswer" = y ]
then
break
else
commands...
fi
done
print "Here we are"

46
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL

 Lệnh continue
- Trả về quyền điều khiển ở đầu vòng lặp,
- Nếu một điều kiện nào đó trở thành true, tất cả các lệnh bên
dưới tiếp tục sẽ bị bỏ qua.
- Nếu lồng trong một số vòng lặp, lệnh continue trả về điều
khiển cho vòng lặp trong cùng.
- Nếu có một số của nó, thì điều khiển có thể được bắt đầu ở
đầu bất kỳ vòng lặp nào.

Khuôn dạng
continue [n]

47
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL

 Ví dụ continue (The mailing List)


(The Script) $ cat mail.list
#!/bin/sh Thanh
# Scriptname: mailem Thuy
# Purpose: To send a list Lan
for name in `cat mailjist` Hung
do
if [ "Sname" = “Thuy" ] ;
then
continue
—-—
else
mail Sname < memo
fi
done 48
Nguyen Quoc Tuan - Unix Programming
#!/bin/sh
Shell Prog for month in Jan Feb Mar Apr May Jun Jul Auq Sep Oct Nov Dec
do
 LỆNH SHELL for week in 1 2 3 4
 Lệnh continue do
$ months
echo -n "Processing the month of Smonth. Okay? "
Processing the month of Jan. Okay?
read ans
Processing the month of Feb. Okay? Y
if [ "Sans" = n -o -z "Sans" ]
Process week 1 of Feb? y
then
Now processing week 1 of Feb.
—-—
Done processing...
continue 2
Processing the month of Feb. Okay? y
else
Process week 2 of Feb? y
echo -n "Process week Sweek of Smonth? "
Now processing week 2 of Feb.
read ans
Done processing...
if [ "Sans" = n -o -z "Sans" ] /
Processing the month of Feb. Okay? n
then
Processing the month of Mar. Okay? n
continue
Processing the month of Apr. Okay? n
else
Processing the month of May. Okay? n
echo "Now processing week Sweek of Smonth."
Nguyen Quoc Tuan - Unix Programming
sleep 1 49

echo "Done processing..." // fi fi done done


Shell Programming
 LỆNH SHELL Khuôn dạng
 Hàm function.name () { commands ; commands; }
- Các hàm sử dụng để mô-đun hóa chương trình và làm cho nó hiệu quả hơn
- Nguyên tắc sử dụng hàm
1. Shell tìm kiếm các hàm đã có sẵn dưới dạng hàm, chương trình ..
2. Hàm phải được khai báo trước khi dung
3. Các biến trong hàm sẽ biến mất khi thoát khỏi hàm
4. Lệnh return trả trạng thái thoát cuối cùng không được vượt quá giá trị 255.
5. Hàm chỉ tồn tại trong shell nơi được định nghĩa; không thể xuất sang shell
con.
6. Để liệt kê hàm và xác định hãy dùng lênh set
7. Nếu hàm trong file khác có thể tải về file hiện hành

50
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL
 Ví dụ Hàm

dir () { echo "Directories: " ; Is -1 | awk ‘/^d/ {print $NF}' ; }

- Tên của hàm là dir. Các dấu ngoặc đơn trống là cú pháp cần thiết để
đặt tên cho hàm nhưng không có mục đích nào khác.
- Các lệnh trong dấu ngoặc nhọn ({ } ) sẽ được thực hiện khi nhập dir.
- Mục đích của hàm là chỉ liệt kê các thư mục con bên dưới thư mục làm
việc hiện tại.
- Các khoảng trắng bao quanh dấu ngoặc nhọn là bắt buộc.

51
Nguyen Quoc Tuan - Unix Programming
Shell Programming
 LỆNH SHELL
 Ví dụ Hàm
(Using the return command - The Script)
#!/bin/sh
# Scriptname: do_increment
increment () {
sum= `expr $1 + 1’
return $sum # Return the value of sum to the script.
}
echo -n "The sum is "
(The Output) increment 5 # Call function increment; pass 5 as a parameter.
4,6 The sum is 6
# 5 becomes $1 for the increment function.
7 6
echo S? # The return value is stored in $?
echo $sum # The variable "sum" is known to the function,
# and is also known to the main script.

52
Nguyen Quoc Tuan - Unix Programming
Thanks

53

You might also like