一、getopts 简介
  由于shell命令行的灵活性,自己编写代码判断时,复杂度会比较高。使用内部命令 getopts 可以很方便地处理命令行参数。一般格式为:
getopts optstring name [args]
       getopts 的设计目标是在循环中运行,每次执行循环,getopts 就检查下一个命令行参数,并判断它是否合法。即检查参数是否以 - 开头,后面跟一个包含在 options 中的字母。如果是,就把匹配的选项字母存在指定的变量 variable 中,并返回退出状态0;如果 - 后面的字母没有包含在 options 中,就在 variable 中存入一个 ?,并返回退出状态0;如果命令行中已经没有参数,或者下一个参数不以 - 开头,就返回不为0的退出状态。

getopts引用的三个环境变量:

OPTARG: 上一个由getopts内置命令处理的选项参数的值, option argument(存放选项参数),当选项需要选项参数时,getopts 命令就将其置于变量 OPTARG 中

OPTIND:  下一个由getopts内置命令处理的参数的序号,option index,每次调用脚本它都会被初始值为1,会逐次递增。

OPTERR: 如果设为1,bash会显示getopts的错误。设为0,不显示getopts的错误。

getopts 的处理过程:
  调用脚本时,OPTIND为初始化为1。每调用一次getopts,就将下一个选项值赋给name , 选项索引值OPTIND也会指向下一个要处理选项的位置,选项参数则会赋给OPTARG
  getopts 的设计目标是在循环中运行,每执行一次,getopts就检查下一个命令行参数,并判断它是否有效。(即检查参数是否以-开头,后面跟一个包含在opstring中的字母)。
  有效,则把匹配的选项字母存在指定的变量variable中,并返回退出状态0(ture);
  无效(如果-后面的字母没有包含在options),就在 variable 中存入一个?,并返回退出状态0;如果命令行中已经没有参数,或者下一个参数不以-开头,就返回不为0的退出状态(false, 可用于结束while 循环)。
 getopts处理完所有参数后,会返回一个非0值(false,退出循环),此时OPTIND索引值指向第一个非选项的参数[args],name置为?

getopts 错误处理
  正确使用命令时,name用来存储option, $OPTARG用来存放option的参数。若命令输入有误(选项无效,缺少参数),getopts会处理illegal option错误和miss option argument错误。处理结果与opstring是否以:开头而不同。opstring 开头的:用于屏蔽getopts处理时的错误消息(脚本中将OPTERR置于0也可以达到同样的效果)。

[python@master tmp]$ more getopts.sh
#!/bin/bash
while getopts u:p:n option
do
case "$option" in
u)
echo "option:u, value $OPTARG"
echo "next arg index:$OPTIND";;
p)
echo "option:p"
passwd=$OPTARG
echo "next arg index:$OPTIND"
echo "PASSWD IS: $passwd";;
n)
echo "option:N"
echo "next arg index:$OPTIND";;
\?)
echo "Usage: args [-U] [-p] [-n]"
echo "-u means uses"
echo "-p means passwd"
echo "-n means name"
exit ;;
esac
done

运行:

[python@master tmp]$ sh getopts.sh -u root -p root_123 -n zhangwei
option:u, value root
next arg index:
option:p
next arg index:
PASSWD IS: root_123
option:N
next arg index:

注:

1.getopts 允许把选项堆叠在一起(如 -ms)

2.如要带参数,须在对应选项后加 :(如h后需加参数 h:ms)。此时选项和参数之间至少有一个空白字符分隔,这样的选项不能堆叠。

3.如果在需要参数的选项之后没有找到参数,它就在给定的变量中存入 ? ,并向标准错误中写入错误消息。否则将实际参数写入特殊变量 :OPTARG

4.另外一个特殊变量:OPTIND,反映下一个要处理的参数索引,初值是 1,每次执行 getopts 时都会更新。

