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 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用 ...
随机推荐
- 大数据开发认知--spark
1. Spark rdd生成过程· Spark的任务调度分为四步 1RDD objects RDD的准备阶段,组织RDD及RDD的依赖关系生成大概的RDD的DAG图,DAG图是有向环图. 2DAG s ...
- 王之泰201771010131《面向对象程序设计(java)》第十四周学习总结
第一部分:理论知识学习部分 第12章 Swing用户界面组件 12.1.Swing和MVC设计模式 a 设计模式初识b 模型—视图—控制器模式c Swing组件的模型—视图—控制器分析 12.2布局管 ...
- IDEA ----Apachemaven连接私服,mavenWed工程 、以及Tomcat配置和项目的部署
1.Apachemaven连接私服, 首相先下载Apachemaven文件(压缩包和解压后的) 打开maven下的conf文件下的settin.xml, 配置setting.xml文件 其他信息随便写 ...
- 忽略 iconv 转码错误导致输出中断
在遇到一些特殊字符时候,使用iconv转码会提示报错,导致整段文字输出为空,解决的方法是增加TRANSLIT//IGNORE $str = iconv("UTF-8", " ...
- spring cloud 初体验
spring cloud分为注册端.客户端以及消费端 初体验的理解就是: 注册端就是将之前所有的应用在这边进行注册,然后给每个应用都生成自己的标识,这些应用就是来自于客户端,消费端则通过调用注册端(有 ...
- mysql自增长主键,删除数据后,将主键顺序重新排序
用数据库的时候,难免会删除数据,会发现设置的主键增长不是按照正常顺序排列,中间有断隔比如这样. 以我这个情况举例 处理方法的原理:删除原有的自增ID,重新建立新的自增ID. ALTER TABLE ` ...
- Git复习步骤
1.首先肯定是安装与配置了 首先要下载Git,然后设置用户名/邮箱 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c ...
- 使用vue+iview实现上传文件及常用的下载文件的方法
首先说明一下,我们这次主要用的还是iview的upload上传组件,下面直接上代码 <Upload ref="upload" multiple='true' //是否支持多文 ...
- python基础之虚拟环境--常用指令
虚拟环境的介绍和应用就不在这里赘述了,做个快捷的记录 这是官方给出来的解释了https://docs.python.org/zh-cn/3.7/tutorial/venv.html 还看到有的人,还安 ...
- Go语言学习之15 商品秒杀开发与接入层实现
outline 1. 秒杀抢购接入层实现2. 秒杀逻辑层实现 秒杀接入层核心功能 秒杀逻辑层核心功能 SecKill接口 /seckill?product=20&source=android& ...