Linux getopt/getopts解析命令行参数教程
一、说明
shell中获取参数可以直接使用$1、$2等形式来获取,但这种方式有明显的限制:每个参数的位置是固定的。比如如果在设计上$1是ip地址$2是端口,那在执行时就必须第一个参数是ip第二个参数是端口而不能反过来。
shell提供了getopt和getopts来解析参数,getopt比getopts功能强一些getopts比getopt简单一些;总体而言getopt和getopts都差强人意。
二、使用getopt解析参数
getopt比getopts强一些复杂一些:能在命令行中单独使用、支持长选项格式、支持选项值可选。更多说明见注释。
#/bin/bash
usage(){
echo "
Usage:
-i, --ip target server ip
-p, --port target service port
-h, --help display this help and exit
example1: testGetopt -i192.168.1. -p80
example2: testGetopt --ip=192.168.1.1 --port=
"
# 短格式中,选项值为可选的选项,选项值只能紧接选项而不可使用任何符号将其他选项隔开;如-p80,不要写成性-p
# 短格式中,选项值为必有的选项,选项值既可紧接选项也可以使用空格与选项隔开;如-i192.168.1.,也可写成-i 192.168.1.1
# 长格式中,选项值为可选的选项,选项值只能使用=号连接选项;如--port=,不可写成性--port80或--port
# 长格式中,选项值为必有的选项,选项值既可使用=号连接选项也可使用空格连接选项;如--ip=192.168.1.1,也可写成--ip 192.168.1.1
# 为简便起见,建议凡是短格式都使用“选项+选项值”的形式(-p80),凡是长格式都使用“选项+=+选项值”的形式(--port=)
}
main(){
while true
do
case "$1" in
-i|--ip)
ip="$2"
echo "ip: $ip"
shift
;;
-p|--port)
port="$2"
echo "port: $port"
shift
;;
-h|--help)
usage
# 打印usage之后直接用exit退出程序
exit
;;
--)
shift
break
;;
*)
echo "$1 is not option"
;;
esac
shift
done
# 剩余所有未解析到的参数存在$@中,可通过遍历$@来获取
#for param in "$@"
#do
# echo "Parameter #$count: $param"
#done
}
# 如果只注册短格式可以如下这样子
# set -- $(getopt i:p::h "$@")
# 如果要注册长格式需要如下这样子
# -o注册短格式选项
# --long注册长格式选项
# 选项后接一个冒号表示其后为其参数值,选项后接两个冒号表示其后可以有也可以没有选项值,选项后没有冒号表示其后不是其参数值
set -- $(getopt -o i:p::h --long ip:,port::,help -- "$@")
# 由于是在main函数中才实现参数处理,所以需要使用$@将所有参数传到main函数
main $@
持行效果:

参考:
https://blog.csdn.net/wh211212/article/details/53750366
http://yejinxin.github.io/parse-shell-options-with-getopt-command
三、使用getopts解析参数
getopts比getopt弱一些简单一些:不能在命令行中单独使用、不支持长选项格式、不支持选项值可选。更多说明见注释。
#!/bin/bash
usage(){
echo "
Usage:
-i, --ip target server ip
-p, --port target service port
-h, --help display this help and exit
example1: ./testGetopts.sh -i192.168.1. -p80
example2: ./testGetopts.sh -i 192.168.1.1 -p
"
# getopts只能在shell脚本中使用,不能像getopt一样在命令行中单独使用
# getopts只支持短格式不支持长格式
# getopts如果设定有选项值的选项,如果没提供选项值那么会直接报错
# getopts选项要么有选项值要么没有选项值,没有可有也可以没有
# getopts选项后可紧接选项值,也可以使用空格隔开;为与getopt统一建议使用紧接格式
}
main(){
# 选项有:表示该选项需要选项值
while getopts "i:p:h" arg
do
case $arg in
i)
#参数存在$OPTARG中
ip="$OPTARG"
echo "ip: $ip"
;;
p)
port="$OPTARG"
echo "port: $port"
;;
h)
usage
# 打印usage之后直接用exit退出程序
exit
;;
?)
#当有不认识的选项的时候arg值为?
echo "unregistered argument"
exit
;;
esac
done
}
main $@
执行效果:

参考:
https://www.cnblogs.com/FrankTan/archive/2010/03/01/1634516.html
Linux getopt/getopts解析命令行参数教程的更多相关文章
- linux 中解析命令行参数(getopt_long用法)
linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...
- Windows下解析命令行参数
linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...
- boost之program_options库,解析命令行参数、读取配置文件
一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...
- python解析命令行参数
常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...
- C语言中使用库函数解析命令行参数
在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序. C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt.getopt_long. ...
- optparse模块解析命令行参数的说明及优化
一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...
- Shell 参数(2) --解析命令行参数工具:getopts/getopt
getopt 与 getopts 都是 Bash 中用来获取与分析命令行参数的工具,常用在 Shell 脚本中被用来分析脚本参数. 两者的比较 (1)getopts 是 Shell 内建命令,geto ...
- getopt、getopt_long和getopt_long_only解析命令行参数
一:posix约定: 下面是POSIX标准中关于程序名.参数的约定: 程序名不宜少于2个字符且不多于9个字符: 程序名应只包含小写字母和阿拉伯数字: 选项名应该是单字符或单数字,且以短横 '-' 为前 ...
- getopt_long函数解析命令行参数
转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用 ...
随机推荐
- svn与cvs的一些比较
所有的文档都显示SVN可以取代CVS,同时SVN的问题和缺点都被隐藏了.不幸的是,我们并不认为SVN是CVS的替代品,尽管很多缺陷都被修改了.更有甚者,它甚至让人重回VSS.CVS和SVN的比较类似与 ...
- JZ2440学习笔记之内存设备
通过OM[1:0]选择启动的设备: OM[1:0]=00,地址0对应的是Internal 4K RAM,且Nand的前4K会被复制到这里,得到执行: OM[1:0]=01,地址0对应的是Nor Fla ...
- HTTP简单解析
一.简介 HTTP是一种基于TCP/IP的超文本传输协议,用于从WWW服务器传输超文本到本地浏览器. HTTP是一种基于客户端/服务器(C/S架构)的无状态.无连接.媒体独立的传输协议. HTTP是一 ...
- 微信小程序http连接访问解决方案
HTTP + 加密 + 认证 + 完整性保护 = HTTPS,小程序考虑到信息安全的问题,选用了更为稳定安全的https 来进行信息传递. HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全 ...
- 前端学习之HTML
HTML介绍 Web服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen(5 ...
- 通过nginx反向代理接收应用宝回调
年前的时候,正好公司把用来接收应用宝回调的服务从Windows服务器上迁移带Linux服务器上,没想到最后折腾了两个工作日,腾讯的文档真的无力吐槽,不知道以后会不会有人碰到我相同的问题,我先记录一下. ...
- 【GO】【LiteIDE】
https://blog.csdn.net/qq_32034593/article/details/82986311 下载地址:https://www.golangtc.com/download/li ...
- python识别图片
import requestsfrom aip import AipOcr image = requests.get('https://static.pandateacher.com/7b5d6d8d ...
- JAVA-重载(overload)和重写(overrite)
1.重载发生在同一个类中.有多个方法名相同,但是参数列表不同(包括参数个数和参数类型),和返回值无关,权限修饰符也无关. 2.重写(即覆盖)发生在子类和父类中.子类和父类的方法名.参数列表相同:子类的 ...
- 手动调用dubbo接口
1. 打开命令窗口,telnet IP地址 dubbo端口号 telnet 127.0.0.1 28001 2. 找到service ls 列出所有服务 dubbo>cd com.faaaaa. ...