Shell脚本参数parsing

关于这种事情有很多问题,但是让我们假设我们的目标是一个通用的Linux系统,同时安装了getopt和getopts(不是我们也会使用它们,但是它们似乎很受欢迎)

如何parsinglong(–example | –example simple-option)和short argruments(-e | -esimple-example | -e simple-example)

你想用长期和短期的选择使用getopt 。 来自工作代码的示例:

 # Parse arguments TEMP=$(getopt -n $PROGRAM_NAME -op: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 %s\n" "$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 %s\n" "$1" exit 1 ;; esac done 

请注意, die是先前定义的功能(未显示)。

-n选项告诉getopt将错误报告为我的程序的名称,而不是getopt-o定义了一个短期选项列表( :在一个选项指示了一个必需的参数之后),– --long指定了长期选项列表(对应于短期选项)。

其余的只是一个简单的开关,调用适当的shift来推进参数指针。 请注意,呼叫shift; shift; shift; shift; 只是一个顽固的习惯。 在目前的现代世界中, shift 2可能就足够了。

现代的getopt在较新的平台上是相当一致的,但是你可能会遇到一些旧版本(大约在Redhat 9之前)的可移植性问题。 有关向后兼容性的信息,请参阅man getopt 。 然而,你不太可能会遇到它的需要。

最后,在解析选项之后,你可以再次调用:

 eval set -- "$@" 

在getopt完成解析选项之后,这会将参数指针移动到命令行上的其他任何内容。 你可以shift继续阅读。 例如,如果一个命令是这样的:

 ./foo --option bar file1.txt file2.txt file3.txt 

不要忘了做一个方便的-h / --help选项打印新的花式选项,一旦你完成。 :)如果你输出help2man友好,你有一个即时手册页去你的新工具。

编辑

在大多数发行版中,您可以在/usr/share/doc/util-linux/examples找到更多的getopt代码/usr/share/doc/util-linux/examples ,默认情况下应该已经安装。