getopts(1) builtin command

文章目录

  • 0.背景
  • 1.简介
  • 2.格式
  • 3.选项
  • 4.返回值
  • 5.特殊变量
  • 6.示例
  • 参考文献

0.背景

在执行 Shell 脚本时,可以像运行应用程序一样传入相应的参数,在脚本内部根据传入的参数内容执行对应的操作。

Shell 脚本中可以通过$1...$N形式的符号来引用传入的参数,$0表示当前脚本的名称。1~N 和传入参数位置相对应,比如$1表示执行脚本时传入的第一个参数,$2表示传入的第二个参数,以此类推引用其他参数。对于一些只需要很简单的命令行参数的脚本,通过使用$N形式轻松的完成解析,但对于比较复杂的命令行形式的参数,就需要脚本的编写者在脚本中加入复杂的代码对命令行入参进行解析。

为了减少重复性编程和简化命令行参数处理的过程,Shell 为脚本编写者提供了一些命令行处理方法,使用这些方法可以轻松的处理各种形式的命令行参数。

常用的是 getopts 和 getopt。getopts 是 Shell 内建命令,getopt 是一个独立的外部命令,通常在 GNU coreutils 中提供。

本文将介绍如何使用 getopts 处理命令行参数。

1.简介

getopts 是 Shell 内建命令,用于解析位置参数。

getopts 是一个简化版的 getopt,出现的目的仅仅是为了代替 getopt 较快捷方便的执行参数分析。

getopts 语法相对简单,不支持长选项(以 -- 开头的长选项,如--help)。如果遇到非选项(非 -开头)参数就终止解析,后面的选项和参数将不会被解析。

2.格式

getopts OPTSTRING NAME [ARGS]

OPTSTRING 表示要识别的命令行选项。如果一个字母后面有一个冒号 :,表示该命令行选项后面要跟一个参数。如 OPTSTRING 写成 “co:f:”,表示支持 -c、-o、-f 选项,-o 和 -f 选项后面需要跟一个参数。

NAME 为用来存储选项字符的变量名。

如果遇到一个无效选项,getopts 将选项变量 NAME 置为 ?。如果不是静默模式,则打印错误消息,并将 OPTARG 变量置空(unset)。如果是静默模式,无效选项字符将存储在 OPTARG 变量中,且不会打印任何错误消息。

如果没有找到所需的参数,并且 getopts 为非静默模式,则在 NAME 中放置一个问号,将 OPTARG 变量置空(unset),并打印错误信息。如果 getopts 为静默模式,则在 NAME 中放置冒号,并将 OPTARG 设置为找到的选项字符。

getopts 默认为非静默模式。可以在 OPTSTRING 的开头加一个冒号或将变量 OPTERR 设置为 0 开启静默模式。

ARGS 表示要解析的参数。在 Shell 脚本中使用时,默认解析的是执行 Shell 脚本传入的参数,所以这个部分可省略不写。

3.选项

无。

4.返回值

如果找到指定或未指定的选项,getopts 将返回 true。如果遇到选项结束或发生错误,则返回 false。

5.特殊变量

getopts 的使用涉及一些特殊变量。

  • OPTARG

OPTARG 存储当前选项的参数值。如果选项需要一个参数,getopts 会将该参数存储在 OPTARG 中。

  • OPTIND

OPTIND 是 getopts 内建变量,用于表示下一个要处理的参数的索引位置,从 1 开始。getopts 处理选项时会自动更新 OPTIND。

OPTIND 可用于检查和处理未解析的命令行参数。例如shift $((OPTIND -1))可以跳过已处理的选项,处理剩余的参数。

6.示例

使用 getopts,编写一个 Shell 脚本,可支持识别命令行选项 -b、-o、-h。其中,-b 和 -o 选项后需要跟一个参数。

#!/bin/bashwhile getopts ":a:b:h" opt_name
docase $opt_name ina) echo "-a Option is recognized, argument=$OPTARG";;b) echo "-b Option is recognized, argument=$OPTARG";;h) echo "-h Option is recognized";;?) echo "Invalid option: -$OPTARG"exit 1;;:) echo "-$OPTARG Option need a argument"exit 1;;esac
doneshift $((OPTIND - 1))
echo "Remaining arguments: $@"

