一、getopts 命令

 1、用途

     处理命令行参数,并校验有效选项。

 2、语法

     getopts 选项字符串 名称 [ 参数 ...]

 3、描述

   getopts 命令是 Korn/POSIX shell 的内置命令,用来从参数列表检索选项以及选项参数。选项由一个+(加号)或者是由一个-(减号)后跟一个字符开始。一个既不是以+,也不是以-开始的选项结束选项字符串。每次调用 getopts 命令时,它将下一个选项的值放置在名称内,并将下一个要处理的参数的索引置于 shell 变量 OPTIND 中。一旦调用了shell , OPTIND 将初始化为1。当选项以 +开头,则+ 将预先设为名称中的值。

   *如果选项字符串中的字符后面带有“:”(冒号),则预期此选项将带有参数。当选项需要选项参数时,getopts 命令就将其置于变量 OPTARG 中。

当查找到选项字符串所不包含的选项字符,或者查找到的选项没有所需的选项参数时:

  • 如果选项字符串不以:(冒号)开头,名称 将会被设置为 ?(问号)字符,OPTARG. 将被取消设置,并且诊断消息将被写入到标准错误中。

   这种情况被认为是在将参数传递给所调用的应用程序的过程中所检测到的错误,而不是在处理 getopts 命令的过程中所发生的错误;如上所述,写入诊断消息,但退出状态将变为零。

  • 如果选项字符串以 :(冒号)开头,名称 将被设为 ? (问号)字符,这是对未知的选项来说的,或者为缺少的所需选项设为:(冒号)字符,OPTARG 将被设置为已查找到的选项字符,并且 标准错误中将不写入任何输出。

以下任何字符都可以识别选项结尾:特殊选项- -,查找到不以-,或者+为开头的参数,或者遇到错误。

当遇到选项结尾时:

  • getopts 命令将退出运行,并且返回值大于零,OPTARG 将被设置为第一个非选项参数索引,在这种情况下,如果第一个 - - 参数之前未出现其它非选项参数,将认为它是选项参数,或者如果没有非选项参数,设置为值 $#+1,名称将被设置为? (问号)字符,
 4、参数

   选项字符串
包含 getopts 命令识别的选项字符串。如果字符后带有冒号,则预期选项将带有参数,应该以单独参数的形式提供此参数。可以用空格将选项与参数分隔开。如果选项字符是未知的或者选项参数丢失,则选项字符串中的第一个字符将决定 getopts 命令的行为。

注意:应用程序不应该将问号和冒号字符作为选项字符。使用其它非字母数字的字符会产生不明的结果。

名称
由 getopts 命令对查找到的选项字符设置。

参数 ...
一个或多个被空格分隔的字符串,由 getopts 命令校验是否是合法选项。如果省略参数 ,就使用位置参数。有关位置参数的更多信息,请参见 Korn Shell 中的 参数替换。

注意: 一般来说,不必将参数指定为 getopts 命令的一部分,但在进行脚本调试时可能会有所帮助。

 5、退出状态

   此命令返回下列出口值:

       0
查找到由选项字符串指定的或未指定的选项。

       <0
遇到选项结束或发生错误。

二、在shell下使用getopts命令:

  1. 下列 getopts 命令规定 ab 和 c 为有效选项,并且选项 a 和c 带有参数:

    getopts a:bc: OPT
    
  2. 下列 getopts 命令指定 ab 以及c 为有效选项, 并且选项 a 和b 带有参数,而且 getopts 在命令行遇到为定义的选项时,它将OPT 的值设置为 ?:
    getopts :a:b:c OPT
    
  3. 下列脚本分析和显示其参数:
    aflag=
    bflag=
    while getopts ab: name do             case $name in             a)     aflag=1;;            b)     bflag=1                          bval="$OPTARG";;             ?)     printf"Usage: %s: [-a] [-b value] args\n" $0                           exit 2;;          esac done  if [ ! -z "$aflag" ]; then            printf "Option -a specified\ n" fi  if [ ! -z "$bflag" ]; then          printf'Option -b "%s" specified\ n' "$bval" fi  shift $(($OPTIND -1)) printf "Remaining arguments are: %s\n" "$*"
    
  4、在Bash里有以下用途:

    (1). optstring  option 字符串,会逐个匹配
                 (2). varname    每次匹配成功的选项
                 (3). arg        参数列表,没写时它会取命令行参数列表
                 (4). $OPTIND    特殊变量,option index,会逐个递增
                 (5). $OPTARG    特殊变量,option argument,不同情况下有不同的值

         细则1:

     当optstring以”:“开头时,getopts会区分invalid option错误和miss option argument错误。
           invalid option时,varname会被设成?,$OPTARG是出问题的option;
            miss option argument时,varname会被设成:,$OPTARG是出问题的option。
         细则2:

     如果optstring不以”:“开头,invalid option错误和miss option argument错误都会使
          varname被设成?,$OPTARG是出问题的option。
细则3:

当optstring中的字母跟”:“时,表明该option可接参数,参数(argument)放在$OPTARG中;
                    如果缺参数,且optstring是以”:“开头,则varname的值会是:,$OPTARG是该option,
                   否则varname的值是?,$OPTARG是该option。(参照细则1)

5、例子:gg.sh

[root@localhost shel]# cat gg.sh
#gg.sh
#!/bin/bash
while getopts  "abc:def:ghi" flag
do
  echo "$flag" $OPTIND $OPTARG         # 这里$OPTIND 是一个索引序列号,$OPTARG 是选项里所记录的值,无值是为空,默认情况下选项是以空格分隔
