gpt4 book ai didi

linux - Shell脚本参数解析

转载 作者:IT王子 更新时间:2023-10-29 00:20:19 25 4
gpt4 key购买 nike

关于这类事情有很多问题,但让我们假设我们的目标是安装了 getopt 和 getopts 的通用 Linux 系统(我们不会使用其中任何一个,但它们似乎很流行)

我如何解析长参数(--example | --example simple-option)和短参数(-e | -esimple-example | -e simple-example)

最佳答案

您想将 getopt 与长选项和短选项一起使用。工作代码示例:

# Parse arguments
TEMP=$(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 %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 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 代码,这些代码应该默认安装。

关于linux - Shell脚本参数解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com