Tìm hiểu Lập trình shell linux (P1)

I. Shell script là gì

Shell là chương trình giao tiếp với người dùng. Có nghĩa là shell chấp nhận các lệnh từ bạn (keyboard) và thực thi nó. Nhưng nếu bạn muốn sử dụng nhiều lệnh chỉ bằng một lệnh, thì bạn có thể lưu chuỗi lệnh vào text file và bảo shell thực thi text file này thay vì nhập vào các lệnh. Điều này gọi là shell script.

Định nghĩa: Shell script là một chuỗi các lệnh được viết trong plain text file. Shell script thì giống như batch file trong MS-DOS nhưng mạnh hơn.

Tại sao phải viết shell script:

• Shell script có thể nhận input từ user, file hoặc output từ màn hình.

• Tiện lợi để tạo nhóm lệnh riêng.

• Tiết kiệm thời gian.

• Tự động làm một vài công việc thường xuyên.

II. Hướng dẫn tạo và thực thi chương trình shell

step1: Tạo file hello.sh (trong thư mục cd /home/tuanvh/) nội dung như sau:

sử dụng vi, emacs, gedit... để soạn thảo nội dung

#!/bin/bash
echo "hello world"

Dòng đầu tiên chúng ta luôn đặt #!/bin/bash, đây là cú pháp bắt buộc. Sau # được hiểu là comment, chú thích của các đoạn mã.

step2: Sau đó, để script có thể thực thi ta phải cấp quyền cho nó

chmod 0777 hello.sh

step3: Thực thi file shell.

// có thể chạy file bằng 1 số cách sau
–  bash hello.sh
–  sh hello.sh
–  ./hello.sh

III. Biến trong shell

Trong Linux shell có 2 loại biến:

Biến hệ thống :

  • Tạo ra và quản lý bởi Linux.
  • Tên biến là CHỮ HOA

Biến do người dùng định nghĩa

-Tạo ra và quản lý bởi người dùng -Tên biến là chữ thường

1. Một số biến hệ thống

VD: file hello.sh

#!/bin/bash
echo "hello"
echo $BASH_VERSION
echo $BASH
echo $HOME
echo $PATH

Kết quả: run ./hello.sh

hello
4.2.24(1)-release
/bin/bash
/home/vu.huy.tuan
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

2. Biến người dùng, cú pháp, quy tắc đặt tên

cú pháp:

tên_biến=value
  • tên_biến phải bắt đầu bằng ký tự
  • Không có dấu cách 2 bên toán tử = khi gán giá trị cho biến
#Đúng
a=1
#sai
a = 1
#sai
a= 1
  • Tên biến có phân biệt chữ hoa, thường
#các biến sau đây là khác nhau
a=1
A=2
  • Một biến không có giá trị khởi tạo thì bằng NULL
  • Không được dùng dấu ?, * để đặt tên các biến

ECHO Để in giá trị của biến

Cú pháp:

echo [option][string,variables…]
#example
echo $tên_biến
  • In một số ký tự đặc biệt trong tham số với tùy chọn -e:
\a	alert	(bell)
\b	backspace
\c	suppress trailing new	line
\n	new	line
\r	carriage return
\t	horizontal tab
\\	backslash

//example
$ echo -e "Hello\tTuan"
#output:  Hello   Tuan
$ echo -e "Hello\nTuan"
#output
Hello
Tuan

IV: Các phép toán số học

Shell cung cấp cho ta một số biểu thức toán học.

Cú pháp:

expr toán_hạng_1 toán_tử toán_hạng_2

example:

# phép cộng
$expr 1 + 2
# phép trừ
$expr 5 - 1
# phép chia
$expr 8 / 3   # output =2 phép chia chỉ lấy phần nguyên
$expr 8 % 5  # output =3 phép chia lấy phần dư
$expr 10 \* 2 # output = 20 phép nhân

Chú ý: Phải có dấu cách trước và sau toán tử.

# example sai cú pháp
$expr 1+2
$expr 5- 1

