shell脚本传可选参数 getopts 和 getopt的方法

写了一个shell脚本,需要向shell脚本中传参数供脚本使用,达到的效果是传的参数可以是可选参数

下面是一个常规化的shell脚本:

        echo "执行的文件名为: $0";echo "第一个参数名为: $1";echo "第二个参数名为: $2"

正常的向shell脚本中传参数的方法为:

             ./test.sh 1 2 3

最后执行的结果为:

 

        执行的文件名为: ./test.sh第一个参数名为: 1第二个参数名为: 2

但是这个是只能按照顺序传递参数,并且不能传递可选参数,然后查资料,发现了一个shell的getopts 用法

 首先贴个例子

复制代码
[hello@Git shell]$ bash test.sh -a hello
this is -a the arg is ! hello
[hello@Git shell]$ more test.sh 
#!/bin/bashwhile getopts "a:" opt; docase $opt ina)echo "this is -a the arg is ! $OPTARG" ;;\?)echo "Invalid option: -$OPTARG" ;;esac
done
复制代码

getopts一共有两个参数,第一个是-a这样的选项,第二个参数是 hello这样的参数。

选项之间可以通过冒号:进行分隔,也可以直接相连接,:表示选项后面必须带有参数,如果没有可以不加实际值进行传递

例如:getopts ahfvc: option表明选项a、h、f、v可以不加实际值进行传递,而选项c必须取值。使用选项取值时,必须使用变量OPTARG保存该值。

复制代码
[hello@Git shell]$ bash test.sh -a hello -b
this is -a the arg is ! hello
test.sh: option requires an argument -- b
Invalid option: -
[hello@Git shell]$ bash test.sh -a hello -b hello -c 
this is -a the arg is ! hello
this is -b the arg is ! hello
this is -c the arg is ! 
[hello@Git shell]$ more test.sh 
#!/bin/bashwhile getopts "a:b:cdef" opt; docase $opt ina)echo "this is -a the arg is ! $OPTARG" ;;b)echo "this is -b the arg is ! $OPTARG" ;;c)echo "this is -c the arg is ! $OPTARG" ;;\?)echo "Invalid option: -$OPTARG" ;;esac
done
[hello@Git shell]$ 
复制代码

执行结果结合代码显而易见。同样你也会看到有些代码在a的前面也会有冒号,比如下面的

情况一,没有冒号:

复制代码
[hello@Git shell]$ bash test.sh -a hello
this is -a the arg is ! hello
[hello@Git shell]$ bash test.sh -a
test.sh: option requires an argument -- a
Invalid option: -
[hello@Git shell]$ more test.sh 
#!/bin/bashwhile getopts "a:" opt; docase $opt ina)echo "this is -a the arg is ! $OPTARG" ;;\?)echo "Invalid option: -$OPTARG" ;;esac
done
[hello@Git shell]$ 
复制代码

情况二,有冒号:

复制代码
[hello@Git shell]$ bash test.sh -a hello
this is -a the arg is ! hello
[hello@Git shell]$ bash test.sh -a 
[hello@Git shell]$ more test.sh 
#!/bin/bashwhile getopts ":a:" opt; docase $opt ina)echo "this is -a the arg is ! $OPTARG" ;;\?)echo "Invalid option: -$OPTARG" ;;esac
done
复制代码

情况一输入 -a 但是后面没有参数的的时候,会报错误,但是如果像情况二那样就不会报错误了,会被忽略。

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

参考 https://blog.csdn.net/xluren/article/details/17489667

但是这样还是无法满足可以输入可选参数的要求,这样输入的参数名称也是固定的,参数的数量也是固定的,然后接下来了解了shell 的getopt用法。

看过官方文档后,自己写了个小demo

