Friday, December 15, 2006

Tạo menu tương tác với shell script

Tôi thường dùng shell script để làm vài việc lặt vặt với ... số lượng lớn, ví dụ: migrate account, convert addressbook, backup data. Dữ liệu thường được đọc từ file, họa hoằn lắm mới thêm vài option. Đơn giản là để giải quyết bài toán một hoặc hai lần nên làm sao cho nhanh nhất là được. Nếu script được dùng thường xuyên với input khác nhau buộc phải nghĩ đến cách chuyển sang dạng menu tương tác để hạn chế option cho ... chính shell script.

Cách đơn giản nhất để tạo menu tương tác là dùng vòng lặp vô tận: in menu, lấy lựa chọn, xử lý. Viết một vòng lặp như thế với bash không khó nhưng rườm rà, nghĩ tới là đã nản. May mắn thay bash có lệnh buillt-in select giúp việc tạo menu dễ như trở bàn tay. Dưới đây là một ví dụ Thực đơn quán bà Tám:
#!/bin/bash
# menu.sh
PS3="Mời bạn chọn thực đơn: "
select thucdon in "Sáng" "Trưa" "Tối" "Thoát"; do
case "$thucdon" in
"Sáng")
echo "Bún bò + cafê đá"
;;
"Trưa")
echo "Cơm tấm sườn"
;;
"Tối")
echo "Bún chả cá"
;;
"Thoát")
break
;;
esac
done
Kết quả:
$ sh menu.sh
1) Sáng
2) Trưa
3) Tối
4) Thoát
Mời bạn chọn thực đơn: 1
Bún bò + cafê đá
Mời bạn chọn thực đơn:
Chỉ có mấy lưu ý:
  • PS3: dùng để hiển thị dấu nhắc lựa chọn, nếu dùng select lồng nhau thì nhớ lưu và khôi phục giá trị này
  • Kết thúc vòng lặp select bằng break

1 comment:

Duy Duong said...

#!/bin/bash
for ((;;))
do
echo "---------MENU---------"
echo "1. Sang"
echo "2. Trua"
echo "3. Toi"
echo "4. Thoat"
echo "----------------------"
echo -n "Chon thuc don: "
read key
case "$key" in
1)
echo "Bun bo + cafe da"
;;
2)
echo "Com tam suon"
;;
3)
echo "Bun cha ca"
;;
4)
break
;;
esac
done
exit 0