Các dấu ngoặc

  • Tất cả các ký tự trong dấu ngoặc kép đều không có ý nghĩa ñnh toán, trừ những ký tự sau \ hoặc $
  • Dấu nháy ngược (`): nghĩa là yêu cầu thực thi lệnh
#example
$ echo "ngay hom nay la: `date`"
#ouput: ngay hom nay la: Wed Apr 27 10:43:59 ICT 2016
$ echo `expr 1 + 2`
#output = 3
$echo "expr 1 + 2"
#ouput: expr 1 + 2

**Kiểm tra trạng thái trả về của 1 câu lệnh cú pháp

$echo $?

– Trạng thái 0 nếu câu lệnh kết thúc thành công. – Khác 0 nếu kết thúc có lỗi

# xóa file không tồn tại
rm abc.txt #output messge:( rm: cannot remove `abc.txt': No such file or directory )
# kiểm tra trạng thái câu lệnh rm abc.txt
$echo $? #output 1 nghĩa là có lỗi

$ echo "ngay hom nay la: `date`"
#ouput: ngay hom nay la: Wed Apr 27 10:43:59 ICT 2016
$echo $? #output 0, nghĩa là thành công

V: Cấu trúc điều khiển trong shell script

Cũng giống như các ngôn ngữ lập trình khác, Shell Scripts cũng cung cấp các vòng lặp: "for", "while"; và lệnh rẽ nhánh "if", "case".

1. Cú pháp rẽ nhánh If Cú pháp:

if điều_kiện
then
câu lệnh 1
…
fi

if...else...fi

Cú pháp:

if điều_kiện then
	câu_lệnh_1
….
else
	câu_lệnh_2
fi

Vòng lặp For

Cú pháp:

for { tên biến } in { danh sách }
do
# Khối lệnh
# Thực hiện từng mục trong danh sách cho đến cho đến hết
# (Và lặp lại tất cả các lệnh nằm trong "do" và "done")
done

#hoặc sử dụng for
for (( expr1; expr2; expr3 ))
do
# Lặp cho đến khi biểu thức expr2 trả về giá trị TRUE
done

example

#  for 1
for i in 1 2 3 4 5
do
 echo $i
done

#output: 1 2 3 4 5

#for 2
for (( i = 0 ; i <= 5; i++ )) # bao quanh bằng (())
do
echo $i
done
#ouput 1 2 3 4 5

3. Vòng lặp While

while	[Điều kiện]
do
command1
command2
command3	..	....
done

example demo1.sh

#!/bin/sh
echo "Nhap vao cac so can tinh tong, nhap so am de exit"
sum=0
read i
while [ $i -ge 0 ] # nếu i >= 0
do
sum=`expr $sum + $i`
read i # nhận giá trị từ người dùng
done
echo "Total: $sum."

Kết quả sau khi chạy ./demo1.sh


#ouput
./demo1.sh
Nhap vao cac so can tinh tong, nhap so am de exit
1
5
4
-1
Total= 10.

VI: Lệnh test

Lệnh test được dùng để kiểm tra một biểu thức là đúng hay không và trả lại

–  0 nếu biểu thức đúng

–  khác 0 sai

Cú pháp:

test biểu_thức HOẶC  [biểu thức]

Các phép toán kiểm tra

Mathematical Operator in,Shell Scrip Meaning Normal Arithmetical/ Mathematical Statements
For test statement with if command For [ expr ] statement with if command
-eq is equal to 5 == 6 if test 5 -eq 6 if [ 5 -eq 6 ]
-ne is not equal to 5 != 6 if test 5 -ne 6 if [ 5 -ne 6 ]
-lt is less than 5 < 6 if test 5 -lt 6 if [ 5 -lt 6 ]
-le is less than or equal to 5 <= 6 if test 5 -le 6 if [ 5 -le 6 ]
-gt is greater than 5 > 6 if test 5 -gt 6 if [ 5 -gt 6 ]
-ge is greater than or equal to 5 >= 6 if test 5 -ge 6 if [ 5 -ge 6 ]

NOTE: == is equal, != is not equal.

For string Comparisons use

Operator Meaning
string1 = string2 string1 is equal to string2
string1 != string2 string1 is NOT equal to string2
string1 string1 is NOT NULL or not defined
-n string1 string1 is NOT NULL and does exist
-z string1 string1 is NULL and does exist

Toán tử logic

Operator Meaning
! expression Logical NOT
expression1,-a,expression2 Logical AND
expression1,-o,expression2 Logical OR

kiểm tra file, thư mục

Test Meaning
-s file Non empty file
-f file Is File exist or normal file and not a directory
-d dir Is Directory exist and not a file
-w file Is writeable file
-r file Is read-only file
-x file Is file is executable

Tham khảo:

Link Tham khảo