done
echo "Resetting"
OPTIND=1    while getopts  "abc:def:ghi" flag
do
  echo "$flag" $OPTIND $OPTARG
done

[root@localhost shel]# ./gg.sh -ab -c foo -f "foo bar" -h -gde
a 1  
b 2
c 4 foo
f 6 foo bar
h 7
g 7
d 7
e 8
Resetting
a 1
b 2
c 4 foo
f 6 foo bar
h 7
g 7
d 7
e 8

上面是显示结果。

如果调整一下所给参数的位置:

[root@localhost shel]# ./gg.sh -abc foo -f "foo bar" -h –gde  a 1
b 1
c 3 foo
f 5 foo bar
h 6
g 6
d 6
e 7
Resetting
a 1
b 1
c 3 foo
f 5 foo bar
h 6
g 6
d 6
e 7

转载于:https://blog.51cto.com/wushank/1169266

linux下的getopts相关推荐

  1. Linux下Shell脚本命令行参数:getopt、getopts用法

    目录 简介 getopt 简介 支持选项 用法 getopt optstring parameters getopt [options] [--] getopt [options] -o|--opti ...

  2. linux 进程 状态 ri,LINUX下解决netstat查看TIME_WAIT状态过多问题(转)

    # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c 16 CLOSING 130 ESTABLISHED 298 FIN_WAIT1 13 FIN_WA ...

  3. linux下开发常用命令

    java开发,由于其很多应用都是发布在Linux操作系统上,因此了解.掌握一些常用的Linux命令对与提高Java开发人员的工作效率是很有必要的.本文着重介绍Java开发相关的一些常用命令,其中以To ...

  4. 过滤Linux下不同大小的文件,linux查找当前目录下 M/G 大小的文件,删除Linux下指定大小的文件

    过滤Linux下不同大小的文件,linux查找当前目录下 M/G 大小的文件,删除Linux下指定大小的文件 find ./ -type f -size +1G| xargs rm 在清理系统日志文件 ...

  5. Linux下创建硬链接,文件访问为空,提示:xxxx: 符号连接的层数过多

    Linux下创建软链接|硬链接,文件访问为空,提示:x x x: 符号连接的层数过多. 原因:创建符号链接的时候未使用绝对路径,无论是源文件路径还是目标路径,都需要使用绝对路径. 如: ln -s / ...

  6. Linux下环境变量配置方法梳理(.bash_profile和.bashrc的区别)

    博客园 首页 新随笔 联系 管理 订阅 <div class="blogStats"><!--done--> 随笔- 556  文章- 38  评论- 77 ...

  7. linux下yum错误:[Errno 14] problem making ssl connection Trying other mirror.

    所有的base 都要取消注释 mirrorlist 加上注释 另外所有的enable都要设为零 目录 今天是要yum命令安装EPEL仓库后 yum install epel-release 突然发现y ...

  8. linux下使用source /etc/profile保存配置后,新的环境变量只能在一个终端里面有效

    博客园 首页 新随笔 联系 管理 订阅 <div class="blogStats"><!--done--> 随笔- 6  文章- 2  评论- 2 < ...

  9. Linux下Flash-LED的处理

    Linux下Flash-LED的处理 一些LED设备提供两种模式-torch和flash.在LED子系统中,LED类(参见Linux下的LED处理)和LED Flash类,分别支持这些模式.torch ...

最新文章

  1. jquery判断方法是否存在_判断图中是否有环的三种方法
  2. 【转】五、谈扩展方法的理解
  3. Android开发之如何保证Service不被杀掉(前台服务)
  4. LeetCode 801. 使序列递增的最小交换次数(动态规划)
  5. 服务器可以修改cookie吗,是否可以为您拥有的网站/服务器设置Cookie?
  6. tts android,Android系统自带的TTS实现语音播报
  7. erlang 读取confg文件异常 could not start kernel pid error in config file
  8. sdut 1500 Message Flood(Trie树)
  9. Linux系统启动过程分析 -转
  10. 测试人员该学习哪些Linux知识
  11. 百度编辑器上传图片配置php,谁配置过百度编辑器ueditor1.4.3的图片上传路径?
  12. c语言中专业英文词汇的意思,c语言常见专业英语词汇
  13. HFSS----微带天线设计实例之模型分析优化
  14. 牛顿插值java_java实现牛顿插值法
  15. mysql超卖问题处理_高并发下超卖问题及如何解决
  16. 2019 徐州 icpc 树状数组套线段树 H - Yuuki and a problem
  17. javacv+远程视频直播+音视频录制+视频抓取
  18. mac环境下搭建hexo+github pages+next个人博客
  19. centOS7,vsftpd,更改默认目录后nginx访问失败,403forbidden解决
  20. 全国大学生计算机设计大赛 南京作品展示,我校学子10件作品在2019中国大学生计算机设计大赛省赛中获奖...

热门文章

  1. 动态使用webservice,以及含有ref类型的参数的问题
  2. JAVA修饰符类型(public,protected,private,friendly)
  3. 行业发展之关于有用信息和无用信息的思考
  4. python提取部分字符串三参数_Python3字符串
  5. SmartNIC/DPU — 基本组成示例
  6. 5G NR — 国内运营商的频段和带宽划分
  7. OpenStack Nova 高性能虚拟机之 CPU 绑定
  8. Powershell指令集_1
  9. Linux_RHEL_设置网络
  10. 电磁干扰滤波器的设计