您想使用
getopt多头和空头期权。工作代码示例:
# Parse argumentsTEMP=$(getopt -n $PROGRAM_NAME -o p:P:cCkhnvVS --long domain-password:,pop3-password: ,create,cron,kill,help,no-sync-passwords,version,verbose,skip-pop3 -- "$@")# Die if they fat finger arguments, this program will be run as root[ $? = 0 ] || die "Error parsing arguments. Try $PROGRAM_NAME --help"eval set -- "$TEMP"while true; do case $1 in -c|--create) MODE="CREATE"; shift; continue ;; -C|--cron) MODE="CRON"; shift; continue ;; -k|--kill) MODE="KILL"; shift; continue ;; -h|--help) usage exit 0 ;; -n|--no-sync-passwords) SYNC_VHOST=0; shift; continue ;; -p|--domain-password) DOMAIN_PASS="$2"; shift; shift; continue ;; -P|--pop3-password) POP3_PASS="$2"; shift; shift; continue ;; -v|--version) printf "%s, version %sn" "$PROGRAM_NAME" "$PROGRAM_VERSION" exit 0 ;; -v|--verbose) VERBOSE=1; shift; continue ;; -S|--skip-pop3)SKIP_POP=1; shift; continue ;; --) # no more arguments to parse break ;; *) printf "Unknown option %sn" "$1" exit 1 ;; esac done
注意,
die是先前定义的功能(未显示)。
该
-n选项告诉getopt将错误报告为我的程序的名称,而不是
getopt。
-o定义一个简短选项列表(
:在一个选项之后指示所需的参数)并
--long指定一个长选项列表(对应于简短选项)。
其余的只是一个简单的开关,
shift适当地调用以前进参数指针。注意,打电话
shift;shift;只是一种顽固的习惯。在当前的现代世界中,
shift 2可能就足够了。
现代的getopt在较新的平台上非常一致,但是您可能会在较旧的系统(大约在Redhat 9之前)上遇到一些可移植性问题。请参阅
mangetopt以获取有关向后兼容性的信息。但是,您不太可能会遇到它的需求。
最后,在解析选项之后,您可以再次调用:
eval set -- "$@"
在完成getopt解析选项后,这会将参数指针移至命令行上剩余的任何位置。然后,您可以
shift继续阅读它们。例如,如果命令如下所示:
./foo --option bar file1.txt file2.txt file3.txt
完成后,别忘了提供一个方便的
-h /--help选项来打印新的花式选项。:)如果使该输出对help2man友好,则会有一个即时手册页与您的新工具一起使用。
编辑
在大多数发行版中,您可以在中找到更多示例
getopt代码
/usr/share/doc/util-linux/examples,这些代码应默认情况下已安装。



