getopts 可选参数_getopts获得选项参数-程序员宅基地

技术标签: getopts 可选参数  

在写sh脚本的时候,常常需要运行时输入一些数据。之前已经知道用基本的$*,执行的情况,大概就是$0 $1 $2

$3……

那么,那些系统命令里的参数又是怎么做出来的呢?我们自己的脚本如何搞出来$0

-$1的效果呢?这就是getopts的作用了。举例如下:

#!/bin/bash

echo

"OPTIND starts at $OPTIND"

while getopts ":pq:" optname

do

case "$optname" in

"p")

echo "Option $optname is

specified"

;;

"q")

echo "Option $optname has

value $OPTARG"

;;

"?")

echo "Unknown option

$OPTARG"

;;

":")

echo "No argument value for

option $OPTARG"

;;

*)

#

Should not occur

echo "Unknown

error while processing options"

;;

esac

echo "OPTIND is now

$OPTIND"

done

在使用getopts命令的时候,shell会自动产生两个变量OPTIND和OPTARG。

OPTIND初始值为1,其含义是下一个待处理的参数的索引。只要存在,getopts命令返回true,所以一般getopts命令使用while循环;

OPTARG是当getopts获取到其期望的参数后存入的位置。而如果不在其期望内,则$optname被设为?并将该意外值存入OPTARG;如果$optname需要拥有具体设置值而实际却没有,则$optname被设为:并将丢失设置值的optname存入OPTARG;

对于$optname,可以用后标:来表示是否需要值;而前标:则表示是否开启静默模式。

案例分析:

getopts optstring varname [arg

...]

optstring  option字符串,会逐个匹配

varname    每次匹配成功的选项

arg        参数列表,没写时它会取命令行参数列表

$OPTIND    特殊变量,option

index,会逐个递增

$OPTARG    特殊变量,option

argument,不同情况下有不同的值

细则1:当optstring以”:“开头时,getopts会区分invalid option错误和miss option

argument错误。

invalid

option时,varname会被设成?,$OPTARG是出问题的option;

miss

option

argument时,varname会被设成:,$OPTARG是出问题的option。

如果optstring不以”:“开头,invalid

option错误和miss option

argument错误都会使

varname被设成?,$OPTARG是出问题的option。

细则2:当optstring中的字母跟”:“时(比如下面例子中的t),表明该option可接参数,参数(argument)放在$OPTARG中;

如果缺参数,且optstring是以”:“开头,则varname的值会是:,$OPTARG是该option,

否则varname的值是?,$OPTARG是该option。(参照细则1)

简单的sample:#!/bin/bash

SKIPBLANKS=

TMPDIR=/tmp

CASE=lower

while getopts :bt:u arg

do

case $arg in

b) SKIPBLANKS=TRUE

echo "If skip blanks? $SKIPBLANKS"

;;

t) if [ -d "$OPTARG" ]

then

TMPDIR=$OPTARG

echo "Temp dir is $TMPDIR."

else

echo "$0: $OPTARG is not a

directory." >&2

exit 1

fi

;;

u) CASE=upper

echo "Case sensitivity is $CASE."

;;

:) echo "$0: Must supply an argument to -$OPTARG." >&2

exit 1

;;

\?) echo "Invalid option -$OPTARG ignored." >&2

;;

esac

done

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42120541/article/details/111945206

智能推荐

2018美亚杯个人赛刷题-程序员宅基地

文章浏览阅读5.4k次,点赞6次,收藏27次。文章目录写在前面题目1.E2.C3.B -D-4.C -E-5.C6. D7.D8. A9.A10.C11.E12.D13.D14.A15.D16.E17.D18.A19. B20.C21.E22.D23.A24.C25.C26.D27.D28.C29.D30.D31.C32.E33.D34.B -C-35. -E-36.A37.A38.D39.D -C-40.B41.C42.E -D-43.C44.B45.A46.C47.E48.B49.D50.CPS写在前面这是美亚杯2018个人赛的个人_2018美亚杯个人赛

ECS框架学习(Entitas)入门_ecs框架 entitas-程序员宅基地

文章浏览阅读6.2k次。公司要求使用ECS框架经行开发,没办法只能自己学习了。记录一下学习过程。框架的含义可以去其他地方查看,我这里写一点我的理解(新人,不对请谅解)。ECS即Entity-Component-System(实体-组件-系统) 的缩写。它做到了行为、数据分开,Component存数据。Entity用来就是由各个Component组成。System用来经行他们中间的通信。对于网上或者官方说速度更快、更容..._ecs框架 entitas

vars()函数用法-程序员宅基地

文章浏览阅读1.5w次,点赞10次,收藏35次。python内置函数。vars() 函数返回对象object的属性和属性值的字典对象。vars([对象])当函数不接收参数时,其功能和locals函数一样,返回当前作用域内的局部变量。当函数接收一个参数时,参数可以是模块、类、类实例,或者定义了__dict__属性的对象。#作用于模块>>> import time>&a_vars()

vue中实现文字超出横向滚动_el-pagination超出屏幕-程序员宅基地

