getopts 处理shell脚本参数

  1. intruduction

      shell 脚本有二种方法定位脚本参数,一种是使用位置变量,二是使用getopts。使用位置参数有两个限制,他需要编程者自己测试错误并建立相应的消息。若使用shift处理参数,shift命令会删除掉所有的参数,如果你想在以后再次访问他们,将是不可能的。

      getopts是built-in 命令,它可以方便地将命令行位置参数解析为选项并验证选项是否有效。

  2. getopts optstring name [args]

    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也可以达到同样的效果)。

    使用下面的测试用例getopts.sh可以快速验证getopts如何处理错误

    opstring 分别取值":ab:c:"和"ab:c:"

    ./getopts.sh -a -b ok -c no

    ./getopts.sh -a -b

    ./getopts.sh -w

    脚本中通常使用? 捕获错误,name,OPTARG对待错误的取值可以用于自行定义错误消息的输出。

    示例 opstring 错误类型 name OPTARG
    ./getopts.sh
    -a -b
    ":ab:c:" miss
    option argument
    : b
    ./getopts.sh
    -w
    ":ab:c:" illegal options ? w
    ./getopts.sh
    -a -b
    "ab:c:" miss
    option argument
    ? unset
    OPTARG
    ./getopts.sh
    -w
    "ab:c:" illegal options ? unset OPTARG(取消变量)
  3. 特殊说明

    : ? 的特殊用途,故不作为选项字符来使用

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

    opstring 包含一个可以放在一起选项字符串,若选项后带:,代表该选项调用里需要参数,调用这样的选项是不能与其它选项堆叠。

    同一shell 环境多次执行getopts ,OPTIND不会被重置,重新调用参数时,必要时需手动重置OPTIND。

    getopts 找到定义或未定义的选项时,都会返回0(true); 如果处理完参数,或者遇到错误,则返回非0值(false)

  4. eg

cat getopts.sh

#!/bin/bash

#===============================================================================

#

#          FILE:  getopts.sh

#

#         USAGE:  ./getops.sh

#

#   DESCRIPTION_:

#

#       OPTIONS:  ---

#  REQUIREMENTS:  ---

#          BUGS:  ---

#         NOTES:  ---

#        AUTHOR:  Adelphos (), [email protected]

#       COMPANY:

#       VERSION:  1.0

#       CREATED:  11/06/2014 04:15:10 AM EST

#      REVISION:  ---

#===============================================================================

while getopts "ab:c:" opt

do

case ${opt} in

a)        echo -e  " \r

opt:\t         $opt

OPTIND: \t $OPTIND \r

OPTARG:        \t$OPTARG \r

OPTERR: \t $OPTERR"        ;;

b)        echo -e  " \r

opt:\t         $opt

OPTIND: \t $OPTIND \r

OPTARG:        \t$OPTARG \r

OPTERR: \t $OPTERR"        ;;

c)        echo -e  " \r

opt:\t         $opt

OPTIND: \t $OPTIND \r

OPTARG:        \t$OPTARG \r

OPTERR: \t $OPTERR"        ;;

?)  echo "usage:"

echo -e"\t -a specify the installation path"

echo -e"\t -b specify the product type which you want to install, possible choiceis ESE,CONSV,CLENT"

echo -e "\t -c specify the installpackage"

echo-e  " \r

opt:\t         $opt

OPTIND: \t $OPTIND \r

OPTARG:        \t$OPTARG \r

OPTERR: \t $OPTERR"        ;;

esac

done

时间: 2024-10-30 22:29:55

getopts 处理shell脚本参数的相关文章

对于shell脚本参数获取时的一点小技巧

问题如下: 根据脚本参数的个数$#进行一个循环,在依次输出每个参数$1 $2 $3...... 我有一个循环变量i $i 取到这时的i为1,我想使用这个1再去调用$1,也是就是打印出第一个参数 就是$($i)的意思来取到第几个参数,当然$($i)是不好用的 当时纠结了好久,最后上百度提问,两位高手给出了答案: 1) #!/bin/sh NUMBER=$# echo $NUMBER i=1 while [ $i -le $NUMBER ] do a[$i]=$1 #将数组a[i]赋值为$1,即取得

