微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

BASH getopts可选参数

我试图创build一个shell脚本,它有两个必须的参数(arg1,arg2),然后是一个可选的-b标志加上需要遵循的参数,如果用户select使用标志。

让我解释:

这是一个安装脚本,它利用GIT从Github存储库中获取应用程序。 用户键入terminalf.ex .:

./shellscript.sh new <app_name> # fetches master branch by default

脚本从这个仓库获取主分支的一个实例。 如果用户select使用可选的-b标志,这意味着他/她想要指定要获取哪个分支,例如开发分支。 这意味着用户可以这样做:

如何在terminal中以静音模式运行摩卡testing

运行shell命令,不要等待返回

在bash脚本中获取调用者脚本的名称

一个命令的末尾,“</ dev / null>&/ dev / null”是做什么的?

sed在Linux中replaceASCII字符

./shellscript.sh new <app_name> -b develop # or which ever branch there is available

我也很好奇你怎样才能使脚本工作,以便用户在“new”参数和“app_name”参数之前input-b标志+分支名称并不重要。 但这可能不是目前最重要的事情。

要知道我正在试图build立什么,这是一个链接到我目前的脚本,只接受两个强制性的参数,只提取主分支: 我的超酷工匠可执行脚本

PS:我一直在试用很多使用getopts的例子,在这里我已经在Stackoverflow和其他博客上find了这两个例子,但没有一个帮助我完全使它工作。 因此,我在这里问你们是否有很好的人帮忙。

非常感谢,一定要检查我的Linux Mint / Ubuntu的 – 后安装脚本只有很酷的人(你们和那些从Windows / Mac切换到Linux)

问候,绒毛

UNIX shell脚本,用于从文件运行grep命令列表并获取单个分隔文件的结果

用jq和引用值处理json数组

长时间运行的PHP脚本在通过exec()调用时停止,但在通过CLI调用时结束

Bash脚本与预期一起

为什么我的awk命令打印多一行?

我通常写我自己的,以允许短期和长期的选择:

function Usage() { cat <<-ENDOFMESSAGE $0 [OPTION] REQ1 REQ2 options: -b -branch branch to use -h --help display this message ENDOFMESSAGE exit 1 } function Die() { echo "$*" exit 1 } function Getopts() { branch="" argv=() while [ $# -gt 0 ] do opt=$1 shift case ${opt} in -b|--branch) if [ $# -eq 0 -o "${1:0:1}" = "-" ]; then Die "The ${opt} option requires an argument." fi branch="$1" shift ;; -h|--help) Usage;; *) if [ "${opt:0:1}" = "-" ]; then Die "${opt}: unkNown option." fi argv+=(${opt});; esac done } Getopts $* echo "branch ${branch}" echo "argv ${argv[@]}"

Unix实用程序通常在位置参数之前使用可选参数(“标志”),尽管大多数GNU实用程序(包括C库的GNU实现函数getopt ,shuffle命令行参数,以便可选参数优先)。 然而,bash内置的getopts并没有洗牌,这意味着如果你愿意的话,你可以这样做。

getopts总是以变量OPTIND的值为参数的参数开始。 (每次执行bash函数时,OPTIND都被设置为1,这是一个全局变量,所以需要使用相互调用bash函数的小心谨慎)如果你想,你可以自己设置OPTIND,然后下一个调用getopts将以该索引开始。 或者,您可以使用shift来移动所有的命令行参数。

所以,例如,你可以这样做:

# "shift" version: always shift consumed arguments local verb="$1" branch=master app_name option shift case $verb in new) app_name="$1" shift while getopts b: option; do case $option in b) branch=$OPTARG;; *) # handle the error;; esac done shift $((OPTIND - 1));; *) # handle the error or other subcommands;; esac # At this point,there are still arguments if ((OPTIND > 0))

要么:

# non-shift version: use OPTIND to index arguments local verb="${!OPTIND}" branch=master app_name option OPTIND=$((OPTIND + 1)) case $verb in new) app_name="${!OPTIND}" OPTIND=$((OPTIND + 1)) while getopts b: option; do case $option in b) branch=$OPTARG;; *) # handle the error;; esac done;; *) # handle the error or other subcommands;; esac # At this point,there are still arguments if ((OPTIND > $#))

一点点简化的版本,使用getopts可以报​​告错误

#!/usr/bin/bash help() { echo -e "Usagent$0: new <app_name> [-b <develop>]" >&2;} die() { [ -n "$1" ] && echo -e "Error: $1n" >&2; help; [ -z "$1" ]; exit;} [ $# -lt 2 ] && die "Too few args" [ $1 != "new" ] && die "Bad first arg ($1)" app_name=$2 shift 2 unset develop while getopts "b:" opt; do case $opt in ?) exit 1;; b) develop="$OPTARG";; esac done echo "app_name: $app_name,develop: $develop"

测试:

$./test new App app_name: App,develop: $./test new App -b Dev app_name: App,develop: Dev

无论如何,我可能会建议使用标准的参数传递方式。 而不是new你可以使用-n 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