文章浏览阅读4.3k次,点赞3次,收藏14次。vue中实现文字超出横向滚动marquee组件<template> <div class="marquee-wrap" ref="marquee-wrap"> <div class="scroll" ref="scroll"> <p class="marquee">{{text}}</p> <p class="copy" ref="copy"></p> </div>_el-pagination超出屏幕

web.config/app.config敏感数据加/解密的二种方法-程序员宅基地

文章浏览阅读59次。一.利用代码加解密usingSystem.Web.Configuration;//加密web.Config中的指定节privatevoidProtectSection(stringsectionName){Configurationconfig=WebConfigurationManager.OpenWebConfigurat..._app.config代码加解密

记录一个诡异的bug-程序员宅基地

文章浏览阅读4k次。我擦,进到XXXXController的261行看了一下,发现是successPage里面的请求http方法报错,竟然进入到了successPage方法,我以为根本没进去呢。完了,完全没有想法了,我以为是天宫的问题,/ai/oa/meetingtran...这个路径找不到,就把整改项目的/oa/请求路径都去掉了,也不好使。我把这个successPage地址,加入到OA测试环境‘智能中心’那个应用,点击‘智能中心’跳转,跳转回successPage,也是不好使。我擦我擦我擦我擦,学习了。

随便推点

LayUI的后台管理模板_layui后端模板-程序员宅基地

文章浏览阅读8k次,点赞2次,收藏18次。  以前没有做网页开发不知道的内容太多了,现在开始做了这一块,发现内容真多。  星期五接到一个资产核查的任务,时间紧,我对网页这一块的内容还不是很熟练,有些着急,在网上一搜,LayUI的模板,有很多好评和讲解,拿来一用,感觉很不错。  这个后台系统可以很快上手,界面部分不用操心太多,很多页面有实例,略微改动就可以直接使用。  写程序界面是个大问题,这下省事多了,虽然后期项目使用LayUI比较少,但做一些中小型的项目真的是很好的选择,最主要的就是快。..._layui后端模板

常见的数组概念-程序员宅基地

文章浏览阅读90次。常见数组_常见的数组

如何从零开始实现TDOA技术的 UWB 精确定位系统(1)_uwb_tdoa-程序员宅基地

文章浏览阅读1.1k次,点赞28次,收藏24次。这是一个系列文章,将向你介绍如何从零开始实现一个使用TDOA技术的 UWB 精确定位系统。重要提示劝退说明Q:做这个定位系统需要基础么?A:文章不是写给小白看的,需要有电子技术和软件编程的基础Q:你的这些硬件/软件是开源的吗?A:不是开源的。这一系列文章是授人以“渔”,而不是授人以“鱼”。文章中我会介绍怎么实现UWB定位系统,告诉你如何克服难点,但不会直接把PCB的Gerber文件给你去做板子,不会把软件的源代码给你,不会把编译好的固件给你。我不会给你任何直接的结果,我只是告诉你方法。_uwb_tdoa

各种常见报错汇总_vs未经处理的异常怎么处理-程序员宅基地

文章浏览阅读10w+次,点赞2次,收藏13次。Visual Studio解决办法:报错原因:堆栈溢出,可能是定义的某个变量太大而没有修改栈保留大小所至。本人的问题是用ege画图的时候定义的地图面积太大导致。解决方法:项目→属性→链接器→系统→堆栈保留大小→设置成一个比较大的数并应用。即可完美解决,如果还没解决可能是设置的不够大。其实真正应该修改的是你的代码,问题就出现在为什么会有栈溢出问题,很简单,显然是数组或者开辟的指针空间太大!所以,解决办法就是将大数组定义在main()外部当作全局变量,全局变量放在数据区,空间足够使用。或者写在mai_vs未经处理的异常怎么处理

各大OJ网站的用途及利与弊-程序员宅基地

文章浏览阅读770次,点赞25次,收藏18次。今天就来分享一下我的工作成果,在各个网站搜集了资料,再加上我个人的一些见解,历经半年时间,终于写出这篇博文。希望对大家能有帮助,如果你不知道选用哪个网站进行OJ学习的话,可以认真阅读哦。这些是常见的OJ网站,如果有别的建议,可以留言,我有空的话会回复。

申请代码签名证书-程序员宅基地

文章浏览阅读865次,点赞33次,收藏17次。代码签名证书也是数字证书的一种,其主要作用是对可执行脚本、软件代码和内容进行数字签名的数字证书。代码签名证书用于验证开发者身份真实性、保护代码的完整性。用户下载软件时,能通过数字签名验证软件来源,确认软件、代码没有被非法篡改或植入病毒,保护用户不会被病毒、恶意代码和间谍软件所侵害。使用代码签名证书,您可以保证签名者的身份和软件的完整性,这可以防止在下载和安装软件时出现警告。代码签名证书是软件开发人员用来签署其软件、应用程序和驱动程序代码的数字证书。它使用公私密钥基础设施(PKI)将实体绑定到公钥和私钥。