Linux shell命令行可选参数的getopts命令使用例子

2023-11-10

Linux shell命令行可选参数的getopts命令使用例子

一、概述

getopts [option[:]] [DESCPRITION] VARIABLE
option:表示为某个脚本可以使用的选项
":" 冒号如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)
VARIABLE:表示将某个选项保存在变量VARIABLE中

getopts是linux系统中的一个内置变量,一般用在循环中。每当执行循环时,getopts都会检查下一个命令选项,如果这些选项出现
在option中,则表示是合法选项,否则不是合法选项。并将这些合法选项保存在VARIABLE这个变量中。
getopts还包含两个内置变量,及OPTARG和OPTIND
OPTARG 就是将选项后面的参数(或者描述信息DESCPRITION)保存在此变量当中。
OPTIND 这个表示命令行的下一个选项或参数的索引(文件名不算选项或参数)

while getopts ":a:bc:" opt
第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数。
$OPTARG 存储相应选项的参数,如下例中的11、5;
$OPTIND 总是存储原始$*中下一个要处理的选项(不是参数,而是选项,此处指的是a,b,c这三个选项,而不是那些数字,当然数字
也是会占有位置的)位置。
optind初值为1,遇到"x",选项不带参数,optind+=1;遇到"x:",带参数的选项,optarg=argv[optind+1],optind+=2;

二、shell的getopts命令举例

$ vim getopts.sh

#!/bin/bash
echo $*
a_value='-1'
b_value='-1'
c_value='-1'
para_num=$#
usage() {
    echo -e "Usage:\n  $0 -a 'username' [-b '0.2'] [-c 0]" 1>&2
    exit 1
}
if [[ ${para_num} -lt 1 ]]; then
    echo "参数个数不够,请按照如下格式传入参数"
    usage
    exit 1
fi
while getopts ":a:b:c:" opt
do
    case $opt in
        a)
        a_value=$OPTARG
        echo "a_value: ${a_value}"
        echo $OPTARG $OPTIND;;
        b)
        b_value=$OPTARG
        echo "b_value: ${b_value}"
        echo "b $OPTIND";;
        c)
        c_value=$OPTARG
        echo "c_value: ${c_value}"
        echo "c $OPTIND";;
        ?)
        error_value=$OPTARG
        echo "error_value: ${error_value}"
        usage;;
    esac
done
echo "***********"
echo "a_value: ${a_value}"
echo "b_value: ${b_value}"
echo "c_value: ${c_value}"

1、执行:$ bash ./getopts.sh -a a11 -b b55  -c cc66
结果:

-a a11 -b b55 -c cc66
a_value: a11
a11 3
b_value: b55
b 5
c_value: cc66
c 7
***********
a_value: a11
b_value: b55
c_value: cc66

解释:
第一行输出echo $*
第三行,optind初值为1,选项-a的参数为a11,下一个要处理的选项-b位置为3(即OPTIND=3),所以输出:a11 3;
第五行,然后-b要处理的下一个选项-c位置为5,所以输出:b 5;
第七行,再者-c有参数,所以下一个要处理的位置+2(即为7,照着所有参数也数的出来下一个参数即为7,因为如果有下一个参数那么一定是在参数值5之后的),所以输出:c 7;
其中,第二行、第四行、第六行是具体参数的值
注:选项参数的格式必须是 -d val,而不能是中间没有空格的-dval  【如-d 10 不能是-d10】
    getopts是对脚本参数的校验

2、执行:$ bash ./getopts.sh  -a a11 -b b55 

结果为:

 -a a11 -b b55
a_value: a11
a11 3
b_value: b55
b 5
***********
a_value: a11
b_value: b55
c_value: -1

3、执行:$ bash ./getopts.sh -a a11 

-a a11
a_value: a11
a11 3
***********
a_value: a11
b_value: -1
c_value: -1

4、执行:$ bash ./getopts.sh

参数个数不够,请按照如下格式传入参数
Usage:
  ./getopts.sh -a 'username' [-b '0.2'] [-c 0]

5、执行:$ bash ./getopts.sh -a a11 -b b55  -c cc66 -dvv

-a a11 -b b55 -c cc66 -dvv
a_value: a11
a11 3
b_value: b55
b 5
c_value: cc66
c 7
error_value: d
Usage:
  ./getopts.sh -a 'username' [-b '0.2'] [-c 0]

6、执行:$ bash ./getopts.sh -a a11 -dvv -b b55

-a a11 -dvv -b b55
a_value: a11
a11 3
error_value: d
Usage:
  ./getopts.sh -a 'username' [-b '0.2'] [-c 0]

参考: https://www.jianshu.com/p/baf6e5b7e70a

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

Linux shell命令行可选参数的getopts命令使用例子 的相关文章

  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 如何根据 HTTP 请求使用 Python 和 Flask 执行 shell 命令并流输出?

    下列的这个帖子 https stackoverflow com questions 15092961 how to continuously display python output in a webpage 我能够tail f网页的日志
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp

