getopts 可选参数_linux shell命令行选项与参数用法详解--getopt

2023-10-30

本文介绍了linux shell中使用命令行选项与命令行参数的方法,在bash中,可以用以下三种方式来处理命令

行参数,每种方式都有自己的应用场景

问题描述:在linux shell中如何处理tail -n 10 access.log这样的命令行选项?

在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。

1,直接处理,依次对$1,$2,...,$n进行解析,分别手工处理;

2,getopts来处理,单个字符选项的情况(如:-n 10 -f file.txt等选项);

3,getopt,可以处理单个字符选项,也可以处理长选项long-option(如:--prefix=/home等)。

总结:小脚本手工处理即可,getopts能处理绝大多数的情况,getopt较复杂、功能也更强大。

1,直接手工处理位置参数

必须要要知道几个变量,

代码如下:

* $0 :即命令本身,相当于c/c++中的argv[0]

* $1 :第一个参数.

* $2, $3, $4 ... :第2、3、4个参数,依次类推。

* $# 参数的个数,不包括命令本身

* $@ :参数本身的列表,也不包括命令本身

* $* :和$@相同,但"$*" 和 "$@"(加引号)并不同,"$*"将所有的参数解释成一个字符串,而"$@"

是一个参数数组。

手工处理方式能满足多数的简单需求,配合shift使用也能构造出强大的功能,但处理复杂选项时建议用下面

的两种方法。

例子,(getargs.sh):

代码如下:

#!/bin/bash

if [ $# -lt 1 ]; then

echo "error.. need args"

exit 1

fi

echo "commond is $0"

echo "args are:"

for arg in "$@"

do

echo $arg

done

运行命令:

代码如下:

./getargs.sh 11 22 cc

commond is ./getargs.sh

args are:

11

22

cc

2,getopts (shell内置命令)

处理命令行参数是一个相似而又复杂的事情,为此,c提供了getopt/getopt_long等函数,c++的boost提供了

options库,在shell中,处理此事的是getopts和getopt。

getopts/getopt的区别,getopt是个外部binary文件,而getopts是shell builtin。

代码如下:

[root@jbxue ~]$ type getopt

getopt is /usr/bin/getopt

[root@jbxue ~]$ type getopts

getopts is a shell builtin

getopts不能直接处理长的选项(如:--prefix=/home等)

关于getopts的使用方法,可以man bash  搜索getopts

getopts有两个参数,第一个参数是一个字符串,包括字符和“:”,每一个字符都是一个有效的选项,如果

字符后面带有“:”,表示这个字符有自己的参数。getopts从命令中获取这些参数,并且删去了“-”,并

将其赋值在第二个参数中,如果带有自己参数,这个参数赋值在“optarg”中。提供getopts的shell内置了

optarg这个变变,getopts修改了这个变量。

这里变量$optarg存储相应选项的参数,而$optind总是存储原始$*中下一个要处理的元素位置。

while getopts ":a:bc" opt  #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数

例子,(getopts.sh):

代码如下:

echo $*

while getopts ":a:bc" opt

do

case $opt in

a ) echo $optarg

echo $optind;;

b ) echo "b $optind";;

c ) echo "c $optind";;

? ) echo "error"

exit 1;;

esac

done

echo $optind

shift $(($optind - 1))

#通过shift $(($optind - 1))的处理,$*中就只保留了除去选项内容的参数,可以在其后进行正常的shell

编程处理了。

echo $0

echo $*

执行命令:

复制代码 代码如下:

./getopts.sh -a 11 -b -c

-a 11 -b -c

11

3

b 4

c 5

5

./getopts.sh

3,getopt(一个外部工具)

具体用用法可以 man getopt

#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项,如-carg 而不能是-c arg

#--long表示长选项

例子,(getopt.sh):

代码如下:

#!/bin/bash

# a small example program for using the new getopt(1) program.

# this program will only work with bash(1)

# an similar program using the tcsh(1) script. language can be found

# as parse.tcsh

# example input and output (from the bash prompt):

# ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long "

# option a

# option c, no argument

# option c, argument `more'

# option b, argument ` very long '

# remaining arguments:

# --> `par1'

# --> `another arg'

# --> `wow!*\?'

# note that we use `"$@"' to let each command-line parameter expand to a

# separate word. the quotes around `$@' are essential!

