Professional Documents
Culture Documents
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
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.
#!/bin/sh
do
echo $FILE
done
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
is_prime=true
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
a=0
b=1
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
length=${#input_string}
is_palindrome=true
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.
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.
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
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
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.
#!/bin/bash
read choice
case $choice in
list)
ls -l
;;
create)
touch $filename
;;
delete)
read filename
rm -i $filename
;;
*)
;;
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.
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 đó.
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.