一、说明

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解析命令行参数教程的更多相关文章

  1. linux 中解析命令行参数(getopt_long用法)

    linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...

  2. Windows下解析命令行参数

    linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...

  3. boost之program_options库,解析命令行参数、读取配置文件

    一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...

  4. python解析命令行参数

    常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...

  5. C语言中使用库函数解析命令行参数

    在编写需要命令行参数的C程序的时候,往往我们需要先解析命令行参数,然后根据这些参数来启动我们的程序. C的库函数中提供了两个函数可以用来帮助我们解析命令行参数:getopt.getopt_long. ...

  6. optparse模块解析命令行参数的说明及优化

    一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...

  7. Shell 参数(2) --解析命令行参数工具:getopts/getopt

    getopt 与 getopts 都是 Bash 中用来获取与分析命令行参数的工具,常用在 Shell 脚本中被用来分析脚本参数. 两者的比较 (1)getopts 是 Shell 内建命令,geto ...

  8. getopt、getopt_long和getopt_long_only解析命令行参数

    一:posix约定: 下面是POSIX标准中关于程序名.参数的约定: 程序名不宜少于2个字符且不多于9个字符: 程序名应只包含小写字母和阿拉伯数字: 选项名应该是单字符或单数字,且以短横 '-' 为前 ...

  9. getopt_long函数解析命令行参数

    转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用 ...

随机推荐

  1. restful 跨域

    同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能. 就浏览器而言的, http://127.0.0.1:8000  协议 域名 端口 跨域 问题// 简单 ...

  2. java第三次上机

    import java.util.*; class student{ String name; char sex; int age; String number; double score[]=new ...

  3. 最短路径 SPFA P3371 【模板】单源最短路径(弱化版)

    P3371 [模板]单源最短路径(弱化版) SPFA算法: SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复 ...

  4. Win7 指定以某个用户运行某个程式

    登陆的是用户A,想要以用户B执行某个程式,可以在cmd命令符下执行以下语句 runas /user:Domain\UserB  /savecred notepad.exe 说明:/user:的后面即为 ...

  5. TeamCity 创建docker构建步骤

    1 dockerfile source 选择dockerfile文件的路径,一共有三种方式: 1.1.1 file content 这种方式是在线写dockerfile文件. 其在进行创建的时候会在 ...

  6. centos6.9 PHP的编译安装并连接nginx

    1.安装yum -y install libxml2-devel openssl-devel bzip2-devel libmcrypt-devel 解决php包的依赖关系,可能libmcrypt会报 ...

  7. php 把数组保存为标准的数组格式,存储到文件中

    <?php $file='./test.php'; $array=array('color'=> array('blue','red','green'),'size'=> array ...

  8. P2774 方格取数问题(网络流)

    P2774 方格取数问题 emm........仔细一看,这不是最大权闭合子图的题吗! 取一个点$(x,y)$,限制条件是同时取$(x,y+1),(x,y-1),(x+1,y),(x-1,y)$,只不 ...

  9. Java 键盘输入数字(空格隔开) 将数字存入数组

    Scanner sc = new Scanner(System.in); String inputString = sc.nextLine(); String stringArray[] = inpu ...

  10. Java笔试

    异常 Throwable是Java错误处理的父类,有两个子类:Error和Exception. Error:无法预期的严重错误,导致JVM虚拟机无法继续执行,几乎无法恢复捕捉的 Exception:可 ...