Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 16

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT – HUNG

KHOA CÔNG NGHỆ THÔNG TIN

NHÓM 1

BÀI TẬP NHÓM


LINUX VÀ PHẦN MỀM MÃ NGUỒN MỞ

CHUYÊN NGÀNH: CÔNG NGHỆ THÔNG TIN

Hà Nội Năm 2024


TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT - HUNG
KHOA CÔNG NGHỆ THÔNG TIN

BÀI TẬP NHÓM


LINUX VÀ PHẦN MỀM MÃ NGUỒN MỞ

CHƯƠNG 7: SHELL SCRIPT

CHUYÊN NGÀNH: CÔNG NGHỆ THÔNG TIN

Nhóm thực hiện : Nhóm 1


Lớp : K4418CNT

HÀ NỘI, NĂM 2024


DANH SÁCH THÀNH VIÊN NHÓM

STT Họ tên Mã sinh viên Lớp


1 Quách Thị Thanh Xuân 2000755 K4418CNT1
2 Hồ Thân Long 2000746 K4418CNT1
3 Nguyễn Đăng Khoa 2000861 K4418CNT1
4 Nguyễn Nhật Ngọc 2000470 K4418CNT1
5 Phạm Ngọc Quang 2000632 K4418CNT1
6 Đoàn Mạnh Cường 2000762 K4418CNT2
7 Nguyễn Công Đoàn 2000707 K4418CNT2
8 Bùi Xuân Dương 2000771 K4418CNT2
3

MỤC LỤC

CHƯƠNG 7 SHELL SCRIPT.................................................................................................4


7.1. Giới thiệu chung..............................................................................................4
7.2. Hướng dẫn.......................................................................................................4
7.2.1. Cách thực thi................................................................................................4
7.2.2. Lỗi thường gặp............................................................................................4
7.3. Biến, giá trị gán, tham số................................................................................4
7.3.1. Biến (Variables)..........................................................................................4
7.3.2. Gán (Assignments)......................................................................................4
7.3.3. Tham số (Parameters)..................................................................................5
7.4. Input & output.................................................................................................5
7.4.1. Echo.............................................................................................................5
7.4.2. Read.............................................................................................................7
7.5. Câu điều kiện, rẽ nhánh..................................................................................7
7.5.1. Toán tử.........................................................................................................7
7.5.2. Câu điều kiện...............................................................................................7
7.5.3. Cấu trúc rẽ nhánh........................................................................................8
7.6. Vòng lặp...........................................................................................................9
7.6.1. Vòng lặp for.................................................................................................9
7.6.2. Vòng lặp while............................................................................................9
7.6.3. Vòng lặp until..............................................................................................9
7.6.4. Vòng lặp select..........................................................................................10
7.7. Mảng...............................................................................................................10
7.7.1. Truy cập vào phần tử mảng.......................................................................10
7.7.2. Tập lệnh sử dụng trong mảng....................................................................10
7.8. Chuỗi..............................................................................................................10
7.8.1. Khai báo và in chuỗi..................................................................................10
7.8.2. Nối chuỗi...................................................................................................10
7.8.3. Độ dài của chuỗi........................................................................................11
7.8.4. Truy cập phần tử của chuỗi.......................................................................11
7.8.5. Tách chuỗi thành mảng.............................................................................11
7.8.6. Thay thế chuỗi...........................................................................................11
7.8.7. Xóa phần tử chuỗi.....................................................................................11
7.9. Hàm................................................................................................................11
7.10. Câu hỏi luyện tập và lời giải.........................................................................12
KẾT LUẬN....................................................................................................................13
TÀI LIỆU THAM KHẢO.............................................................................................14
4
5

