shell脚本中getopts的使用

2023-10-27

      在shell中,getopts用于解析命令选项和参数。getopts是Bash shell的内置命令,不支持长选项,仅解析短选项,即一个破折号("-")和一个字母或数字,如-1,-e, -E等。
      getopts格式如下:

getopts OptString Name [Arg ...]

      1.getopts命令后面的字符串如":a:c:Fg:"就是可以使用的选项列表即OptString,每个字符代表一个选项,后面带冒号(:)的意味着选项除了定义本身之外,还会带上一个参数作为选项的值。
      2.每次调用getopts命令时,它都会查找OptString中定义的一个选项。如果找到,它会将此选项字符放入名为Name的变量中。如果选项与OptString中定义的选项不匹配,则getopts将变量Name设置为问号("?").如果该选项需要一个参数,getopts会获取该参数,并将其存放于$OPTARG中。如果未找到所需的参数,则变量Name将设置为冒号
      3.两个预先定义的变量:
      (1).OPTARG:用来获取当前选项的参数值;
      (2).OPTIND:代表当前选项在选项列表中的索引位置;当shell脚本启动时,OPTIND的值为1;处理一个开关型选项,OPTIND加1;处理一个带参数的选项,OPTIND会加2。
      4.如果OptString中第一个字符是冒号,getopts使用静默错误报告(getopts uses silent error reporting),在此模式下,不会打印任何错误消息;如果第一个字符不是冒号,如果命令行中包含了没有在getopts列表中的选项,会有警告信息,类似illegal option -- x;
      5.字符后面带冒号(:),表示该选项应该有一个参数,在命令行中用空格与其分开(或紧挨着)若字符后面没有冒号,表示不需要参数
      6.getopts处理父命令(parent command)的位置参数,在bash中,它存储在shell变量"$@"中。
      7.两个破折号("--")的特殊选项被getopts解释为选项的结尾
      8.getopts设计为在脚本中多次运行,例如循环运行。它每次循环迭代处理一个选项。当没有更多选项需要处理时,getopts返回false,这会自动终止while循环。因此,getopts经常和while一起使用。

      测试代码如下:

#! /bin/bash

author=""
addr_csdn=""
addr_github=""

echo "all parameters: $@"

OptString=":a:c:Fg:"
while getopts ${OptString} name; do
#while getopts "a:c:Fg:" name; do
    case "$name" in
        "a")
            echo "option: $name, value is: $OPTARG, index is: $OPTIND"
            author=$OPTARG ;;
        "c")
            echo "option: $name, value is: $OPTARG, index is: $OPTIND"
            addr_csdn=$OPTARG ;;
        "g")
            echo "option: $name, value is: $OPTARG, index is: $OPTIND"
            addr_github=$OPTARG ;;
        "F")
            echo "option: $name, shell script name: $0, index is: $OPTIND" ;;
        ":")
            echo "Error: missing parameter value: ${OptString}, index is: $OPTIND"
            exit 1 ;;
        "?")
            echo "Error: unknown option: ${OptString}, index is: $OPTIND"
            exit 1 ;;
        "*") # exit abnormally
            echo "** abort **"
            exit 1 ;;
    esac
done

if [ ! -z ${author} ]; then
    echo "author: ${author}"
fi

if [ ! -z ${addr_csdn} ]; then
    echo "csdn addr: ${addr_csdn}"
fi

if [ ! -z ${addr_github} ]; then
    echo "github addr: ${addr_github}"
fi

echo "processed parameters OPTIND: $OPTIND"

echo "remove processed parameters"
# shift is a bash built-in which kind of removes arguments from the beginning of the argument list
shift $((OPTIND-1))

echo "remaining parameters: $@"
echo "test finish"

      在windows和linux上执行结果相同,如下:

      GitHubhttps://github.com/fengbingchun/Linux_Code_Test

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell脚本中getopts的使用 的相关文章