OPTSTRING 为 :b:o:h,开头的冒号,表示 getopts 以静默模式运行。

-b 和 -o 选项后跟冒号,表示需要参数。

-h 后面没有冒号,表示无需参数。

如果存储选项字符的变量 opt_name 为问号,表示遇到一个无效选项。选项字符会放置到 OPTARG 变量。

如果存储选项字符的变量 opt_name 为冒号,表示选项需要参数但没有给定参数。选项字符会放置到 OPTARG 变量。

shift $((OPTIND - 1)) 表示将已经解析的位置参数移除,使用 $@ 可以访问剩余的所有参数。

运行上面的脚本会有如下输出:

./getopts.sh -a valuea -b valueb -h file1 file2
-a Option is recognized, argument=valuea
-b Option is recognized, argument=valueb
-h Option is recognized
Remaining arguments: file1 file2

如果输入非法选项:

./getopts.sh -c
Invalid option: -c

如果输入选项未带参数:

 ./getopts.sh -a
Invalid option: -a

预期是走到 :) 分支,并输出:

-a Option need a argument

实际结果与 bash manual 描述不一致,不知为何。


参考文献

bash(1) - Linux manual page
Coreutils - GNU core utilities
GNU Coreutils Manual - gnu.org

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/878466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于nodejs+vue+uniapp的摄影竞赛小程序

开发语言:Nodejs框架:expressuniapp数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:VS Code 系统展示 管理员登录 管理员主界面 用户管理 书籍分类管理 书籍信息管理 系统管理…

昇腾AI处理器的计算核心 - AI Core即DaVinci Core