随机推荐

  • 05-思维导图Xmind快速入门

    文章目录 5 1 认识思维导图 5 2 Xmind的主要结构及主题元素 5 2 1 Xmind的多种结构 5 2 2 主题分类 5 2 3 Xmind的主题元素 章节总结 5 1 认识思维导图 什么是思维导图 思维导图是一种将思维进行可视化
  • Blender2.92下载安装教程

    Blender2 92下载安装教程 1 下载Blender 2 安装Blender 1 下载Blender 直达链接 Blender官网链接 手动复制 https www blender org 两种方式可自选 进入官网点击这里 可根据自己
  • 【医学图像处理】用于肝血管分割的平均教师辅助置信学习

    标题 Noisy Labels are Treasure Mean Teacher Assisted Confident Learning for Hepatic Vessel Segmentation 作者 Donghuan Lu 腾讯天
  • django配置随时执行的脚本,使用运行时的manage环境执行程序

    有时候需要在启动django后执行一些数据的实时采集或更新操作 这篇博客记录脚本的配置与运行 安装依赖 首先安装依赖 pip install django extensions 然后在setting的INSTALLED APPS配置中添加d
  • OpenCV图像处理——轮廓检测

    目录 图像的轮廓 查找轮廓 绘制轮廓 轮廓的特征 轮廓面积 轮廓周长 轮廓近似 凸包 边界矩形 最小外接圆 椭圆拟合 直线拟合 图像的矩特征 矩的概念 图像中的矩特征 图像的轮廓 查找轮廓 binary contours hierarchy
  • 手机串口终端

    手机串口终端 做嵌入式开发的小伙伴永远离不开串口 想想一下 假设你需要进行现场调试 但是身边没有电脑 或者其他特殊环境不方便用电脑 或者就是单纯的懒得用电脑 该怎么办 这就是我碰到的场景 而且不止一次 说多了都是泪 别问 这种情况你就只能把
  • 多线程小记

    创建线程的几种方法 C 多线程之 beginthread https blog csdn net u013043408 article details 83830181 C 多线程之CreateThread https blog csdn
  • ping: www.baidu.com: Temporary failure in name resolution

    虚拟机突然访问不了百度了 查看发现网络都是好的 root zk02 ping www baidu com ping www baidu com Temporary failure in name resolution 经查修改下如下配置文件
  • 统计软件与数据分析Lesson9----爬虫解析库Beautiful Soup

    统计软件与数据分析Lesson9 爬虫解析库Beautiful Soup知识点总结 1 requests 模块 1 1 查看requests功能函数 1 2 发送请求 1 3 传递URL参数 1 4 获取响应内容 2 Beautiful S
  • Chrome NET::ERR_CERT_AUTHORITY_INVALID 错误分析及处理

    Chrome NET ERR CERT AUTHORITY INVALID 错误分析及处理 1 问题描述 今天用Apache搭建好PC端服务器后 用Chrome测试 打开http localhost 时出现了如下的错误 错误代码 NET E
  • js实现前端分页页码管理

    用JS实现前端分页页码管理 可以很美观的区分页码显示 这也是参考大多数网站的分页页码展示 能够有很好的用户体验 这也是有业务需要就写了一下 还是新手 经验不足 欢迎指出批评 首先先看效果图 这是初始页面 也就是第一页 的界面 如果为第一页时
  • Python怎么合并两个矩阵?Python矩阵合并需要使用什么方法

    python之中的第三方库numpy可以构建出来矩阵这种行列格式且对称的数据结构 而在之前的文章之中小编给大家介绍了矩阵是如何通过添加的方式来扩展行列的 而本次要来给大家分享的就是一个和它相似的内容 矩阵合并的方法以及详细代码示例 一起往下
  • Hive优化

    1 Fetch抓取 目的 让hive sql 能不走MR 尽量不走MR 通过hive的参数来配置 决定哪些sql可以不走MR set hive fetch task conversion 可选值 none minimal more 默认值
  • Java实现PDF导出/预览

    网上有很多关于PDF导出的文章 但是个人感觉实现的过于复杂 又是模板又是html的 有的还需要字体模板的支持 本片文章只是实现简单的PDF表格导出 可以实现PDF动态表格导出 预览 这类文章网上很少 就给你们整理一篇吧 实现思路 本地创建P
  • 自己写的跨数据库的表同步工具

    阅读本文大概需要 3 6 分钟 近期在做数据集市 遇到的痛点如下 1 数据采集过程繁琐 重复的脚本编写太多 从不同的数据库抽取数据 需要为不同的数据库写卸数脚本 再传输到数据集市文件服务器 再入库 每一环节都需要调度 2 不同的数据库写不同
  • Linux安装unrar

    Linux中unrar的安装 下载unrar wget https www rarlab com rar rarlinux x64 6 0 2 tar gz 解压文件 tar xf rarlinux x64 6 0 2 tar gz 安装
  • win10安装protobuf

    Win10安装protobuf 准备 安装VS 下载protobuf 安装cmake 下载gmock 安装 Cmake构建配置 使用VS编译protobuf 准备 安装VS 下载protobuf 下载地址 https github com
  • flutter app启动页的强制获取配置前先检查是否有网络

    判断网络状态 connectivity plus 2 3 9 late StreamSubscription
  • Java8 stream流的操作 map和list转换

    Java8 stream流的操作 1 将map的所有value转换成list 创建map并塞两个值 Map
  • Linux shell命令行可选参数的getopts命令使用例子

    Linux shell命令行可选参数的getopts命令使用例子 一 概述 getopts option DESCPRITION VARIABLE option 表示为某个脚本可以使用的选项 冒号如果某个选项 option 后面出现了冒号