随机推荐

  • 求解1+2+3+...+n,要求不能使用乘除法、while、for、if 、else、switch、case等关键字

    方法一 利用递归以及 的短路原理 int Sum int num int sum num Sum num 1 sum 递归跳出条件 当num为假时 无需判断后序语句 返回sum n return sum num int main int n
  • c#----类和对象

    1 1 类和对象 类 class 是最基础的c 类型 类是一个数据结构 将状态 字段 和操作 方法和其它函数成员 组合在一个单元中 类为动态创建的类实例 instance 提供了定义 实例也称对象 object 类支持继承 inherita
  • mybatis的关联查询(一对一和一对多的实现)

    1 一对一的关联查询 1 1 准备查询的sql语句 用户与订单 关联查询 select o id o name o address u name u address from orders o left join user u on o u
  • Prometheus的函数和计算公式

    Prometheus强大的地方就在于可以它可以使用的很多计算公式去获取自己需要的数据 这里所涉及到的计算公式 也是我们普遍认为的难点所在 在Zabbix中想要获取CPU使用率是一件非常简单的事情 但是在Prometheus中却需要通过计算公
  • 如何理解算法时间复杂度的表示法O(n²)、O(n)、O(1)、O(nlogn)等?

    时间复杂度这个东西 其实更准确点说应该是描述一个算法在问题规模不断增大时对应的时间增长曲线 所以 这些增长数量级并不是一个准确的性能评价 可以理解为一个近似值 时间的增长近似于logN NlogN的曲线 先从O 1 来说 理论上哈希表就是O
  • ElementPlus主题色修改

    一般情况下我们使用elementplus的时候 肯定需要更改他的主题颜色 我们系统中的主题颜色大多数的时候适合他的主题颜色不一样的 那么如何更改呢 我是在assets styles element index scss下 forward e
  • linux系统关于 unrecognized service

    能ping 通服务器 但远程无法连接 我怀疑远程服务没开启 就输入了 service sshd start命令 结果显示 ssh unrecognized service 我输入查看命令 service ssh status 显示也是 un
  • springboot和vue项目如何上传图片,结合若依框架实现

    一 后台代码 RequestMapping value upload method RequestMethod POST headers content type multipart form data ApiOperation value
  • 【开发工具】iOS真机调试抓包工具Charles安装及使用

    支持原创 更多内容请关注 http www china10s com blog p 271 iOS开发过程中 经常需要用真机来测试和后台的网络数据传输 需要一个趁手的抓包工具 在Windows下用的fidder很好用 但是由于它是在 Net
  • 软连接的建立和删除

    想把A文件夹放在B文件夹下面 ln s A B 想取消软连接 rm rf B A 千万不要写成 rm rf B A 这样会删除A里面的数据
  • [2020.5.30]gdb常用总结

    前提 使用的是带debug信息的动态库 1 info 1 types 查看该类型符号是否存在 若存在显示该类型符号相关信息 info types SDL WindowData info types ucontext t 2 function
  • CSS中关于字体样式p标签的属性

    CSS中关于P标签中的样式 1 font family 浏览器在显示字体的时候 依次判断是否支持当前的字体 直到最后的字体系列 font family 宋体 仿宋 sans serif 浏览器若不支持宋体 则用仿宋 若不支持仿宋 则在san
  • Kafka3.0.0版本——消费者(消费者组详细消费流程图解及消费者重要参数)

    目录 一 消费者组详细消费流程图解 二 消费者的重要参数 一 消费者组详细消费流程图解 创建一个消费者网络连接客户端 主要用于与kafka集群进行交互 如下图所示 调用sendFetches发送消费请求 如下图所示 1 Fetch min
  • [C++]宏定义字节对齐#PragmaPack/Pop

    Pragma Pack n 指定对齐的字节数 pragma pop pop 恢复对齐状态 默认4字节对齐 目录 什么是对齐 对齐规则 功能 应用 什么是对齐 现代计算机中内存空间都是按照byte划分的 从理论上讲似乎对任何类型的变量的访问可
  • RFID智能仓储管理系统,更加智能化的仓储管理,你选择对了吗-新导智能

    不同的企业规模 产品类别 有着不同的仓储办理流程和需求 但核心的部分 都还在于进出库在内的库房作业和移库 盘库在内的库存操控作业 而跟着整个出产制作环境的改变 产品周期越来越短 多样少数的出产办法开始兴起 来自商场端的需求对仓储办理提出了更
  • MySQL 中的数据类型介绍

    据我统计 MySQL支持39种 按可使用的类型字段统计 即同义词也作多个 数据类型 下面的介绍可能在非常古老的mysql版本中不适用 转载请注明出处 http blog csdn net anxpp article details 5128
  • CSS样式--被忽略的前端基础(一)

    CSS样式 被忽略的前端基础 一 前言 以前学后端觉得前端不屑一顾 easy 后来从事前端开发后觉得其实并不简单 尤其是在css这一块 总觉得简单 没怎么系统的学习 现在觉得语言只是一种处理和解决问题工具 而你对基础掌握的深度影响着你解决问
  • H5选择本地文件夹下图片上传到服务器,并在网页中显示

    文章目录 基本 变种 html5 缺点 还要选择 基本
  • 面对“失业焦虑”我们可以做些什么?

    前言 在回答这个问题之前 我想先稍微聊一下我国当下的就业形势 当下的就业形势 近几年的就业形势非常严峻 除了疫情方面的影响 我认为更重要的是下行的经济环境带来的坏处 这二者相互叠加 给社会造就了如今这么复杂的就业现状 一 毕业生人数与就业岗
  • shell脚本中getopts的使用

    在shell中 getopts用于解析命令选项和参数 getopts是Bash shell的内置命令 不支持长选项 仅解析短选项 即一个破折号 和一个字母或数字 如 1 e E等 getopts格式如下 getopts OptString