CHƯƠNG 7
SHELL SCRIPT
7.1. Giới thiệu chung
Script là Một chương trình được biên dịch (compiled) chuyển đổi từ ngôn ngữ
cao cấp (ví dụ C++, Java) thành mã máy trước khi chạy. Một script là một chương
trình được giải thích (interpreted) trực tiếp từ mã nguồn.
Bash (Bourne Again SHell) là một ngôn ngữ lập trình và một bộ dịch lệnh
dòng lệnh phổ biến trên Linux. Bash script bao gồm các hướng dẫn tương tự như
các ngôn ngữ lập trình khác, cũng như các lệnh Linux. Bash cho phép định nghĩa
hàm, sử dụng biến và các biến môi trường, và có thể nhận tham số từ người dùng
khi thực thi.
7.2. Hướng dẫn
Mỗi script shell cần bắt đầu bằng một comment chỉ định trình thông dịch sẽ
chạy script: #!bin/bash.
Trước khi thực thi, tệp script phải được phân quyền.
7.2.1. Cách thực thi
Để thực thi tệp tin bash shell, ta dùng lệnh : bash tên_file.sh hoặc ./tên_file
7.2.2. Lỗi thường gặp
1) Command not found: lệnh command không tồn tại
2) Permission denied: Không có quyền truy cập
Trong khi thực hiện chương trình ngoài 2 lỗi trên ra, còn vô số lỗi khác không
thể lường trước được. Hai lỗi trên là hai lỗi cơ bản thường gặp nhất.
7.3. Biến, giá trị gán, tham số
7.3.1. Biến (Variables)
Biến là một vùng bộ nhớ được sử dụng để lưu trữ giá trị dữ liệu. Biến thường lưu
trữ các giá trị như số nguyên, số thực, chuỗi ký tự, hoặc giá trị logic (true/false).
7.3.2. Gán (Assignments)
Gán là quá trình gán một giá trị cho một biến cụ thể.
Cách gán: Biến = giá trị
Ví dụ: X = 1
Lệnh expr thường được sử dụng với 3 phép toán chuỗi: substr, index, length.
1) Substr: dùng để trích xuất một phần của chuỗi.
6

Ví dụ: expr substr “chuỗi” 2 3 ; câu lệnh trích xuất từ ký tự 2 đến ký tự thứ 4
cho kết quả là “huỗ”.
2) Index: dùng để tìm vị trí của một chuỗi con trong chuỗi gốc.
Ví dụ: expr index “Hello World” “World” sẽ trả về 7
3) Length: dùng để tính độ dài của một chuỗi.
Ví dụ: expr length “Hello” sẽ trả về 5.
7.3.3. Tham số (Parameters)
Trong hàm và phương thức, tham số là các giá trị mà hàm hoặc phương thức đó
chấp nhận khi được gọi.
Trong bash shell, các tham số có thể được truy cập trong script bằng cách sử
dụng các biến đặc biệt như $1, $2, $3, …, $n. Trong đó $1 là tham số đầu tiên, $2 là
tham số thứ 2 và cứ tiếp tục như vậy. Ngoài ra, còn có các biến đặc biệt khác: $#, $@;
trong đó $# là số lượng tham số được truyền vào, $@ là tất cả các tham số được truyền
vào.
Ví dụ:
#!/bin/bash

echo "Script này được gọi với $#, tham số là: $@"
echo "Tham số đầu tiên là: $1"
echo "Tham số thứ hai là: $2"
echo "Tham số thứ ba là: $3"

7.4. Input & output


7.4.1. Echo
Để thực hiện in ra màn hình, dùng lệnh echo.
Ví dụ: in ra màn hình dòng chữ “Xin chào Lan, Bạn khỏe không ?” ta thực hiện
viết chương trình như sau:
#!bash/bin/bash
echo Xin chào Lan, Bạn khỏe không?
Chương trình sau khi được thực thi sẽ hiện lên dòng chữ:
7

a) Truyền giá trị

Để truyền giá trị và in ra màn hình, dùng ký tự $;


Ví dụ: in ra màn hình tên của Lan và muốn xem đường dẫn hiện tại cùng với
thư mục Home. Hiện ra ngày tháng năm của hiện tại, số giây của 1 năm. Ta thực hiện
viết chương trình như sau:
#!/bin/bash
name=”Lan”
echo $name
echo $`pwd`, ~
echo $(date)
echo $((365*24*60*60))
Chương trình sau khi thực thi, ta nhận được:

b) Ký hiệu đi kèm dấu \


STT Dấu Ý nghĩa
1 \\ Dấu \
2 \a Phát ra 1 âm thanh chuông
3 \b Xóa 1 ký tự phía trước gần nhất
4 \n Xuống dòng mới
5 \t Cách một khoảng (tab)
6 \v Xuống dòng và cách 1 khoảng của dòng cũ
7 \0### Biểu diễn ký tự tương ứng theo mã ASCII hoặc Unicode
8 \xHH Biểu diễn ký tự tương ứng trong bảng mã ASCII Hexa