shell脚本接参数优美用法

shell脚本接参数优美用法 学习 bash shell脚本接参数优美用法 2.1 getopt命令的用法 2.2 示例 1. 示例脚本 2. 转载阅读 1. 示例脚本 #!/usr/bin/env bash#Bash脚本接参数优美用法#Create on 2016-11-18#@author: Chinge_Yang args="$*" function usage(){    echo "Usage: `basename $0` options (-h HOST|-n N

shell脚本的入参

shell脚本参数可以任意多,但只有前9个可以被访问,使用shift命令可以改变这个限制.参数从第一个开始,在第九个结束.$0 程序名字$n 第n个参数值,n=1..9 $* 所有命令行参数[email protected]        所有命令行参数,如果它被包含在引号里,形如”[email protected]”,则每个参数也各自被引号包括$# 命令行参数个数 $$ 当前进程的进程ID(PID)$!  最近后台进程的进程ID $?  最近使用命令的退出状态 $$即脚本进程的ID,$?类似于

Java执行shell脚本关闭远程数据库

本实例为用Java执行shell脚本启动或关闭远程Mysql数据库,需求原因:游戏服务器合服后,为了节省内存消耗,需要关闭合服后的服务器不必要的数据库(一台服务器主机存在多个MySql数据库),以提高服务器性能,但有时需要查询历史游戏玩家信息,又需要开启数据库,为了节省运维人员的人力和时间,游戏后台就提供非运维人员都可操作开关数据库的操作. 功能实现步骤: 第一:服务器后台提供参数,发送异步请求,请求方法如下 <script type="text/javascript">

Linux命令参数处理 shell脚本函数getopts

getopts 命令 用途 处理命令行参数,并校验有效选项. 语法 getopts 选项字符串 名称 [ 参数 ...] 描述 getopts 的设计目标是在循环中运行,每次执行循环,getopts 就检查下一个命令行参数,并判断它是否合法.即检查参数是否以 - 开头,后面跟一个包含在 options 中的字母.如果是,就把匹配的选项字母存在指定的变量 variable 中,并返回退出状态0:如果 - 后面的字母没有包含在 options 中,就在 variable 中存入一个 ?,并返回退出状

使用getopts处理shell中的输入参数

在编写shell脚本中,经常要处理一些输入参数,在使用过程中发现getopts更加方便,能够很好的处理用户输入的参数和参数值. getopts用于处理用户输入参数,举例说明使用方法: while getopts :a:b:cdefg opt; do case $opts in a) do sth; ...... cde) do another; esac done 几个重要变量: OPTIND:getopts使用OPTIND作为索引,来处理下一个需要处理的参数,记录当前的状态. OPTARG:在

使用getopts命令解析shell脚本的命令行选项

转自:http://yejinxin.github.io/parse-shell-options-with-getopts-command/ 标准的Unix命令一般都提供很多选项,使用者通过命令行提供具体的选项和参数,格式如下: command -options parameters filename getopts是shell内建的一个命令,它可以帮助我们处理命令行选项,使得我们的脚本也可以与unix命令保持风格一致.getopts的用法格式为: getopts option_string v

Shell脚本的输入参数处理

参数处理-Shell传入参数的处理 1. $# 传递到脚本的参数个数 2. $* 以一个单字符串显示所有向脚本传递的参数.与位置变量不同,此选项参数可超过9个 3.脚本运行的当前进程ID号  4. $! 后台运行的最后一个进程的进程ID号  5. [email protected] 与$#相同,但是使用时加引号,并在引号中返回每个参数  6. $- 显示shell使用的当前选项,与set命令功能相同  7. $? 显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误. 变量含义: $0 

Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件

本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.HashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import