Chạy tất cả các đoạn lệnh ví dụ ở phần 2.4 Chụp hình kết quả chạy các file script và lưu vào báo cáo.. Sử dụng lệnh nano variables.sh để tạo và mở một file script mới có tên là variable
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TÊN: TRẦN ĐÌNH DUY MÔN: HỆ ĐIỀU HÀNH – IT007.Q12.1
BÁO CÁO THỰC HÀNH LAB02 GIẢNG VIÊN HƯỚNG DẪN: NGUYỄN HỮU LƯỢNG
Trang 31 Chạy tất cả các đoạn lệnh ví dụ ở phần 2.4 Chụp hình kết quả chạy các file script
và lưu vào báo cáo.
Trả lời:
Ví dụ 2-1: variables.sh
Hình 1 Tạo script
Hình 2 Nội dung script variables.sh
Hình 3 Kết quả sau khi chạy script
- Thao tác:
Trang 41 Khởi động terminal của Ubuntu.
2 Sử dụng lệnh nano variables.sh để tạo và mở một file script mới có tên là
variables.sh bằng trình soạn thảo nano
3 Gõ (hoặc dán) toàn bộ nội dung của script variables.sh vào trình soạn thảo
4 Nhấn tổ hợp phím Ctrl + X, sau đó nhấn Y và Enter để lưu file và thoát khỏi
nano
5 Sử dụng lệnh chmod +x variables.sh để cấp quyền thực thi (execute) cho file
script vừa tạo
6 Chạy script bằng lệnh /variables.sh.
7 Khi script hiển thị dòng chữ "Enter some text", ta nhập vào chuỗi "Hello World"
rồi nhấn Enter để script tiếp tục chạy và hoàn thành.
- Giải thích:
nano variables.sh: Lệnh nano dùng để mở trình soạn thảo văn bản trong terminal.
Ở đây ta dùng nó để tạo và viết nội dung cho file variables.sh
chmod +x variables.sh: Lệnh chmod (change mode) dùng để thay đổi quyền truy
cập của file Tùy chọn +x có nghĩa là thêm (add) quyền thực thi (execute) cho file,
điều này là bắt buộc để có thể chạy file script như một chương trình
echo: Lệnh này dùng để in một chuỗi hoặc giá trị của biến ra màn hình.
o **echo "$myvar"**: Dấu nháy kép (" ") cho phép shell thay thế biến
$myvar\ bằng giá trị của nó ("Hi there")
thuần túy, do đó nó in ra chuỗi $myvar\ theo đúng nghĩa đen
o echo "\&myvar": Dấu \ là ký tự thoát, nó vô hiệu hóa ý nghĩa đặc biệt của
ký tự ngay sau nó Trong trường hợp này, nó dùng để in ra ký tự & (thay vì
ký tự $ như trong tài liệu gốc)
read myvar: Lệnh read dùng để đọc dữ liệu do người dùng nhập vào từ bàn phím
và lưu vào biến được chỉ định, ở đây là biến myvar
Ví dụ 2-2: try_variables.sh
Hình 4 Tạo script
Trang 5Hình 5 Nội dung script try_variables.sh
Hình 6 Kết quả sau khi chạy script
- Thao tác:
1 Mở terminal, dùng lệnh nano try_variables.sh để tạo và mở file script.
2 Nhập nội dung của script vào trình soạn thảo nano
3 Lưu file và thoát khỏi nano
4 Dùng lệnh chmod +x try_variables.sh để cấp quyền thực thi.
5 Chạy script bằng lệnh /try_variables.sh foo bar baz Việc thêm foo bar baz
sau tên script là để truyền các tham số dòng lệnh vào cho script xử lý
6 Khi script yêu cầu "Please enter a new greeting", ta nhập "Xin chao!" và nhấn
Enter.
Trang 6- Giải thích:
o $0: Luôn chứa tên của chính file script đang chạy Trong trường hợp này là
./try_variables.sh
o $1, $2: Lần lượt chứa tham số thứ nhất ("foo") và thứ hai ("bar") được
truyền vào khi chạy script
o $*: Chứa tất cả các tham số được truyền vào dưới dạng một chuỗi duy nhất
("foo bar baz")
o $HOME: Là một biến môi trường, luôn chứa đường dẫn đến thư mục nhà
của người dùng hiện tại (ở đây là /home/duy)
Ví dụ 2-3: if_control.sh
Hình 7 Tạo script
Hình 8 Nội dung script if_control.sh
Hình 9 Kết quả sau khi chạy script
- Thao tác:
Trang 71 Mở terminal, dùng lệnh nano if_control.sh để tạo và mở file.
2 Nhập nội dung của script vào trình soạn thảo
3 Lưu và thoát
4 Cấp quyền thực thi bằng lệnh chmod +x if_control.sh.
5 Chạy script lần đầu bằng lệnh /if_control.sh, sau đó nhập "yes" và nhấn Enter.
6 Chạy script lần hai, nhập "no" và nhấn Enter để xem kết quả của nhánh else.
- Giải thích:
if [ $timeofday = "yes" ]; then else fi: Đây là cấu trúc điều kiện rẽ nhánh.
o if [ ]: Lệnh if kiểm tra điều kiện bên trong cặp dấu [ ] Điều kiện ở đây
là so sánh giá trị của biến $timeofday với chuỗi "yes"
o then: Nếu điều kiện đúng, các lệnh nằm giữa then và else sẽ được thực thi.
o else: Nếu điều kiện sai, các lệnh nằm giữa else và fi sẽ được thực thi.
o fi: Dùng để kết thúc khối lệnh if.
Ví dụ 2-4: elif_control.sh
Hình 10 Tạo script
Hình 11 Nội dung script elif_control.sh
Trang 8Hình 12 Kết quả sau khi chạy script
- Thao tác:
1 Tạo và mở file script elif_control.sh bằng nano.
2 Nhập nội dung code vào
3 Lưu và thoát
4 Cấp quyền thực thi bằng chmod +x elif_control.sh.
5 Thực hiện chạy script 3 lần với các đầu vào khác nhau: "yes", "nope", và "no" để kiểm tra tất cả các nhánh của câu lệnh
- Giải thích:
elif [ ]; then: elif là viết tắt của "else if" Nó cho phép kiểm tra một điều kiện
mới nếu điều kiện if trước đó là sai Cấu trúc này giúp xử lý nhiều trường hợp một cách rõ ràng thay vì phải lồng nhiều câu lệnh if vào nhau.
exit 1: Lệnh exit dùng để kết thúc script Theo quy ước, exit 0 (như ở cuối
script) báo hiệu script đã chạy thành công Một số khác 0 (như exit 1) dùng để báo hiệu có lỗi xảy ra
Ví dụ 2-5: elif_control2.sh
Hình 12 Tạo script
Trang 9Hình 13 Nội dung script elif_control2.sh
Hình 14 Kết quả sau khi chạy script
- Thao tác:
1 Tạo và mở file elif_control2.sh bằng nano.
2 Nhập nội dung code
3 Lưu và thoát
4 Cấp quyền thực thi bằng chmod +x elif_control2.sh.
5 Chạy script bằng /elif_control2.sh và chỉ nhấn Enter (không nhập gì) để kiểm tra
trường hợp nhập chuỗi rỗng
- Giải thích:
echo -n: Tùy chọn -n của lệnh echo có chức năng không tự động xuống dòng sau
khi in chuỗi ra màn hình Điều này giúp cho con trỏ nhập liệu của người dùng nằmngay sau câu hỏi, trông chuyên nghiệp hơn
Ví dụ 2-6: for_loop.sh
Hình 15 Tạo script
Trang 10Hình 16 Nội dung script for_loop.sh
Hình 17 Kết quả sau khi chạy script
- Thao tác:
1 Tạo và mở file for_loop.sh bằng nano.
2 Nhập nội dung code
3 Lưu và thoát
4 Cấp quyền thực thi bằng chmod +x for_loop.sh.
5 Chạy script bằng /for_loop.sh Script sẽ tự chạy và kết thúc mà không cần người
dùng nhập liệu
- Giải thích:
for foo in bar fud 13; do done: Đây là cấu trúc vòng lặp for.
là "bar", "fud", "13")
Ví dụ 2-7: for_loop2.sh
Hình 18 Tạo script
Trang 11Hình 19 Nội dung script for_loop2.sh
Hình 20 Kết quả sau khi chạy script
- Thao tác:
1 Tạo và mở file for_loop2.sh bằng nano.
2 Nhập nội dung code
3 Lưu và thoát
4 Cấp quyền thực thi bằng chmod +x for_loop2.sh.
5 Chạy script bằng /for_loop2.sh.
- Giải thích:
$(ls f*.sh): Cú pháp $( ) được gọi là "command substitution" Nó sẽ thực thi lệnh
bên trong (ls f*.sh) và thay thế toàn bộ cú pháp này bằng kết quả đầu ra của lệnh đó Lệnh ls f*.sh liệt kê tất cả các file có tên bắt đầu bằng 'f' và kết thúc bằng '.sh'
lpr $file: Lệnh lpr (line printer request) được dùng để gửi một file tới hàng đợi
của máy in Lỗi "No default destination" xuất hiện vì máy ảo chưa được cấu hình máy in mặc định nào
Ví dụ 2-8: password.sh
Hình 21 Tạo script
Trang 12Hình 22 Nội dung script password.sh
Hình 23 Kết quả sau khi chạy script
- Thao tác:
1 Tạo và mở file password.sh bằng nano.
2 Nhập nội dung code
3 Lưu và thoát
4 Cấp quyền thực thi bằng chmod +x password.sh.
5 Chạy script bằng /password.sh Nhập "abc" lần đầu, sau đó nhập "secret" để kết
thúc script
- Giải thích:
while [ "$trythis" != "secret" ]; do done: Đây là cấu trúc vòng lặp while.
trong [ ] còn đúng
o Điều kiện "$trythis" != "secret" có nghĩa là "giá trị của biến
$trythis khác với chuỗi 'secret'" Vòng lặp sẽ dừng khi người dùng nhậpđúng "secret", làm cho điều kiện trở thành sai
Trang 13Ví dụ 2-9: while_for.sh
Hình 24 Nội dung script while_for.sh
Hình 25 Kết quả sau khi chạy script
- Thao tác:
1 Tạo và mở file while_for.sh bằng nano.
2 Nhập nội dung code
3 Lưu và thoát
Trang 144 Cấp quyền thực thi bằng chmod +x while_for.sh.
5 Chạy script bằng /while_for.sh.
- Giải thích:
while [ "$foo" -le 16 ]: Điều kiện của vòng lặp while.
giá trị của biến $foo có nhỏ hơn hoặc bằng 16 hay không
foo=$(($foo+1)): Cú pháp $(( )) được dùng để thực hiện các phép toán số học
Lệnh này có chức năng tăng giá trị của biến foo lên 1 đơn vị sau mỗi lần lặp
Ví dụ 2-10: until_user.sh
Hình 26 Tạo script
Hình 27 Nội dung script until_user.sh
Hình 28 Kết quả sau khi chạy script
- Thao tác:
Trang 151 Tạo và mở file until_user.sh bằng nano.
2 Nhập nội dung code
3 Lưu và thoát
4 Cấp quyền thực thi bằng chmod +x until_user.sh.
5 Chạy script bằng lệnh /until_user.sh duy Ta truyền tham số "duy" vào để script
theo dõi chính người dùng đang đăng nhập
- Giải thích:
until who | grep "$1" > /dev/null; do done: Đây là cấu trúc vòng lặp until.
o until: Vòng lặp này ngược lại với while Nó sẽ tiếp tục lặp cho đến khi điều
kiện trở thành đúng.
o **who | grep "$1"**: Lệnh who liệt kê người dùng đang đăng nhập Kết quả của nó được chuyển qua lệnh grep (bằng dấu | - pipe) để lọc ra dòng
chứa tên người dùng được truyền vào qua tham số $1\
o > /dev/null: Chuyển hướng toàn bộ đầu ra của lệnh grep vào
/dev/null (một file đặc biệt giống như "thùng rác") để không hiển thị gìtrên màn hình
o sleep 60: Lệnh này yêu cầu script tạm dừng trong 60 giây trước khi kiểm
tra lại điều kiện
who | grep "duy" đúng ngay từ lần đầu tiên, do đó vòng lặp kết thúc ngay lập tức và in ra thông báo
Ví dụ 2-11: case1.sh
Trang 16Hình 29 Nội dung script case1.sh
Hình 30 Kết quả sau khi chạy script
- Thao tác:
1 Tạo và mở file case1.sh bằng nano.
2 Nhập nội dung code
3 Lưu và thoát
4 Cấp quyền thực thi bằng chmod +x case1.sh.
5 Chạy script nhiều lần với các đầu vào khác nhau như "yes", "y", "*", "no", "n" để kiểm tra các trường hợp so khớp
- Giải thích:
case "$timeofday" in esac: Đây là cấu trúc case, một cách hiệu quả để so khớp
một biến với nhiều mẫu khác nhau
chuỗi "yes", lệnh tương ứng sẽ được thực thi
hoạt động như một trường hợp mặc định (default) nếu không có mẫu nào ở trên khớp
Trang 17Ví dụ 2-12: case2.sh
Hình 31 Nội dung script case2.sh
Hình 32 Kết quả sau khi chạy script
- Thao tác:
1 Tạo và mở file case2.sh bằng nano.
2 Nhập nội dung code
3 Lưu và thoát
4 Cấp quyền thực thi bằng chmod +x case2.sh.
5 Chạy script và thử với các đầu vào "nope", "YES", "Yep" để kiểm tra
- Giải thích:
Trang 18 "yes" | "y" | "Yes" | "YES"): Dấu | được dùng để kết hợp nhiều mẫu Nếu giá
trị của biến khớp với bất kỳ mẫu nào trong danh sách, khối lệnh tương ứng sẽ được thực thi
n* | N*: Dấu * ở đây là ký tự đại diện, khớp với bất kỳ chuỗi ký tự nào (bao gồm
cả không có ký tự nào) Do đó, mẫu n* sẽ khớp với "n", "no", "nope", v.v
Ví dụ 2-13 case3.sh
Hình 33 Nội dung script case3.sh
Hình 34 Kết quả sau khi chạy script
Trang 19- Thao tác:
1 Tạo và mở file case3.sh bằng nano.
2 Nhập nội dung code
3 Lưu và thoát
4 Cấp quyền thực thi bằng chmod +x case3.sh.
5 Chạy script với các đầu vào "Yes", "nah", "I dont know" để kiểm tra
- Giải thích:
[nN]*: Đây là một cách so khớp mẫu nâng cao hơn.
khi kết thúc bằng ;;
2 Viết chương trình cho phép nhập vào tên và MSSV Kiểm tra nếu MSSV đó
không trùng với mình thì bắt nhập lại In ra màn hình kết quả.
Trả lời:
Hình 35 Tạo script
Trang 20Hình 36 Nội dung script kiemtra_mssv.sh
Hình 37 Kết quả sau khi chạy script - Thao tác:
1 Mở terminal, dùng lệnh nano kiemtra_mssv.sh để tạo và mở file.
2 Nhập nội dung code của chương trình vào trình soạn thảo, thay thế 24520398 bằng MSSV đúng
3 Lưu file và thoát
4 Cấp quyền thực thi bằng lệnh chmod +x kiemtra_mssv.sh.
5 Chạy chương trình bằng /kiemtra_mssv.sh.
6 Thử nhập sai MSSV một lần, sau đó nhập đúng tên và MSSV để xem kết quả
- Giải thích:
while true: Lệnh này tạo ra một vòng lặp vô tận Cách duy nhất để thoát khỏi
vòng lặp này là dùng lệnh break Ta dùng cấu trúc này để buộc người dùng phải
nhập đi nhập lại cho đến khi nào đúng thì thôi
Trang 21 if [ "$mssv_nhap" = "$MSSV" ]: Điều kiện so sánh hai chuỗi ký tự Nếu chuỗi
người dùng nhập ($mssv_nhap) giống hệt với chuỗi MSSV đã định sẵn
($MSSV), điều kiện sẽ đúng
break: Lệnh này được dùng để phá vỡ (thoát khỏi) vòng lặp gần nhất Trong
trường hợp này, khi người dùng nhập đúng MSSV, lệnh break sẽ được thực thi để
Trang 22Hình 40 Kết quả sau khi chạy script
- Thao tác:
1 Mở terminal, dùng lệnh nano tinhtong.sh để tạo và mở file.
2 Nhập nội dung code vào trình soạn thảo
3 Lưu file và thoát
4 Cấp quyền thực thi bằng lệnh chmod +x tinhtong.sh.
5 Chạy chương trình bằng /tinhtong.sh.
6 Thử nhập các số nhỏ hơn 10 (ví dụ: 5, 7), sau đó nhập một số hợp lệ (ví dụ: 19) để xem kết quả tính tổng
- Giải thích:
if [ "$n" -ge 10 ] 2>/dev/null:
xem n có lớn hơn hoặc bằng 10 không
o 2>/dev/null là một kỹ thuật để xử lý lỗi Nếu người dùng nhập vào một
chuỗi không phải là số (ví dụ "abc"), lệnh so sánh số học sẽ báo lỗi
2>/dev/null sẽ chuyển hướng thông báo lỗi đó vào "thùng rác", giúp chương trình không hiển thị lỗi không mong muốn cho người dùng
Vòng lặp while [ "$i" -le "$n" ] được dùng để tính tổng, với i là biến đếm chạy từ 1 đến n
học Lệnh này cộng giá trị hiện tại củaivào biếntongvà gán kết quả ngược lại chotong\
4 Viết trình cho phép nhập vào một chuỗi Kiểm tra chuỗi đó có tồn tại trong một file text (ví dụ test.txt) cùng thư mục hay không?
Trả lời:
Trang 23Hình 41 Tạo file test.txt
Hình 42 Tạo script
Hình 43 Nội dung script timkiem_chuoi.sh
Hình 44 Kết quả sau khi chạy script
- Thao tác:
1 Mở terminal, dùng lệnh echo "day la file test." > test.txt để tạo nhanh một file
test.txt với nội dung cho trước
2 Sử dụng nano timkiem_chuoi.sh để tạo và mở file script.
3 Nhập nội dung code vào
Trang 244 Lưu và thoát.
5 Cấp quyền thực thi bằng lệnh chmod +x timkiem_chuoi.sh.
6 Chạy chương trình bằng /timkiem_chuoi.sh.
7 Thử nhập một chuỗi không có trong file (ví dụ "file tim kiem") và một chuỗi có trong file (ví dụ "file test") để kiểm tra kết quả
- Giải thích:
**if [ ! -f "$TEN_FILE" ]**: Đây là bước kiểm tra an toàn Toán tử -f kiểm tra
xem một đường dẫn có phải là một file hay không Dấu ! là toán tử phủ định Cả câu lệnh có nghĩa là "Nếu $TEN\_FILE\ không phải là một file (không tồn tại)".Nếu đúng, chương trình sẽ báo lỗi và thoát
if grep -q "$chuoi_can_tim" "$TEN_FILE": Đây là cách hiệu quả nhất để kiểm
tra sự tồn tại của chuỗi
màn hình Thay vào đó, nó sẽ trả về một mã trạng thái: 0 (thành công) nếu tìm thấy chuỗi, và một số khác 0 (thất bại) nếu không tìm thấy
nhánh then (nếu tìm thấy) hay nhánh else (nếu không tìm thấy).