复制代码
#!/bin/bash#获取对应的参数 没有的话赋默认值
ARGS=`getopt -o a::b::l::n::t::p:: --long along::,blong::,llong::,plong:: -n 'example.sh' -- "$@"`
if [ $? != 0 ]; thenecho "Terminating..."exit 1
fi#echo $ARGS
#将规范化后的命令行参数分配至位置参数($1,$2,...)
eval set -- "${ARGS}"while true;
docase "$1" in-a|--along)case "$2" in"")project1_name=master;shift 2;;;*)project1_name=$2;shift 2;;;esac;;-b|--blong)case "$2" in"")project2_name=master;shift 2;;*)project2_name=$2;shift 2;;;esac;;-l|--llong)case "$2" in"")layer=layer_1;shift 2;;*)layer=$2;shift 2;;;esac;;-n)case "$2" in"")number=1000;shift 2;;*)number=$2;shift 2;;;esac;;-t)case "$2" in"")select_type=top;shift 2;;*)select_type=$2;shift 2;;;esac;;-p)case "$2" in"")data_point=;shift 2;;*)data_point=$2;shift 2;;;esac;;--)shiftbreak;;*)echo "Internal error!"exit 1;;esacdoneproject1_name=${project1_name:-master}
project2_name=${project2_name:-master}
layer=${layer:-layer_1}
number=${number:-100}
select_type=${select_type:-top}
data_point=${data_point:-}
复制代码

这一部分为输入参数对应的字符

a::b::l::n::t::p::

 

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

#--long表示长选项

一目了然,首先是根据传递过来的 是 -a  还是 -b  -l 进行判断,如果只有-a后面没有参数的话 则赋默认值,同时在

project1_name=${project1_name:-master}
project2_name=${project2_name:-master}
layer=${layer:-layer_1}
number=${number:-100}
select_type=${select_type:-top}
data_point=${data_point:-}

这一步 也进行了默认值的赋值操作。如果上面没有 project1_name  则赋值为master

例子如下:

复制代码
参数的默认值设置$cat myscript.shprint ${1:-hello}print ${2:-kshell}$sh myscript.shhellokshell
复制代码

 

转载于:https://www.cnblogs.com/linwenbin/p/10800756.html

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

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

相关文章

Teams Tab App 代码深入浅出 - 配置页面

上一篇文章我们使用Teams Toolkit 来创建、运行 tab app。这篇文章我们深入来分析看一下tab app 的代码。 先打开代码目录,可以看到在 src 目录下有入口文件 index.tsx,然后在 components 目录下有更多的一些 tsx 文件,tsx 是 typescript的一…

labelme标注的json文件数据转成coco数据集格式(可处理目标框和实例分割)

这里主要是搬运一下能找到的 labelme标注的json文件数据转成coco数据集格式(可处理目标框和实例分割)的代码,以供需要时参考和提供相关帮助。 1、官方labelme实现 如下是labelme官方网址,提供了源代码,以及相关使用方…

EpSON TM-82II驱动在POS系统上面安装问题处理

按照品牌名称,在网上下载的安装包为apstmt82.rar 下面讲解一下,如何的解决爱普生打印机在POS机器上面的安装问题,这个算是一个比较奇特的故障问题,不像其它的新北冰洋(SN3C)的U80_U80II,SeNor的…

打印图片的属性和实现另存图片功能以及使用numpy

上一篇我们已经学了如何读取图片的功能了以及和opencv的环境搭建了,今天接着来学习,哈哈哈,今天刚好五一,也没闲着,继续学习。 1、 首先我们来实现打印出图片的一些属性功能, 先来看一段代码: 1…

Ubuntu 18.04下命令安装VMware Tools

2019独角兽企业重金招聘Python工程师标准>>> sudo apt-get upgrade sudo apt-get install open-vm-tools-desktop -y sudo reboot 转载于:https://my.oschina.net/u/574036/blog/1829455

Qfile

