对 getopts 的理解
getopts
格式
1 #!/bin/bash
2 echo "begin index is $OPTIND"
3 echo "begin ARG is $OPTARG"
4
5 while getopts ":ab:c:" OPT
6 do
7 case $OPT in
8 a)
9 echo "\$OPTIND=$OPTIND, a is $OPTARG, \$1=$1, \$OPTIND=$OPTIND";;
10 b)
11 echo "\$OPTIND=$OPTIND, b is $OPTARG, \$2=$2, \$OPTIND=$OPTIND";;
12 c)
13 echo "\$OPTIND=$OPTIND, c is $OPTARG, \$3=$3, \$OPTIND=$OPTIND";;
14 :)
15 echo "\$OPTIND=$OPTIND, : is $OPTARG, \$#=$@, \$OPTIND=$OPTIND";;
14 ?)
15 echo "\$OPTIND=$OPTIND" # OPTIND 已经指向下一个参数
16 shift $(($OPTIND-2)) # -2 才可以让当前参数位于 $1
17 echo "剩余参数列表:$@"
18 echo -e "Illegal option -- '$1' \nUsage: `basename $0` [-a] [-b value] [-c value] args"
19 exit 2 ;;
20 esac
21 done
22 echo "end index is $OPTIND"
lfp@legion:~$ ./bin/getopts.sh -b bb -c cc -d 22 -a
begin index is 1 # 初始值为1
begin ARG is # 没有初始值
$OPTIND=3, b is bb, $2=bb, $OPTIND=3
$OPTIND=5, c is cc, $3=-c, $OPTIND=5
$OPTIND=6
剩余参数列表:-d 22 -a
Illegal option -- '-d'
Usage: getopts.sh [-a] [-b value] [-c value] args
区别 选项列表 参数列表
选项列表
命令可以接收的选项
参数列表
命令行中,除命令之外的字符组成参数列表。
./bin/getopts.sh -b bb -c cc -d 22 -a
参数列表为 -b bb -c cc -d 22 -a,对应的位置从1开始计算
选项的位置 -b(1),-c(3) 。因为-b带参数,所以OPTIND需要加2才能指向下一个选项,
由此可知,不带参数的选项,OPTIND只需要加1即可
getopts 从命令行前面开始处理。参数列表中包括选项和参数,选项通过
-来区分,其他被视作选项的参数标准格式 while getopts "选项列表" OPT
选项列表字符串
- 前面加冒号
:则表示当遇到选项列表之外的选项时,不会有警告信息(静默模式)- 一个字母代表一个选项
- 选项后面跟冒号
b:表示该选项b,需要指定参数- 选项后面没有冒号
ab:表示该选项a,不需要指定参数,也称作开关选项OPT
代表输入的参数
如果出现了选项列表之外的选项,OPT 会被设置为
?如果缺少参数,分两种情况
如果选项列表前面加冒号(静默模式),则OPT被设置为
:(如果此时没有:匹配,则会匹配到?)如果没加,则OPT被置为
?case
- 最后一个选择——?,表示如果出现了选项列表之外的选项,进行的操作
getopts 提供的两个常量
OPTARG
表示当前选项的参数
OPTIND
表示下一个选项在【参数列表】中的位置,参数列表的初始值为1(即从$1开始)
处理带参数的选项,值加2;处理不带参数的选项或非法选项,值加1
在case匹配开始的时候就已经增加,指向了下一个选项的位置
shift $(($OPTIND-2)) 让当前选项(正在处理的选项)处于 $1 位置
shift $(($OPTIND-1)) 让下一个选项(未处理的选项)处于 $1 位置
shift
用来左移【参数列表】,shift 2 表示将参数列表中前2个左移(丢弃)
特点
Shell 内建命令
getopts不支持长选项。如 --help
输入选项参数的格式必须是
-o arg参数紧跟选项,中间有空格处理完一个选项后,OPTIND会自动指向下一个选项。
不会重排所有参数的顺序
带参数的选项要放在不带参数的选项(开关选项)之前,或者开关选项后面不能带参数
# 可以识别 -a 只是没有参数
lfp@legion:~$ ./bin/getopts.sh -a -b bb -c cc -d
begin index is 1
begin ARG is
$OPTIND=2, a is , $1=-a, $OPTIND=2
$OPTIND=4, b is bb, $2=-b, $OPTIND=4
$OPTIND=6, c is cc, $3=bb, $OPTIND=6
$OPTIND=7
剩余参数列表:-d
Illegal option -- '-d', Usage: getopts.sh [-a] [-b arg] [-c arg] file ...
遇到非
-开头的参数或选项结束标记--,则终止# -- 选项结束
lfp@legion:~$ ./bin/getopts.sh -b bb -c cc -- -d -a
begin index is 1
begin ARG is
$OPTIND=3, b is bb, $2=bb, $OPTIND=3
$OPTIND=5, c is cc, $3=-c, $OPTIND=5
end index is 6 # 非 - 开头的参数
# 选项a不带参数,aa被识别为非-开头的参数
lfp@legion:~$ ./bin/getopts.sh -a aa -b bb -c cc -d
begin index is 1
begin ARG is
$OPTIND=2, a is , $1=-a, $OPTIND=2
end index is 2
遇到非法选项,则后面的选项参数都无法获取
# -d 非法选项
lfp@legion:~$ ./bin/getopts.sh -b bb -d -c cc -a
begin index is 1
begin ARG is
$OPTIND=3, b is bb, $2=bb, $OPTIND=3
./bin/getopts.sh: 非法选项 -- d # 可以通过在选项列表字符串前面加冒号来取消
$OPTIND=4
剩余参数列表:-d -c cc -a
Illegal option -- '-d', Usage: getopts.sh [-a] [-b arg] [-c arg] file ...
如果缺少参数
# 会把后面的 -c 选项当做参数,然后遇到 -c 选项的参数(非-开头的选项,终止)
lfp@legion:~$ ./bin/getopts.sh -b -c cc -a
begin index is 1
begin ARG is
$OPTIND=3, b is -c, $2=-c, $OPTIND=3
end index is 3
如果选项和参数之间没有空格
lfp@legion:~$ ./bin/getopts.sh -bbb -c cc -a
begin index is 1
begin ARG is
# 可以拿到选项的值,但是 OPTIND 只加1,按无参数选项处理的
$OPTIND=2, b is bb, $2=-c, $OPTIND=2
$OPTIND=4, c is cc, $3=cc, $OPTIND=4
$OPTIND=5, a is , $1=-bbb, $OPTIND=5
end index is 5
对 getopts 的理解的更多相关文章
- [记录]Shell中的getopts和getopt用法
Shell中的getopts和getopt用法 1.getopts getopts(shell内置命令)不能直接处理长的选项(如:--prefix=/home等),getopts有两个参数,第一个参数 ...
- getopts的使用
getopts的使用 语法格式:getopts [option[:]] [DESCPRITION] VARIABLE option:表示为某个脚本可以使用的选项 ":":如果某个选 ...
- 深入理解计算机系统项目之 Shell Lab
博客中的文章均为meelo原创,请务必以链接形式注明本文地址 Shell Lab是CMU计算机系统入门课程的一个实验.在这个实验里你需要实现一个shell,shell是用户与计算机的交互界面.普通意义 ...
- Shell 参数(2) --解析命令行参数工具:getopts/getopt
getopt 与 getopts 都是 Bash 中用来获取与分析命令行参数的工具,常用在 Shell 脚本中被用来分析脚本参数. 两者的比较 (1)getopts 是 Shell 内建命令,geto ...
- shell 命令行参数(getopt和getopts)
getopt 命令 使用getopt命令,可以解析任何命令行选项和参数,但是用法比较复杂.getopt的命令用法如下: $ getopt --help 用法: getopt optstring par ...
- 理解CSS视觉格式化
前面的话 CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...
- 彻底理解AC多模式匹配算法
(本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...
- 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信
接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
随机推荐
- 虚拟化学习笔记-KVM虚拟化跨机迁移原理
参考:https://zhuanlan.zhihu.com/p/27055555 在线迁移过程划分为三个阶段:准备阶段.迁移阶段和切换阶段.迁移环境为虚拟化底层KVM+Qemu.虚拟化管理Libvir ...
- c/c++头文件的摘抄
C/C++常用头文件 以及简单应用介绍 C/C++头文件一览 C #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 # ...
- python selenium(环境搭建)
一:自动化了解知识 工具安装 什么样的项目适合做自动化? 自动化测试一般在什么阶段开始实施? 你们公司自动化的脚本谁来维护?如何维护? 自动化用例覆盖率是多少? 自动化的原理 通过 webdriver ...
- 最新Idea超实用告别996插件,都是免费
Idea告别996插件 在IntelliJ IDEA中,秉着IDEA自带能实现的快捷方式就不用插件的原则,少用些插件,运行性能也提升一些,虽然很少,哈哈.分享下我个人常用的插件,希望对大家有些帮助.插 ...
- 使用Java实现简单的斗地主案例
使用Java实现简单的斗地主案例 案例说明:使用Java实现简单的斗地主洗牌发牌的操作: 具体规则: 共有54张牌,顺序打乱: 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后留三张为底牌(地主牌) ...
- Day_09【常用API】扩展案例1_程序中使用一个长度为3的对象数组,存储用户的登录名和密码……
需求说明:实现用户注册.登陆功能: 1.程序中使用一个长度为3的**对象数组**,存储用户的登录名和密码: 例如如下格式: 登录名 密码 生日 爱好 zhangsan 1111 1998-03-15 ...
- 海外网站如何通过代理IP进行采集?
海外网站如何通过代理IP进行采集? 我们在做爬虫的时候,经常会遇到这种情况,爬虫最初运行的时候,数据是可以正常获取的,一切看起来都那么的美好,然而,不一会儿,就可能会出现403 Forbidden , ...
- Python求差集
本月月初在职员工表(20来列,身份证.银行卡号等),本月离职员工表(10来列,计时.计件等),不考虑本月入职员工表,求下月月初在职员工表. Python,import pandas as pd,两个p ...
- Spring IOC使用详解
SpringIOC使用详解 一.IOC简介 IOC(Inversion of Control):控制反转,即对象创建的问题.通俗地讲就是把创建对象的代码交给了Spring的配置文件来进行的.这样做的优 ...
- HMM-前向后向算法(附代码)
目录 基本要素 HMM三大问题 概率计算问题 前向算法 后向算法 前向-后向算法 基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,.. ...