Câu trả lời:
đây là một ví dụ cho bash:
usage="$(basename "$0") [-h] [-s n] -- program to calculate the answer to life, the universe and everything
where:
-h show this help text
-s set the seed value (default: 42)"
seed=42
while getopts ':hs:' option; do
case "$option" in
h) echo "$usage"
exit
;;
s) seed=$OPTARG
;;
:) printf "missing argument for -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
\?) printf "illegal option: -%s\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
esac
done
shift $((OPTIND - 1))
Để sử dụng điều này bên trong một chức năng:
"$FUNCNAME"
thay vì$(basename "$0")
local OPTIND OPTARG
trước khi gọigetopts
basename
với dấu gạch đầu dòng.
"$FUNCNAME"
không "$0"
. Ngoài ra, thêmlocal OPTIND OPTARG
FUNCNAME
làm. Tôi có tất cả các chức năng của mình trong một tệp duy nhất, vì vậy điều này là hoàn hảo để mở rộng chúng thành một cái gì đó hữu ích cho những người khác.
"$usage"
mọi nơi bạn sử dụng nó.
shift $((OPTIND - 1))
?
Đối số đầu tiên cho tập lệnh shell có sẵn dưới dạng biến $1
, vì vậy việc thực hiện đơn giản nhất sẽ là
if [ "$1" == "-h" ]; then
echo "Usage: `basename $0` [somestuff]"
exit 0
fi
Nhưng những gì anubhava nói.
[
là phiên bản tuân thủ POSIX.
function
: Bạn nên thay thế exit 0
bằng return
nếu bạn không muốn chấm dứt trình bao sau khi chạy chức năng của mình. (Tôi đã làm điều đó trước)
Đây là phần tôi sử dụng để khởi động máy chủ VNC
#!/bin/bash
start() {
echo "Starting vnc server with $resolution on Display $display"
#your execute command here mine is below
#vncserver :$display -geometry $resolution
}
stop() {
echo "Killing vncserver on display $display"
#vncserver -kill :$display
}
#########################
# The command line help #
#########################
display_help() {
echo "Usage: $0 [option...] {start|stop|restart}" >&2
echo
echo " -r, --resolution run with the given resolution WxH"
echo " -d, --display Set on which display to host on "
echo
# echo some stuff here for the -a or --add-options
exit 1
}
################################
# Check if parameters options #
# are given on the commandline #
################################
while :
do
case "$1" in
-r | --resolution)
if [ $# -ne 0 ]; then
resolution="$2" # You may want to check validity of $2
fi
shift 2
;;
-h | --help)
display_help # Call your function
exit 0
;;
-d | --display)
display="$2"
shift 2
;;
-a | --add-options)
# do something here call function
# and write it in your help function display_help()
shift 2
;;
--) # End of all options
shift
break
;;
-*)
echo "Error: Unknown option: $1" >&2
## or call function display_help
exit 1
;;
*) # No more options
break
;;
esac
done
######################
# Check if parameter #
# is set too execute #
######################
case "$1" in
start)
start # calling function start()
;;
stop)
stop # calling function stop()
;;
restart)
stop # calling function stop()
start # calling function start()
;;
*)
# echo "Usage: $0 {start|stop|restart}" >&2
display_help
exit 1
;;
esac
Có một điều hơi lạ là tôi đã đặt bắt đầu dừng khởi động lại trong một trường hợp riêng nhưng nó sẽ hoạt động
if
Nếu bạn chỉ có một tùy chọn duy nhất để kiểm tra và nó sẽ luôn là tùy chọn đầu tiên ( $1
) thì giải pháp đơn giản nhất là if
kiểm tra ( [
). Ví dụ:
if [ "$1" == "-h" ] ; then
echo "Usage: `basename $0` [-h]"
exit 0
fi
Lưu ý rằng để tương thích posix =
sẽ hoạt động tốt như ==
.
$1
?Lý do $1
cần phải được đặt trong dấu ngoặc kép là nếu không có $1
thì shell sẽ cố chạy if [ == "-h" ]
và thất bại vì ==
chỉ được đưa ra một đối số duy nhất khi nó đang mong đợi hai:
$ [ == "-h" ]
bash: [: ==: unary operator expected
getopt
hoặcgetopts
Theo đề xuất của người khác , nếu bạn có nhiều hơn một tùy chọn đơn giản hoặc cần tùy chọn của mình để chấp nhận một đối số, thì bạn chắc chắn nên sử dụng thêm độ phức tạp getopts
.
Là một tài liệu tham khảo nhanh, tôi thích Hướng dẫn getopts 60 giây . †
Bạn cũng có thể muốn xem xét getopt
chương trình thay vì được tích hợp sẵn getopts
. Nó cho phép sử dụng các tùy chọn dài và các tùy chọn sau các đối số không phải tùy chọn (ví dụ foo a b c --verbose
thay vì chỉ foo -v a b c
). Câu trả lời Stackoverflow này giải thích cách sử dụng GNU getopt
.
† jeffbyrnes đã đề cập rằng liên kết ban đầu đã chết nhưng rất may cách máy quay lại đã lưu trữ nó.
Tốt hơn để sử dụng cơ sở getopt của bash. Vui lòng xem phần Hỏi & Đáp này để được trợ giúp thêm: Sử dụng getopts trong tập lệnh bash shell để có các tùy chọn dòng lệnh dài và ngắn
tôi nghĩ bạn có thể sử dụng trường hợp này ...
case $1 in
-h) echo $usage ;;
h) echo $usage ;;
help) echo $usage ;;
esac