Lập trình shell

Sử dụng getopts

Nguyễn Hải Châu (nhchau@gmail.com)
Trường Đại học Công nghệ, ĐHQGHN

Truyền tham số với getopts

cat opt1.sh
## #!/bin/bash
## while getopts ":a" opt; do
##   case $opt in
##     a)
##       echo "-a was triggered!" >&2 ;;
##     \?)
##       echo "Invalid option: -$OPTARG" >&2 ;;
##   esac
## done
## shift "$((OPTIND-1))"
  • Dấu : ở đầu danh sách option làm cho getopts không thông báo lỗi option
  • Sau mỗi option, nếu có : theo sau thì option đó bắt buộc có tham số

Truyền tham số với getopts

./opt1.sh -a
./opt1.sh -a 12
## -a was triggered!
## -a was triggered!
./opt1.sh -a 1 -b
./opt1.sh -b
## -a was triggered!
## Invalid option: -b
./opt1.sh cd

Truyền tham số với getopts

./opt1.sh -a -a -a -a x 
## -a was triggered!
## -a was triggered!
## -a was triggered!
## -a was triggered!
  • Vấn đề:
    • Các option lặp bị xử lý nhiều lần: Cần tự xử lý bằng chương trình
    • Option với dấu trừ có thể bị hiểu lầm là giá trị tham số

Option có tham số

cat opt2.sh 
## #!/bin/bash
## while getopts ":a:b:c" opt; do
##   case $opt in
##     a) echo "-a was triggered, Parameter: $OPTARG" >&2 ;;
##     b) echo "-b triggered $OPTARG" ;;
##     c) echo "-c triggered $OPTARG" ;;
##     \?) echo "Invalid option: -$OPTARG" >&2
##       exit 1 ;;
##     :) echo "Option -$OPTARG requires an argument." >&2
##       exit 1 ;;
##   esac
## done
## shift "$((OPTIND-1))"

Option có tham số

./opt2.sh
./opt2.sh /etc/hosts
./opt2.sh -b
## Option -b requires an argument.
./opt2.sh -a /etc/hosts
## -a was triggered, Parameter: /etc/hosts
./opt2.sh -a /etc/hosts
## -a was triggered, Parameter: /etc/hosts

Một số biến tự động của getopts

  • OPTIND: Biến chỉ số của option sẽ xử lý trong bước tiếp theo
  • OPTARG: Giá trị tham số truyền cho option
  • OPTERR: Nếu nhận giá trị 1 (default), bash sẽ thông báo lỗi có trong quá trình phân tích option, nếu nhận giá trị 0 sẽ không thông báo lỗi