昇腾AI处理器的计算核心 - AI Core即DaVinci Core flyfish 从一段代码的解释开始 template <typename T> class GlobalTensor { public:void setGlobalBuffer(T* buffer, uint32_t buffersize) {// 在这里实现设置全局缓冲区的逻辑} };语法的说明&#xff0c;主要用于…

fl studio 21/24破解版(水果音乐制作软件24) v24.1.1.4285附安装教程

fl studio 21/24破解版&#xff0c;又被国内网友称之为水果音乐制作软件24&#xff0c;是Image-Line公司成立26周年而发布的一个版本&#xff0c;是目前互联网上最优秀的完整的软件音乐制作环境或数字音频工作站&#xff0c;包含了编排&#xff0c;录制&#xff0c;编辑&#x…

在Ubuntu 20.04上安装MySQL的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 MySQL 是一个开源的数据库管理系统&#xff0c;通常作为流行的 LAMP&#xff08;Linux、Apache、MySQL、PHP/Python/Perl&#xf…

Cmake之1.0版本重要特性及用法实例(八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

GoodSync Business - 企业级服务器同步与备份工具

现在越来越多公司会搭建服务器&#xff0c;或自建文件共享中心。那么如何才能实现对这些终端的高效管理、安全备份&#xff0c;以保障企业数据的安全呢&#xff1f; GoodSync Business 就是一款企业服务器同步与备份工具&#xff0c;适用于 Win / Mac 工作站&#xff0c;以及 …

Kafka【二】关于消费者组(Consumer Group)、分区(partition)和副本(replica)的理解

【1】概述 Apache Kafka 是一个分布式流处理平台&#xff0c;它允许你发布和订阅记录流&#xff0c;存储记录流&#xff0c;并且可以对这些记录流进行处理。在 Kafka 中&#xff0c;消息被发布到特定的主题&#xff08;topic&#xff09;&#xff0c;然后由消费者&#xff08;…

57-java csrf防御方案

CSRF&#xff08;跨站请求伪造&#xff09;是一种攻击手段&#xff0c;它迫使已登录用户的web应用在没有用户知情的情况下&#xff0c;发送未经授权的请求。在Java中&#xff0c;有多种方法可以用来防御CSRF攻击。 使用同步令牌&#xff08;Token&#xff09;&#xff1a; 同…

Datawhale X 李宏毅苹果书 AI夏令营 Task2打卡

线性模型&#xff08;Linear model&#xff09; 通常模型的修改来自于对问题的理解&#xff0c;即领域知识 基本定义&#xff1a;把输入特征x乘上一个权重&#xff0c;再加上一个偏置就可以得到预测的结果。 优点&#xff1a;简单易理解&#xff0c;可理解性好&#xff08;权重…

C++可调用对象

C11中有一个重要的概念&#xff0c;叫可调用对象&#xff0c; 可调用对象用途广泛&#xff0c;比如作为线程的执行对象&#xff0c;或者在使用一些基于范围的模版函数时&#xff08; sort()、all_of()、find_if()&#xff09;&#xff0c;常常需要我们传入一个可调用对象&…

算法基础-位运算

>> &#xff08;右移运算&#xff09; x >> y&#xff1a;表示将x的二进制值右移y位。 正数是直接右移y位&#xff0c;则高位&#xff08;最左边&#xff09;补y个0。 负数是求补码&#xff0c;然后右移y位&#xff0c;最高位补y个1&#xff0c;再求反码&#xff…

Gamma基线估算

在使用Gamma软件处理DInSAR数据时&#xff0c;基线估算是一个非常关键的步骤。Gamma软件提供了一系列工具来计算和处理基线信息&#xff0c;以确保干涉图像的准确性和后续形变分析的精度。以下是Gamma软件中基线估算的详细步骤&#xff1a; 1. 初始化基线计算 (base_init) 首…

更适合编写股票盯盘软件或者量化交易平台的语言是Python还是C

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…

集成电路学习:什么是DAC数模转换器

DAC&#xff1a;数模转换器 DAC&#xff0c;全称Digital-to-Analog Converter&#xff0c;即数模转换器&#xff0c;是一种电子设备或电路&#xff0c;用于将数字信号转换为相应的模拟信号。在现代电子系统中&#xff0c;DAC扮演着至关重要的角色&#xff0c;它实现了数字电路与…

如何在UE5.4中重新定位动画?

动画在游戏和电影制作中扮演着至关重要的角色&#xff0c;而在虚幻引擎5.4&#xff08;UE5.4&#xff09;这一强大的实时3D创作平台中&#xff0c;重新定位动画的能力更是将创意表达推向了新的高度。本文将引导您探索UE5.4中重新定位动画的技巧&#xff0c;确保您的动画作品不仅…

Unity | 基础知识

装箱和拆箱&#xff1a; 获取对方的类型&#xff1a; GetType通过打点调用 as进行类型转换 运用Convert进行类型转换&#xff1a; 二维数组的定义 结构体类型 不同名称空间来调用&#xff1a;

Auto-Unit-Test-Case-Generator -- java项目自动测试生成

0.Pre-预备知识&#xff1a; 0.1.Maven是什么&#xff1f; [by Maven是什么&#xff1f;有什么作用&#xff1f;Maven的核心内容简述_maven是干什么用-CSDN博客 ] 是Java 领域中最流行的自动化构建工具之一&#xff0c;Maven 作为 Java 项目管理工具&#xff0c;具有: 包管…

互联网全景消息(1)之RabbitMq基础入门

一、消息中间件 1.1消息队列回顾 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实 现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ &a…

数据库mysql8.x中修改密码的方法

mysql数据库最新版本9.x都出来了&#xff0c;再不学就要被淘汰了&#xff01;&#xff01;这次使用的是8.0.39版本&#xff0c;大家可以去官网下载使用。 官网地址:https://dev.mysql.com/downloads/mysql/ 安装好后&#xff0c;默认密码是一串很难记忆的字符&#xff0c;记录…

day-46 旋转图像

思路 不能使用辅助数组&#xff0c;所以关键在于弄清楚旋转后坐标的变化规律。当矩阵的大小n为偶数时&#xff0c;以n/2行和n/2列的元素为起点&#xff0c;当矩阵的大小n为奇数时&#xff0c;以n/2行和&#xff08;n1&#xff09;/2列的元素为起点 解题过程 关键&#xff1a;旋…