Ví dụ:
#!bin/bash
echo -e "Hello World!\n How are you to day?"
echo -e "January\t February\t March \t April"
echo -e "January\v February\v April"
echo -e "1234\b567"
echo -e "\x40\x65\x6C\x6C\x6F"
echo -e Hello\\World
echo Xin chào Lan, Bạn khỏe không ?
Kết quả thu được như sau :
8

*Note: với lệnh echo, có đi kèm cờ -e và -n.


-e: mỗi lần dùng lệnh echo mới sẽ tự xuống dòng
-n: ngược lại với -e.
7.4.2. Read
Trong Bash shell, lệnh read được sử dụng để đọc đầu vào từ người dùng và gán
giá trị cho các biến. Cú pháp sử dụng như sau:
read [options] [variable(s)]
Kết hợp với một số flags để điều chỉnh cách hoạt động của nó: -p, -r, -s, -t.
Ví dụ: in ra một thông báo trước khi người dùng nhập tên.
#!bin/bash
read -p “Nhập tên của bạn: ” name
echo -e “Chào $name”
Kết quả thực hiện:

7.5. Câu điều kiện, rẽ nhánh


7.5.1. Toán tử
a) Toán tử so sánh
Đối với số nguyên và chuỗi: -eq, -ne, -lt, -gt, -le, -ge.
Đối với tập tin: -e, -f, -d, -r, -w, -x
b) Toán tử logic: &&, ||, !
7.5.2. Câu điều kiện
if [ điều kiện ] ; then < lệnh thực thi > ; fi
Ví dụ 1: nhập tên 1 file bất kỳ và kiểm tra
9

#!bin/bash
read -p "Nhập tên đầy đủ của tập tin: " file
if [ -e "$file" ]; then
echo "Tập tin $file tồn tại." fi
if [ -f "$file" ]; then
echo "$file là một tập tin." fi
if [ -d "$file" ]; then
echo "$file là một thư mục." fi
if [ -r "$file" ]; then
echo "Bạn có quyền đọc tập tin $file." fi
if [ -w "$file" ]; then
echo "Bạn có quyền ghi vào tập tin $file." fi
if [ -x "$file" ]; then
echo "Tập tin $file có thể thực thi." fi

Kết quả nhận được sau khi chạy chương trình sử dụng các điều kiện tập tin:

Ví dụ 2: so sánh 2 số X và Y xem số nào lớn hơn và X bằng 0 không ?


#!bin/bash
X=4
Y=1
if [ $X -gt $Y ]; then echo X lớn hơn Y; else echo Y lớn hơn ; fi
if [ $X -eq 0 ]; then echo X bằng 0; fi

Kết quả nhận được sau khi chạy chương trình ví dụ 2:

7.5.3. Cấu trúc rẽ nhánh


Là một cấu trúc điều khiển được sử dụng để thực hiện một loạt các hành động
dựa trên giá trị của một biến hoặc một biểu thức. cấu trúc rẽ nhánh giống một loạt các
câu lệnh if-else nối tiếp nhau.
Cú pháp:
case < biến > in
giá_trị_1) lệnh_1 ;;
giá_trị_2) lệnh_2 ;;
10

… *)
Lệnh_mặc_định ;;
Esac
Ví dụ: Nhập vào 1 phép tính giữa 2 số:
#!/bin/bash
if [ $# -ne 3 ]
then echo Illegal input, did not receive 3 parameters
else case $2 in
+) echo $(($1+$3));;
-) echo $(($1-$3));;
m) echo $(($1*$3));;
/) echo $(($1/$3));;
%) echo $(($1%$3));;
*) echo Illegal arithmetic operator;;
esac
fi

kết quả nhận được khi chạy chương trình:

7.6. Vòng lặp


7.6.1. Vòng lặp for
Sử dụng để lặp qua một danh sách các phần từ.
for item in list
do
# Thực hiện các câu lệnh với mỗi item
done
7.6.2. Vòng lặp while
Sử dụng để lặp lại một khối câu lệnh cho đến khi một điều kiện nhất định không
còn đúng nữa.
while [ condition ]
do
# Thực hiện các câu lệnh trong vòng lặp
done
7.6.3. Vòng lặp until
Tương tự như vòng lặp while, nhưng lặp lại cho đến khi một điều kiện nhất định
trở thành đúng.
until [ condition ]
do
# Thực hiện các câu lệnh trong vòng lặp
11

