You are on page 1of 14

9.

Vòng lặp For trong Shell Script

Trong bài này sẽ hướng dẫn cách sử dụng vòng lặp for trong shell script, đây là vòng lặp cơ bản và dễ
hiểu nhất, dùng để lặp một dãy số, một danh sách các thư mục / các file.
Mục lục

 1. Cú pháp vòng lặp for trong shell script

 2. Ví dụ vòng lặp for trong shell script

1. Cú pháp vòng lặp for trong shell script

Cú pháp nó khá đơn giản, vì là ngôn ngữ dùng để lập trình server nên không quá phức tạp như những
ngôn ngữ lập trình khác.

for var in word1 word2 ... wordn


do
Statement(s) to be executed for every word.
done
Trong đó word1, word2, word3, ... là dãy các giá trị được cách nhau bởi khoảng trắng. Sau mỗi lần
lặp thì trình biên dịch sẽ chuyển qua giá trị tiếp theo dựa vào khoảng trắng đó để nhận biết.
* Lưu ý: Dãy các giá trị này có thể là số, chuỗi, hoặc danh sách một file dựa vào đường dẫn của thư
mục. Hãy xem phần ví dụ để hiểu rõ hơn.

2. Ví dụ vòng lặp for trong shell script

Ví dụ đơn giản và thực tế nhất .


Ví dụ 1: In ra dãy số từ 0 đến 9.
for var in 0 1 2 3 4 5 6 7 8 9
do
echo $var
done
Khi thực thi đoạn code này ta sẽ nhận được kết quả như sau: 1 2 3 4 5 6 7 8 9
Ví dụ 2:
for i in {1..5}
do
echo $i
done
kết quả: ………….
Ví dụ 3: Hiển thị danh sách các file có tên bắt đầu bằng .bash, tại thư mục home của user.

#!/bin/sh

for FILE in $HOME/.bash*

do

echo $FILE

done

Kết quả sẽ có dạng như sau:


/root/.bash_history
/root/.bash_logout
/root/.bash_profile
/root/.bashrc
Ví dụ 4: Để lặp qua danh sách các thư mục hoặc tệp tin, ta có thể sử dụng wildcard (*) để liệt kê chúng
for file in /path/to/directory/*
do
echo $file
done
Giải thích chi tiết:
for variable in list: Khai báo vòng lặp, variable sẽ lấy giá trị từ list một cách lần lượt.
do: Bắt đầu khối lệnh của vòng lặp.
# Các lệnh thực thi trong vòng lặp: Đây là nơi bạn đặt các lệnh muốn thực thi trong mỗi vòng lặp.
done: Kết thúc khối lệnh của vòng lặp.
Bài tập 1: In ra bảng cửu chương từ 2 đến 9.
#!/bin/bash

for i in {2..9}
do
for j in {1..10}
do
echo -n "$i x $j = $((i*j)) "
done
echo ""
done
Giải thích:
 Bài toán này sử dụng hai vòng lặp for lồng nhau. Vòng lặp bên ngoài (for i in {2..9}) duyệt qua
các số từ 2 đến 9 (bảng cửu chương từ 2 đến 9).
 Vòng lặp bên trong (for j in {1..10}) duyệt qua các số từ 1 đến 10 để in ra bảng cửu chương.
Bài tập 2: Tính tổng của các số từ 1 đến 100.
#!/bin/bash

sum=0

for ((i=1; i<=100; i++))


do
((sum+=i))
done

echo "Tổng của các số từ 1 đến 100 là: $sum"


Giải thích:
 Sử dụng vòng lặp for để duyệt qua các số từ 1 đến 100 (for ((i=1; i<=100; i++))).
 Biến sum được sử dụng để tính tổng các số.
 Trong mỗi vòng lặp, giá trị của i được thêm vào sum.
 Cuối cùng, in ra tổng của các số từ 1 đến 100.
Bài tập 3: Kiểm tra xem một số có phải là số nguyên tố không.
#!/bin/bash

echo -n "Nhập một số nguyên dương: "


read num

is_prime=true

for ((i=2; i<=num/2; i++))


do
if [ $((num%i)) -eq 0 ]; then
is_prime=false
break
fi
done

if $is_prime; then
echo "$num là số nguyên tố."
else
echo "$num không phải là số nguyên tố."
fi
Giải thích:
 Sử dụng vòng lặp for để kiểm tra từ 2 đến nửa giá trị của số nhập vào (for ((i=2; i<=num/2; i+
+))).
 Sử dụng biểu thức điều kiện để kiểm tra xem số có phải là số nguyên tố hay không.
 Nếu số không phải là số nguyên tố, thoát khỏi vòng lặp và đặt biến is_prime thành false.
 Cuối cùng, in ra kết quả dựa trên giá trị của is_prime.
Bài tập 4: In ra dãy Fibonacci với n số.
#!/bin/bash

echo -n "Nhập số lượng số trong dãy Fibonacci: "


read n

a=0
b=1

for ((i=0; i<n; i++))


do
echo -n "$a "
temp=$((a+b))
a=$b
b=$temp
done

echo ""
Giải thích:
 Sử dụng vòng lặp for để in ra dãy Fibonacci với n số (for ((i=0; i<n; i++))).
 Biến a và b lần lượt là hai số đầu tiên của dãy Fibonacci.
 Trong mỗi vòng lặp, in ra giá trị của a và cập nhật a và b cho vòng lặp tiếp theo.
Bài tập 5: Kiểm tra tính đối xứng của một chuỗi.
#!/bin/bash

echo -n "Nhập một chuỗi: "


read input_string

length=${#input_string}
is_palindrome=true

for ((i=0; i<length/2; i++))


do
if [ "${input_string:i:1}" != "${input_string:length-i-1:1}" ]; then
is_palindrome=false
break
fi
done

if $is_palindrome; then
echo "$input_string là chuỗi đối xứng."
else
echo "$input_string không phải là chuỗi đối xứng."
fi
Giải thích:
 Sử dụng vòng lặp for để kiểm tra tính đối xứng của chuỗi (for ((i=0; i<length/2; i++))).
 Sử dụng biểu thức điều kiện để so sánh các ký tự đối xứng trong chuỗi.
 Nếu có một ký tự nào không đối xứng, thoát khỏi vòng lặp và đặt biến is_palindrome thành
false.
 Cuối cùng, in ra kết quả dựa trên giá trị của is_palindrome.

10. Lệnh Case .. esac trong Shell Script


Trong bài này chúng ta sẽ tìm hiểu lệnh case .. esac trong shell script, đây là lệnh rẻ nhánh có công
dụng như lệnh if else.
Nếu ta đã từng học một ngôn ngữ lập trình bất kì thì sẽ thấy đây chính là lệnh switch case, chỉ là cú
pháp trong shell script có khác biệt hơn.
Mục lục

 1. Cú pháp lệnh case .. esac trong shell script

 2. Ví dụ lệnh case .. esac trong shell script

1. Cú pháp lệnh case .. esac trong shell script

Thực tế ta có thể sử dụng lệnh if else để xử lý theo nhiều luồng khác nhau, tuy nhiên không phải lúc
nào nó cũng tốt, nhất là trường hợp tất cả các luồng đều phụ thuộc vào một giá trị. Trường hợp này ta
nên sử dụng lệnh
case .. esac.

Cú pháp:

case word in
pattern1)
Statement(s)
;;
pattern2)
Statement(s)
;;

Statement(s)
;;
*)
Default
;;
esac

Trong đó:
 word chính là giá trị mà ta muốn dùng để rẻ nhánh chương trình thành nhiều luồng.
 pattern1), pattern2), ... chính là các nhánh cho mỗi trường hợp,
 Default sẽ được chạy nếu không có nhánh nào ở trên phù hợp.

2. Ví dụ lệnh case .. esac trong shell script

Ví dụ 1: In ra màn hình thông tin của trái cây

Live Demo
#!/bin/sh

FRUIT="kiwi"

case "$FRUIT" in
"apple") echo "An tao rat ngon."
;;
"taana") echo "Chuoi nhieu chat dinh duong."
;;
"kiwi") echo "Kiwi noi tieng o New Zealand"
;;
esac
Cú pháp nó hơi rườm rà so với những ngôn ngữ lập trình như C, C++, PHP.
Khi chạy chương trình trên ta sẽ thu được kết quả là:
"Kiwi noi tieng o New Zealand" bởi biến FRUIT = "kiwi".
Ví dụ 2: Sử dụng case..esac với giá trị số
#!/bin/bash
echo "Nhập một số từ 1 đến 3:"
read num
case $num in
1)
echo "Bạn chọn số một."
;;
2)
echo "Bạn chọn số hai."
;;
3)
echo "Bạn chọn số ba."
;;
*)
echo "Số không hợp lệ."
;;
Esac
Kết quả: ……………………
Ví dụ 3: Viết chương trình đọc thông tin của file dựa vào tham số truyền vào của người dùng.
hãy tạo một file test.sh với nội dung như sau.

#!/bin/sh

option="${1}"
case ${option} in
-f) FILE="${2}"
echo "File name is $FILE"
;;
-d) DIR="${2}"
echo "Dir name is $DIR"
;;
*)
echo "`basename ${0}`:usage: [-f file] | [-d directory]"
exit 1 # Command to come out of the program with status 1
;;
Esac

Ví dụ4: Sử dụng case..esac với chuỗi


#!/bin/bash

echo "Nhập một loại quả (apple, banana, orange):"


read fruit
case $fruit in
apple)
echo "Bạn chọn táo."
;;
banana)
echo "Bạn chọn chuối."
;;
orange)
echo "Bạn chọn cam."
;;
*)
echo "Loại quả không hợp lệ."
;;
Es
Giải thích:
Lệnh case kiểm tra giá trị của biến $fruit.
Nếu giá trị là "apple", in ra "Bạn chọn táo", và tương tự cho các giá trị khác.
Nếu không có pattern nào match, in ra "Loại quả không hợp lệ."ac
Ví dụ 5: Sử dụng case..esac với biểu thức chính quy
#!/bin/bash

echo "Nhập một chữ cái:"


read char

case $char in
[aeiou])
echo "Chữ cái là nguyên âm."
;;
[bcdfghjklmnpqrstvwxyz])
echo "Chữ cái là phụ âm."
;;
*)
echo "Không phải là chữ cái."
;;
Esac
Giải thích:
 Sử dụng biểu thức chính quy trong case để kiểm tra xem chữ cái là nguyên âm hay phụ âm.
 Nếu chữ cái là một trong các ký tự [aeiou], in ra "Chữ cái là nguyên âm".
 Nếu chữ cái là một trong các ký tự [bcdfghjklmnpqrstvwxyz], in ra "Chữ cái là phụ âm".
 Nếu không có pattern nào match, in ra "Không phải là chữ cái."
Ví dụ 6: Sử dụng case..esac với số liệu lớn hơn

#!/bin/bash

echo "Nhập một số từ 1 đến 5:"


read num

case $num in
1|2)
echo "Bạn chọn số một hoặc hai."
;;
3|4)
echo "Bạn chọn số ba hoặc bốn."
;;
5)
echo "Bạn chọn số năm."
;;
*)
echo "Số không hợp lệ."
;;
Esac

Giải thích:
 Sử dụng cú pháp 1|2 để chỉ định rằng nếu giá trị là 1 hoặc 2, sẽ thực hiện lệnh tương ứng.
 Tương tự cho các cặp giá trị khác.

Ví dụ 7: Sử dụng case..esac trong một kịch bản thực tế

#!/bin/bash

echo "Chào mừng đến với hệ thống quản lý tệp tin!"

echo "Chọn một chức năng (list, create, delete):"

read choice

case $choice in

list)

ls -l

;;

create)

echo "Nhập tên tệp tin mới:"


read filename

touch $filename

echo "Tạo tệp tin $filename thành công."

;;

delete)

echo "Nhập tên tệp tin cần xóa:"

read filename

rm -i $filename

echo "Xóa tệp tin $filename thành công."

;;

*)

echo "Chức năng không hợp lệ."

;;

Esac

Giải thích:

 Sử dụng case..esac để xử lý các chức năng khác nhau của một hệ thống quản lý tệp tin giản đơn.

 Tùy thuộc vào lựa chọn của người dùng, sẽ thực hiện các lệnh tương ứng.

Bài tập 1: Kiểm tra loại hình tam giác

Yêu cầu:

Viết một script để nhập ba cạnh của tam giác và sử dụng lệnh case..esac để xác định loại hình tam giác (nhọn,
vuông, tù).
Bài tập 2: Kiểm tra ngày của tháng

Yêu cầu:

Viết một script để nhập một số từ 1 đến 12 và sử dụng lệnh case..esac để xác định số ngày trong tháng đó.

Bài tập 3: Kiểm tra ký tự đặc biệt


Yêu cầu: Viết một script để nhập một ký tự và sử dụng lệnh case..esac để xác định xem ký tự đó là chữ cái in
hoa, chữ cái in thường, số hay ký tự đặc biệt.

Bài tập 4: Kiểm tra phương trình bậc 2

Yêu cầu: Viết một script để nhập các hệ số a, b, c của một phương trình bậc 2 và sử dụng lệnh case..esac để xác
định số nghiệm của phương trình.
Bài tập 5: Kiểm tra chuỗi Palindrome

Yêu cầu: Viết một script để nhập một chuỗi và sử dụng lệnh case..esac để xác định xem chuỗi đó có phải là
chuỗi Palindrome không.

You might also like