"Cách thích hợp" của việc sử dụng các tùy chọn dài trong kịch bản lệnh shell là thông qua tiện ích GNU getopt . Ngoài ra còn có các getopts được tích hợp sẵn , nhưng nó chỉ cho phép các tùy chọn ngắn như -t
. Một vài ví dụ về getopt
việc sử dụng có thể được tìm thấy ở đây .
Đây là một kịch bản thể hiện cách tôi tiếp cận câu hỏi của bạn. Giải thích về hầu hết các bước được thêm vào dưới dạng nhận xét trong chính kịch bản.
#!/bin/bash
# GNU getopt allows long options. Letters in -o correspond to
# comma-separated list given in --long.
opts=$(getopt -o t --long test -- "$*")
test $? -ne 0 && exit 2 # error happened
set -- $opts # some would prefer using eval set -- "$opts"
# if theres -- as first argument, the script is called without
# option flags
if [ "$1" = "--" ]; then
echo "Not testing"
testing="n"
# Here we exit, and avoid ever getting to argument parsing loop
# A more practical case would be to call a function here
# that performs for no options case
exit 1
fi
# Although this question asks only for one
# option flag, the proper use of getopt is with while loop
# That's why it's done so - to show proper form.
while true; do
case "$1" in
# spaces are important in the case definition
-t | --test ) testing="y"; echo "Testing" ;;
esac
# Loop will terminate if there's no more
# positional parameters to shift
shift || break
done
echo "Out of loop"
Với một vài đơn giản hóa và xóa bình luận, điều này có thể được cô đọng thành:
#!/bin/bash
opts=$(getopt -o t --long test -- "$*")
test $? -ne 0 && exit 2 # error happened
set -- $opts
case "$1" in
-t | --test ) testing="y"; echo "Testing";;
--) testing="n"; echo "Not testing";;
esac