# we need temp as the `eval set --' would nuke the return value of getopt.

#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项

#如-carg 而不能是-c arg

#--long表示长选项

#"$@"在上面解释过

# -n:出错时的信息

# -- :举一个例子比较好理解:

#我们要创建一个名字为 "-f"的目录你会怎么办?

# mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用

# mkdir -- -f 这样-f就不会被作为选项。

temp=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \

-n 'example.bash' -- "$@"`

if [ $? != 0 ] ; then echo "terminating..." >&2 ; exit 1 ; fi

# note the quotes around `$temp': they are essential!

#set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了

eval set -- "$temp"

#经过getopt的处理,下面处理具体选项。

while true ; do

case "$1" in

-a|--a-long) echo "option a" ; shift ;;

-b|--b-long) echo "option b, argument \`$2'" ; shift 2 ;;

-c|--c-long)

# c has an optional argument. as we are in quoted mode,

# an empty parameter will be generated if its optional

# argument is not found.

case "$2" in

"") echo "option c, no argument"; shift 2 ;;

*) echo "option c, argument \`$2'" ; shift 2 ;;

esac ;;

--) shift ; break ;;

*) echo "internal error!" ; exit 1 ;;

esac

done

echo "remaining arguments:"

for arg do

echo '--> '"\`$arg'" ;

done

运行命令:

代码如下:

./getopt.sh --b-long abc -a -c33 remain

option b, argument `abc'

option a

option c, argument `33'

remaining arguments:

--> `remain'

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

getopts 可选参数_linux shell命令行选项与参数用法详解--getopt 的相关文章

  • python爬虫利器:user agent switcher

    一 推荐理由 方便 相比于在浏览器中右键检查 再将浏览器设置成手机端 如下图 user agent switcher给我们带来更多的是方便 一次设置好 就不怕每次麻烦的右键检查 设置成手机端的重复性操作了 这对于python爬虫算是一个比较
  • Keil uVision5开发环境搭建(MDK 5)

    1 下载并安装 MDK作为STM32常用的IDE 其他还有IAR等等 在学习STM32F103的过程中 我之所以选择MDK 是因为KEIL5可以完美兼容KEIL4 与之前的版本相比 最大的区别在于器件 Software Packs 与编译器
  • VS2017+cmake+DCMTK编译安装

    转载自嗯哇创作https blog csdn net chaoenhu article details 78200274 Visual Studio 2015 cmake编译安装MD版的DCMTK 一 编译环境 本文的编译机器是Window
  • 判断字符串类型以及对比

  • R语言数据处理:tidyr包学习

    文章目录 前言 1 gather 函数 2 spread 函数 3 unite 函数 4 separate 函数 5 缺失值处理 总结 前言 在R语言中 tidyr包的应用 tidyr主要提供了一个类似Excel中数据透视表 pivotta
  • git远程连接全流程

    查看文件状态 git status 把文件提交到暂存区 git add 提交文件 命令形式 git commit m 注释内容 连接到远程仓库 这里的origin是远端名称 一般默认都是origin 后面的地址是仓库路径 git remot
  • office2022最新版本Microsoft 365

    office2022正式版是微软即将发布的全新的office版本 office2022正式版将于 2021 年下半年发布 适用于 Windows 和 macOS 系统 按照惯例 微软每隔三年发布一次新版 Office 所以在2021年下半年
  • KEIL调试正在运行的程序

    问题现象 有时程序跑着跑着就飞了 但此时却没有接仿真器 不能停下来看运行状态 如果重新启动调试 会破坏现场 有没有办法attach到应用程序上调试呢 答案是肯定的 解决措施 在调试选项中 取消以下选择项 Options For Target
  • Oracle练习题(九)

    Oracle练习题 九 1 创建一个存储过程 以员工号为参数 输出该员工的工资 创建存储过程 create or replace procedure print sal n number as val sal emp sal type be
  • “==“和equals的区别是什么

    对于基本类型 比较的是值是否相等 对于引用类型 比较的是地址是否相等 equals 比较的是对象是否相等 不能比较基本类型 因为equals是Object超类中的方法 而Object是所有类的父类 因为 Java 只有值传递 所以 对于 来
  • 把符合要求的数组放到一个新的数组中

    var arra j 0 筛选出大于等于比值 for var i 0 i lt arr length i if arr i gt num arra j arr i 我们经常有这样的需求 我们要筛选出 一个数值最接近数组中的某个数据 并且选择
  • CCF-CSP 新生必读

    CCF软件能力认证 Certified Software Professional CSP CSP认证考什么 怎么考 1 认证概况 认证名称 计算机软件能力考试认证 简称软件能力认证 认证定义 软件能力包括软件的开发 测试 部署和运行维护能
  • 简单的vscode打开多个文件时实现标签栏多行显示

    一 问题描述 vscode在打开文件的时候所有的标签都是在一行 找个东西就很麻烦 设置成多行显示就很方便了 二 设置 打开vscode的设置 搜索wrap tabs 勾选上就可以了
  • hibernate type=MyISAM 报错

    在配置hibernate cfg xml中 如果配置了使用hibernate创建表 则会出现type mylsam错误 主要为引擎错误 错误操作 hibernate cfg xml配置了下面语句后 自动创建表 不建议使用
  • Java读取、写入、处理Excel文件中的数据

    在日常工作中 我们常常会进行文件读写操作 除去我们最常用的纯文本文件读写 更多时候我们需要对Excel中的数据进行读取操作 本文将介绍Excel读写的常用方法 希望对大家学习Java读写Excel会有帮助 在开始进行Java读写Excel前
  • c# 获取快捷方式指向的目标路径

    注意 在使用如下代码之前需进行这些操作 选择 解决方案资源管理 引用 右键 添加引用 COM Windows Script Host Object Model 确定 代码如下 获取快捷方式指向的目标路径 public static read
  • VC++ 教程

    基本概念 对象 面向对象编程2 定义实体后 可以不知道此实体的功能是怎样实现的 也能使用它们 核心概念 1 数据封装 将一个数据与这个数据有关的操作集合封装在一起 形成一个能动的实体 称为对象 2 继承 在面向对象语言中 类功能支持层次机制
  • 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    给你一个 非空 整数数组 nums 除了某个元素只出现一次以外 其余每个元素均出现两次 找出那个只出现了一次的元素 比如 nums 4 1 2 1 2 返回 4 法一思路 使用异或 由于相同的元素异或结果是0 0和任意元素异或都是该元素 所
  • 谈谈Spring中都用到了哪些设计模式?

    控制反转 IOC 和依赖注入 DI IoC Inversion of Control 控制翻转 是Spring 中一个非常非常重要的概念 它不是什么技术 而是一种解耦的设计思想 它的主要目的是借助于 第三方 即Spring 中的 IOC 容

随机推荐

  • 2023全国电子设计竞赛的一点思路

    2023电赛开始了 看了一下题目 有几个题有一点思路 分享给大家 不知道对不对 欢迎一起讨论 C题 电感电容测量装置 用数字电桥的方案 网上有开源的方案 可以找找 ADI有个集成芯片AD5933 是测量阻抗的 可以看看能不能用 参考 htt
  • 高防cdn和高防服务器有什么不一样?

    高防cdn 相信很多看过我们文章的小伙伴对cdn已经很了解了 cdn的原理很简单 就是构建在网络上的很多个节点 为网站作内容 分发 使用户就近获取所需资源 且分配的cdn节点都是高防节点 每个节点都有防御功能 还可以帮助用户隐藏真实ip 高
  • t-SNE数据降维(2维3维)及可视化

    最近看了一个叫光谱特征在后门攻击中的用法 读完之后发现是用了一个SVD也就是奇异值分解做了降维 然后用残差网络的representation层残差与残差的奇异值分解后的右奇异值矩阵的第一行做乘法得到correlation 疑惑得很什么时候相
  • 【CSS】如何设置行距、段落间距、缩进格式

    在使用MarkDownHere的时候 需要利用CSS编辑各个段落的格式 本文记录了CSS中编辑格式的各个属性及其设置 行距 行距一般使用line height value 来表示 比如要设置行距为2则可利用下面的属性 line height
  • M1(arm) Mac安装open3d

    问题 说在前面 open3d对arm架构的机器支持相对比较晚 所以目前还在完善当中 我试了官方给出的两种方法安装都出现了错误 首先给出官方的安装说明 Open3D ARM support 第一种 conda环境直接使用pip安装 即如下命令
  • python的概念及特点

    1 python语言 1 1 python语言的基本概念 python是一种极少数能兼具简单与功能强大的编程语言 官方介绍 python是一款易于学习且功能强大的编程语言 它具有高效率的数据结构 能够简单又有效地实现面象对象编程 pytho
  • 利用labelimg制作目标检测数据集

    labelimg介绍 Labelimg是一款开源的数据标注工具 可以标注三种格式 1 VOC标签格式 保存为xml文件 2 yolo标签格式 保存为txt文件 3 createML标签格式 保存为json格式 labelimg的安装 lab
  • Sublime Text 3 配置python 智能提示

    Sublime Text 3 配置python 智能提示 一 安装使用插件管理包 Package Control 安装教程参考地址 使用方法 安装成功后会显示出package control 点击package control 搜索 ins
  • mysql serial 类型_Mysql自增类型serial

    最近看前辈们的代码 发现了一个没有接触过的类型 serial 下面是关于serial的官方介绍 SERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO INCREMENT UNIQUE SE
  • 使用扩展的ping和扩展的traceroute命令

    ping命令ping 信息包互联网探索程序 命令是排除设备的可及性的一个非常普通的方法故障 它使用二个互联网控制信息协议 ICMP 查询消息 ICMP响应请求和ICMP回音应答确定一台远端主机是否是活跃的 ping命令也测量用收到ECHO回
  • node.js+uni计算机毕设项目基于微信小程序的健康管理系统(程序+小程序+LW)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 欢迎交流 项目运行 环境配置 Node js Vscode Mysql5 7 HBuilderX Navicat11 Vue Express 项目技术 Express框架 No
  • [转]Ubuntu自带的FTP服务器vsftpd技巧

    实现了Apache多用户的虚拟主机设置 那么一般这些用户都会选择用ftp上传的方式来管理自己的web内容 这就需要我们再为他们开设FTP服务 Ubuntu自带的FTP服务器是vsftpd 1 安装vsftpd Ubuntu安装软件倒不是件困
  • ag-gride-vue滚动条调整

    v deep ag layout normal overflow y overlay v deep ag theme alpine dark hover ag body horizontal scroll viewport margin r
  • Matlab中使用latex风格

    Matlab绘图时使用latex风格的符号和字体 往往能够使你的图形增色不少 在Matlab中 title text xlabel ylabel和legend均可使用latex风格的符号和字体 多说无益 直接上例子 title E 2 t
  • php参考文献外文文献,web of science怎么导出参考文献

    web of science导出参考文献的方法 首先登录web of Science网站 选择文献 然后选中所需要的文献 点击页面上方中间 保存至Endnote online 旁边的下拉箭头 选择保存位置即可 本文操作环境 Windows7
  • 通过apply进行数据预处理

    数据准备 这里我事先下载了一个csv文件 其中包含两列 时间戳和字符串 大小为近8000行 使用apply进行预处理 apply可以批量的改变dataframe中的数据 经过上边的处理 在df中添加了一列 全部都是a 将A列改的值为大写 a
  • 写给Android开发者的性能优化指南(Android 性能优化的方面方面都在这儿)

    众所周知 一个好的产品 除了功能强大 好的性能也必不可少 有调查显示 近90 的受访者会因为APP性能差而卸载 性能也是造成APP用户沮丧的头号原因 而且随着产品的更新迭代 功能的越发复杂 UI页面的越发丰富 性能问题变得更加严重 说实话要
  • 推荐系统-基于物品的协同过滤(Item-based CF)

    今天我们来聊一聊基于物品的协同过滤即Item based CF方法 有了上一篇的经验 你可能很容易就想到Item based CF就是通过计算物品之间的相似度 然后用户曾与那些商品发生过交互 给他推荐与这些商品最接近的东西给他 这样做有什么
  • 毕业设计-基于机器学习的软件漏洞挖掘方法

    目录 前言 课题背景和意义 实现技术思路 一 基于机器学习的软件漏洞挖掘流程 二 代码的表征形式 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近
  • getopts 可选参数_linux shell命令行选项与参数用法详解--getopt

    本文介绍了linux shell中使用命令行选项与命令行参数的方法 在bash中 可以用以下三种方式来处理命令 行参数 每种方式都有自己的应用场景 问题描述 在linux shell中如何处理tail n 10 access log这样的命