done
7.6.4. Vòng lặp select
Sử dụng để hiển thị một menu lựa chọn cho người dùng và chờ đợi phản hồi
của họ.
select item in list
do
# Thực hiện các câu lệnh với mỗi item được chọn
done
7.7. Mảng
Mảng cho phép lưu trữ nhiều giá trị trong một biến duy nhất và truy cập thông
qua chỉ số.
Khai báo mảng: my_array = (value1 value2 value3)
7.7.1. Truy cập vào phần tử mảng
echo ${my_array[0]} : in ra “value1”
echo ${my_array[1]} : in ra “value2”
echo ${my_array[2]} : in ra “value3”
7.7.2. Tập lệnh sử dụng trong mảng
a) Thêm phần tử vào mảng
my_array+=(value4)
b) Tính độ dài của mảng
echo ${#my_array[@]} # In ra số lượng phần tử trong mảng
c) In ra tất cả các phần tử mảng
echo ${my_array[@]} # In ra "value1 value2 value3 value4"
d) Xóa phần tử khỏi mảng
unset my_array[1]
7.8. Chuỗi
Trong bash shell, chuỗi là 1 dãy các ký tự được bao quanh bởi dấu nháy đơn hoặc dấu
nháy kép.
7.8.1. Khai báo và in chuỗi
my_string="Hello, world!"
echo $my_string # In ra "Hello, world!"
7.8.2. Nối chuỗi
first_name="John"
last_name="Doe"
full_name="$first_name $last_name"
12

echo $full_name # In ra "John Doe"


7.8.3. Độ dài của chuỗi
my_string="Hello, world!"
echo ${#my_string} # In ra độ dài của chuỗi: 13
7.8.4. Truy cập phần tử của chuỗi
my_string="Hello, world!"
echo ${my_string:0:5} # In ra "Hello" (lấy 5 ký tự từ vị trí 0)
7.8.5. Tách chuỗi thành mảng
my_string="apple,banana,orange"
IFS=',' read -ra fruits <<< "$my_string"
echo ${fruits[0]} # In ra "apple"
echo ${fruits[1]} # In ra "banana"
echo ${fruits[2]} # In ra "orange"
7.8.6. Thay thế chuỗi
my_string="Hello, world!"
echo ${my_string/world/Universe} # In ra "Hello, Universe!"
7.8.7. Xóa phần tử chuỗi
my_string="Hello, world!"
echo ${my_string//l/} # In ra "Heo, word!"
7.9. Hàm
Giống như các ngôn ngữ khác, trong bash shell hoàn toàn có thể định nghĩa và sử
dụng các hàm để tái sử dụng mã, giúp mã trở nên dễ đọc và bảo trì hơn.
Cú pháp:
function function_name tham_số_1 tham_số_2 … { lệnh thực hiện }
Ví dụ: viết hàm in ra “Hello, World !”
function greet {
echo “Hello, World !”
}
13

7.10. Câu hỏi luyện tập và lời giải


Nhóm em đã thực hiện 71 câu hỏi ôn tập trong chương 7 này. Tuy nhiên, phần
lời giải bài tập quá dài. Các file Shell Script nhóm em lưu trữ trên gg drive.
Link truy cập lời giải: https://drive.google.com/drive/folders/17m0XS4-
wm8t2Sjn8LcoHjki8SdV845QT?usp=sharing
14

KẾT LUẬN
Linux là một hệ điều hành mã nguồn mở phổ biến, được phát triển bởi một cộng
đồng toàn cầu.
Shell Script là một tập hợp các lệnh được viết trong một ngôn ngữ shell như
Bash, Sh, hoặc các loại shell khác trên các hệ điều hành Unix hoặc Linux. Shell script
được sử dụng để tự động hóa các nhiệm vụ hoặc quy trình trên máy tính.
Trong chương 7 này tập trung vào các cú pháp cơ bản của Shell script. Bằng cách
kết hợp các cú pháp này, có thể viết các script phức tạp để tự động hóa nhiều tác vụ
khác nhau trên hệ thống.
15

TÀI LIỆU THAM KHẢO


Tiếng Anh
1. Richard Fox, 2014, Linux with Operating System concepts, Taylor & Francis
Group
Các website
1. http://www.linux.org
2. http://www.quantrimang.com

You might also like