我想以这种方式调用myscript
文件:
$ ./myscript -s 45 -p any_string
或
$ ./myscript -h #should display help
$ ./myscript #should display help
我的要求是:
getopt
在此处获取输入参数- 检查
-s
是否存在,如果不存在则返回错误 - 检查
-s
后面的值是否为45或90 - 检查
-p
是否存在,并且在 - 如果用户输入
./myscript -h
或仅输入./myscript
,则显示帮助
到目前为止,我尝试了以下代码:
#!/bin/bash
while getopts "h:s:" arg; do
case $arg in
h)
echo "usage"
;;
s)
strength=$OPTARG
echo $strength
;;
esac
done
但是使用该代码时会出现错误。如何使用Bash和getopt
进行处理?
8条答案
按热度按时间brccelvz1#
运行示例:
exdqitrt2#
原始代码的问题在于:
h:
在不应该的地方需要参数,因此将其更改为h
(不带冒号)-p any_string
,您需要将p:
添加到参数列表中基本上
:
在选项之后意味着它需要参数。getopts
的基本语法是(请参见:man bash
):其中:
OPTSTRING
是包含预期参数列表的字符串,h
-检查不带**参数的-h
**选项;在不支持的选项上给出错误;h:
-检查带有**参数的-h
**选项;在不支持的选项上给出错误;abc
-检查选项-a
、-b
和-c
;在不支持的选项上给出错误;:abc
-检查选项-a
、-b
和-c
;静默不支持的选项上的错误;注意:换句话说,选项前的冒号允许您处理代码中的错误。如果选项不受支持,变量将包含
?
,如果缺少值,变量将包含:
。OPTARG
-设置为当前参数值,OPTERR
-指示Bash是否应显示错误消息。因此代码可以是:
示例用法:
查看:Bash Hackers Wiki上的Small getopts tutorial
tct7dpnv3#
使用
getopt
"为什么要找个顶篷“
解析详细的命令行参数,以避免混淆,并澄清我们正在解析的选项,以便命令的读者可以了解发生了什么。
"什么是getopt"
getopt
用于分解(解析)命令行中的选项,以便于shell过程解析,并检查法律的的选项。它使用GNUgetopt(3)
例程来完成此任务。getopt
可以具有以下类型的选项。1.无值选项
1.键值对选项
注:在本文档中,在解释语法时:
如何使用
getopt
?语法:第一种形式
示例:
这里的h,v,t是选项,-h -v -t是在命令行中如何给出选项。
1.'h'是无值选项。
1.'v:'表示选项-v有值且为胁迫选项。':'表示有值。
1.'t::'表示选项-t有值但为可选。'::'表示可选。
在可选参数中,value和选项不能有空格分隔。因此,在“-t123”示例中,-t是选项123是值。
语法:第二种形式
下面将getopt分为五个部分
示例
语法:第三种形式
下面将getopt分为五个部分
示例
获取选项
getopt_options更改命令行参数的解析方式。
下面是getopt_options的一些选项
选项:-l或--long选项
表示getopt命令应允许识别多字符选项。多个选项用逗号分隔。
例如,
--name=Karthik
是在命令行中发送的长选项。由于指定了name:,因此该选项应包含一个值
选项:-a或--替代
表示getopt命令应允许long选项具有单破折号“-”而不是双破折号“--”。
例如,您可以只使用
-name=Karthik
来代替--name=Karthik
包含以下代码的完整脚本示例:
运行此脚本文件:
watbbzwu4#
与
getopt
打包在一起的示例(我的发行版将其放在/usr/share/getopt/getopt-parse.bash
中)看起来涵盖了您的所有情况:ubof19bj5#
我知道这个问题已经回答了,但是为了记录在案,也为了和我有同样要求的人,我决定发布这个相关的答案。代码中充斥着解释代码的评论。
更新答案:
将文件保存为
getopt.sh
:然后您可以这样使用它:
旧答案:
我最近需要使用一种通用的方法。我遇到了这个解决方案:
我没有粗略地测试它,所以我可能有一些错误。
1mrurvl16#
POSIX 7示例
还值得检查标准中的示例:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html
然后我们可以试试看:
在Ubuntu 17.10中测试,
sh
为破折号0.5.8。bweufnob7#
“getops”和“getopt”非常有限。虽然“getopt”建议不要使用,但它确实提供了较长的选项。而“getopts”只允许使用单个字符选项,如“-a”和“-b”。使用这两个选项都有一些缺点。
所以我写了一个小脚本来代替“getopts”和“getopt”。这是一个开始,它可能会得到很大的改进。
2020年4月8日更新:我添加了对连字符的支持,例如“--package-name”。
用法:“./script.sh软件包安装--软件包“名称中带空格”--生成--存档”
s4chpxco8#
把Mark G.注解中的一行代码(在Adrian Frühwirth's answer下)变成一个更易读的答案--这展示了如何避免使用
getops
来获得 * 可选参数 *:正如N.卡约的评论中所指出的:
如果选项和它们的参数之间没有空格,它将失败。
但是,为了使它更符合POSIX(来自Mark G.的其他评论):