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个左移(丢弃)

特点

  1. Shell 内建命令

  2. getopts不支持长选项。如 --help

  3. 输入选项参数的格式必须是 -o arg 参数紧跟选项,中间有空格

  4. 处理完一个选项后,OPTIND会自动指向下一个选项。

  5. 不会重排所有参数的顺序

  6. 带参数的选项要放在不带参数的选项(开关选项)之前,或者开关选项后面不能带参数

    # 可以识别 -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 ...
  7. 遇到非-开头的参数或选项结束标记--,则终止

    # -- 选项结束
    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
  8. 遇到非法选项,则后面的选项参数都无法获取

    # -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 ...
  9. 如果缺少参数

    # 会把后面的 -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
  10. 如果选项和参数之间没有空格

    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 的理解的更多相关文章

  1. [记录]Shell中的getopts和getopt用法

    Shell中的getopts和getopt用法 1.getopts getopts(shell内置命令)不能直接处理长的选项(如:--prefix=/home等),getopts有两个参数,第一个参数 ...

  2. getopts的使用

    getopts的使用 语法格式:getopts [option[:]] [DESCPRITION] VARIABLE option:表示为某个脚本可以使用的选项 ":":如果某个选 ...

  3. 深入理解计算机系统项目之 Shell Lab

    博客中的文章均为meelo原创,请务必以链接形式注明本文地址 Shell Lab是CMU计算机系统入门课程的一个实验.在这个实验里你需要实现一个shell,shell是用户与计算机的交互界面.普通意义 ...

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

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

  5. shell 命令行参数(getopt和getopts)

    getopt 命令 使用getopt命令,可以解析任何命令行选项和参数,但是用法比较复杂.getopt的命令用法如下: $ getopt --help 用法: getopt optstring par ...

  6. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  7. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  8. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  9. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

随机推荐

  1. ELK收集日志到mysql数据库

    场景需求 在使用ELK对日志进行收集的时候,如果需要对数据进行存档,可以考虑使用数据库的方式.为了便于查询,可以同时写一份数据到Elasticsearch 中. 环境准备 CentOS7系统: 192 ...

  2. 什么是动态规划?动态规划的意义是什么?https://www.zhihu.com/question/23995189

    阮行止 上海洛谷网络科技有限公司 讲师 intro 很有意思的问题.以往见过许多教材,对动态规划(DP)的引入属于"奉天承运,皇帝诏曰"式:不给出一点引入,见面即拿出一大堆公式吓人 ...

  3. Element upload组件上传图片与回显图片

    场景:新增商品时需要添加商品主图,新增成功之后可编辑 上传图片: <el-form-item label="专区logo:" style="height:160px ...

  4. 初识CoAP协议

    前言 本文介绍什么是CoAP,以及如何在物联网设备上使用它.CoAP是一种物联网协议,具有一些专门为受约束的设备而设计的有趣功能.还有其他一些可用于构建物联网解决方案的IoT协议,例如MQTT等. 物 ...

  5. P2308 添加括号(dfs记录dp路径)

    传送门 \(一看肯定是区间DP(因为和和合并石子很相似,都要加n-1次)\) \(转移方程为(其中he[i][j]是i到j的和)\) \[dp[i][j]=min(dp[i][j],dp[i][k]+ ...

  6. P1635 跳跃

    传送门 观察到\(4x+3=2(2x+1)+1\)以及\(8x+7=2(2(2x+1)+1)+1\) 所以可以把\(xx->2x+12x+1\)当成一个基本变化 则\(xx->4x+3\) ...

  7. POJ3734(矩阵快速幂)

    \(假设现在到第i个积木\) \(红绿恰都是偶数a种方案,恰都是奇数为b种方案,一奇一偶为c种方案\) \(由此考虑i+1个积木的情况\) Ⅰ.一奇一偶的方案 \(如果第i层恰是奇数的情况,那么本次只 ...

  8. 【Scala】代码实现Scala的各种模式匹配操作

    文章目录 内容匹配 类型匹配 s表达式 case class 样例类 偏函数 内容匹配 import scala.util.Random object TestMatch { def main(arg ...

  9. 用PHP获取网页上的信息相对于xpath效率低点

    用php实现对网页的抓取,及信息的收集,其实就是爬数据,具体实现步骤如下,首先应引入两个文件curl_html_get.php和save_file.php文件,两个文件具体代码是这样的curl_htm ...

  10. python读取excel所有数据(cmd界面)

    python读取excel所有数据(cmd界面) cmd界面显示excel数据 代码 import xlrd import os from prettytable import PrettyTable ...