shell中处理参数getopts命令的更多相关文章

  1. shell中的内建命令, 函数和外部命令

    转自shell中的内建命令, 函数和外部命令 Shell识别三种基本命令:内建命令.Shell函数以及外部命令: (1)内建命令就是由Shell本身所执行的命令.    有些命令是由于其必要性才内建的 ...

  2. adb shell中的am pm命令

    adb shell中的am pm命令,一些自己的见解和大多数官网的翻译. am命令 am全称activity manager,你能使用am去模拟各种系统的行为,例如去启动一个activity,强制停止 ...

  3. 【转】shell中的内建命令, 函数和外部命令

    原文:http://www.cnblogs.com/xkfz007/archive/2011/10/13/2209571.html linux命令有内部命令和外部命令之分.内部命令实际上是shell程 ...

  4. shell 中如何判断前一个命令是否执行成功

    shell 中如何判断前一个命令是否执行成功 通过判断返回值来解决: if [ $? -eq 0 ];then 命令正确的分支 else   命令失败的分支 fi

  5. c获取shell中的参数

    问题背景 在Linux中我们会使用到shell,来完成输入参数的获取,就如同下面的形式,这种形式在进行多语言编程和调用有着非常重要的作用 一.传递的过程 1.1 原理模型如下: 1.1.1 可执行sh ...

  6. shell 中 exec 和 source 命令解析

    文章大部分来源于:http://www.cnblogs.com/zhaoyl/archive/2012/07/07/2580749.html 作为笔记留存博客备忘. exec和source都属于bas ...

  7. Linux shell中一些参数与变量简介

    linux中shell变量$#,$@,$0,$1,$2,$!,$$,$*,$-,$@......等很多个,很容易记错,这里再次整理一下,相关含义解释如下,并附上一个实践截图. 多看几次,多用几次,应该 ...

  8. shell中bash的常见命令

    shell 在计算机科学中,Shell俗称壳,用来区别Kernel(核) Shell分类:1:图形界面shell:通过提供友好的可视化界面,调用相应应用程序,如windows系列操作系统,Linux系 ...

  9. shell 创建带参数的命令方法

    主要用到case in,和shift命令. shift 命令是从参数数组中,删除当前第一个参数. while [ "$1" != "" ] do case $1 ...

随机推荐

  1. 014-数据结构-树形结构-基数树、Patricia树、默克尔树、梅克尔帕特里夏树( Merkle Patricia Tree, MPT)

    一.基数树 Radix树,即基数树,也称压缩前缀树,是一种提供key-value存储查找的数据结构.与Trie不同的是,它对Trie树进行了空间优化,只有一个子节点的中间节点将被压缩.同样的,Radi ...

  2. baidu echats简介

    http://note.youdao.com/noteshare?id=ef467acdbe5b84005a1315d77a4475d1

  3. 四、VSCode调试vue项目

    1.先决条件设置 你必须安装好 Chrome 和 VS Code.同时请确保自己在 VS Code 中安装了 Debugger for Chrome 扩展的最新版本. 在可以从 VS Code 调试你 ...

  4. Linux服务器上安装openoffice,以及安装字体文件

    1.安装openoffice (1)将openoffice的linux安装包放到linux指定的文件下(一般放在opt下) (2)在安装包的目录下执行命令:tar -zxvf 对应的压缩包名字 (3) ...

  5. VMware 虚拟机安装Mac OS X 10.10

    有图有真相,哈哈 一.下载以上文件 1. vm百度软件下载即可,版本都能满足需要,随意好了 2. unlocker 207 3. Mac OS X 10.10镜像 二.基本步骤 1. 虚拟机的安装 下 ...

  6. 【VS开发】socket编程原理

    socket编程原理 1.问题的引入 1) 普通的I/O操作过程: UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-rea ...

  7. Job的运行过程

    Job的运行过程 Job的具体运行过程 a) 运行mapred程序 b) 本次运行将生成一个Job,于是JobClient向JobTracker(ResourceManager)申请一个JobId以标 ...

  8. git 命令 git diff 查看 Git 区域文件的具体改动

    查看 Git 区域文件的具体改动 git diff git status 只能让我们知道文件在 Git 区域内的改动状态,但如果我们想查看某个文件内具体改了什么(也可以理解为在不同 Git 区域中的差 ...

  9. sql server存储引擎启动错误(SQL Server could not spawn FRunCM thread)

    错误信息: 中文版: 服务器无法在 'any' <ipv4> 1433 上侦听.错误: 0x277a.若要继续,请通知您的系统管理员. TDSSNIClient 初始化失败,出现错误 0x ...

  10. Git基本理解

    1.版本控制 Git 是一个分布式版本控制系统 (Distributed Version Control System - DVCS). 所谓版本控制,意思就是在文件的修改历程中保留修改历史,让你可以 ...