打开方式: 1 void AddStudents::write_to_file(QString src){2 QFile file("stu.txt");3 if (!file.open(QIODevice::Append | QIODevice::Text)){4 QMessageBox::critical(this,"打开文件错误","确认");5 r…

IDEA svn 菜单不见了,解决方法

2019独角兽企业重金招聘Python工程师标准>>> 参考地址: http://www.cnblogs.com/signheart/p/193448a98f92bd0cc064dbd772dd9f48.html,我是第二种方法解决的! 转载于:https://my.oschina.net/liuchangng/blog/1829679

苏宁易购:Hadoop失宠前提是出现更强替代品

在笔者持续调研国内Hadoop生态系统生存现状的同时,KDnuggets发布的2018年数据科学和机器学习工具调查报告再次将“Hadoop失宠”言论复活。报告一出,“Hadoop被抛弃”几个字瞬时成为各大标题党的最爱,充斥在不同的新闻平台。这些报告和数据是否…

VS2017生成一个简单的DLL文件 和 LIB文件——C语言

下面我们将用两种不同的姿势来用VS2017生成dll文件(动态库文件)和lib文件(静态库文件),这里以C语言为例,用最简单的例子,来让读者了解如何生成dll文件(动态库文件) 生成动…

Hive数据类型及文本文件数据编码

本文参考Apache官网,更多内容请参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManualTypes 1. 数值型 类型支持范围TINYINT1-byte signed integer, from -128 to 127SMALLINT2-byte signed integer, from -32,768 to 32,767INT/INTEGE…

Python绘图Turtle库详解

转载:https://blog.csdn.net/zengxiantao1994/article/details/76588580 Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令…

mac使用brew update无反应解决办法

为什么80%的码农都做不了架构师?>>> mac系统中使用brew作为包管理工具,类似centos中的yum,ubuntu中的apt-get,在使用brew update的使用,有时候会长时间无反应,或者中途断开连接,这是…

2018-2019-2 20175223 实验三《敏捷开发与XP实践》实验报告

目录 北京电子科技学院(BESTI)实验报告实验名称:实验三 敏捷开发与XP实践实验内容、步骤与体会:一、实验三 敏捷开发与XP实践-1二、实验三 敏捷开发与XP实践-2三、实验三 敏捷开发与XP实践-3四、实验三 敏捷开发与XP实践-4五、代码…

(八)路径(面包屑导航)分页标签和徽章组件

一&#xff0e;路径组件 路径组件也叫做面包屑导航。 <ol class"breadcrumb"><li><a href"#">首页</a></li><li><a href"#">产品列表</a></li><li><a href"#">大…

python之爬虫(四)之 Requests库的基本使用

什么是Requests Requests是用python语言基于urllib编写的&#xff0c;采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用&#xff0c;你会发现&#xff0c;其实urllib还是非常不方便的&#xff0c;而Requests它会比urllib更加方便&#xff0c;可以…

win8下cocos2dx-3.2+VS2012环境配置及项目创建

这是本人CSDN的第一篇博客&#xff0c;因为假期在学校做实训项目接触到了cocos2dx&#xff0c;觉得是一个特别适用强大&#xff0c;有不错的可移植性&#xff08;虽然可移植性不错&#xff0c;但实际上写好的游戏往Android上移植&#xff0c;我的队友废了好大劲。。。&#xff…

Mac系统下Homebrew的安装和使用Homebrew安装python

这里向大家推荐一个东西&#xff0c;Mac下很好用的东西&#xff0c;叫做Homebrew。刚开始接触Mac的时候&#xff0c;我也没听过这个东西&#xff0c;但装了以后真的觉得&#xff0c;TMD太碉堡了。引用一句话&#xff1a;Homebrew is the easiest and most flexible way to inst…

Mac下cocos2dx-3.2+Xcode环境配置和项目创建

这是有关环境配置的第二篇教程&#xff0c;第一篇讲的是win8下的环境配置。这里我们使用C。所有如果你用其他语言如Lua和js进行cocos2d开发&#xff0c;那么可以再找一找其他的配置文档。下面要说Mac os 下 cocos2dx-3.2Xcode的环境配置&#xff0c;这里我使用的是Xcode 5.1.1。…

Mac OS使用技巧之一:查看Finder中的.bash_profile等系统隐藏文件

作为一个程序员&#xff0c;经常要配置变量&#xff0c;可能要更改hosts文件&#xff0c;或者你闲着没事儿寻找homebrew给你安装的东西在什么地方。Mac OS的内核是Unix&#xff0c;Linux/Unix系统出于系统安全和用户安全的考虑&#xff0c;会把一些与系统相关的文件隐藏&#x…

win8下cocos2dx3.2移植android平台及代码打包APK

cocos2dx程序不能只在VS2012下运行&#xff0c;迟早是要搬运到Android和IOS上的。Windows下移植IOS平台先搁下不说比较困难&#xff0c;而且只有越狱的苹果机才可以运行&#xff0c;而且毕竟IOS高端、小众。这里主要讲一下移植Android&#xff0c;windows下cocos2dx打包成APK和…