使用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:在上面的循环中,a,b两个参数后面各有一个冒号,冒号表示该输入的参数后面还有一个参数值,当getopts发现冒号后,会处理用户输入的参数值,这个参数值被保存在OPTARG中。

OPTSTRING:也就是上例中的 :a:b:cdefg,getopts需要处理的参数。注意,最前面的冒号“:”用于指定getopts工作于silent mode,在silent模式下,当用户输入的参数不满足OPTSTRING时,不会讲illegal option这样的错误信息打印出来,使代码看起来更加专业。如果想要工作在verbose模式下,可以去掉最前面的冒号

下面,简单的写了一个shell脚本用来描述getopts的使用方法:

#! /bin/bash
function c1() {
cmd="rhc app create -p redhat"
while getopts
:a:t:sn opt;
do
    case $opt
in
        a) cmd=$cmd" -a $OPTARG" ;;
        t) cmd=$cmd" -t $OPTARG" ;;
        s) cmd=$cmd" -s" ;;
        n) cmd=$cmd" -n --no-dns" ;;
        \?) echo
"Invalid param" ;;
    esac
done
echo $cmd
}

c1 -a app1 -t perl-5.10
-s -n

执行这个脚本,我们就会得到预期的结果

[[email protected] shell]# ./getopts-silent.sh 
rhc app create -p redhat
-a app1 -t perl-5.10
-s -n
--no-dns

当然,有些时候,我们更新网将function写入.bashrc中,方便自己随时调用,如果将这段代码直接粘贴到.bashrc中,可能会引起问题:我没有得到预期的结果,脚本中的cmd并没有按照预想的情况得到处理,这是因为什么呢?

原因在于,保存在.bashrc后,第一次执行完成后,下一次在执行时,OPTIND不会重新产生,因为他被作为一个global
variable使用,所以getopts在调用时,他的索引会变得混乱。在脚本中执行没有遇到这个问题的原因也在此,因为脚本每次执行时,都会调用一个
新的shell,所以OPTIND会被设置为1。如果想要他在.bashrc中生效,必须要在最上面加上local OPTIND

让我们来稍微修改一下:

# Create apps
function create-apps() {
    local OPTIND
    cmd="rhc app create -p $OPENSHIFT_PASSWD"
    while getopts a:t:sn x
    do
        case $x
in
            a) cmd=$cmd" -a $OPTARG" ;;
            t) cmd=$cmd" -t $OPTARG" ;;
            s) cmd=$cmd" -s" ;;
            n) cmd=$cmd" -n --no-dns" ;;
            \?) echo Invalid Params ;;
        esac
    done
    echo $cmd
}

source之后,我们可以直接调用,看一下是否达到了我们预期的结果:

[[email protected] shell]# create-apps -a free -t jbsseap -n
rhc app create -p redhat -a free -t jbsseap -n --no-dns

如果还不是很了解,你可以简单的看下这个例子,这个例子是如果传递进来的参数包括f,那么执行对应代码:

while getopts "dfiPRrvW" opt      //赋值给opt
      do
        case $opt in
            f)                       //如果传递进来是f
               exec $realrm "[email protected]"
                ;;
            *)

               # do nothing      //传递其他参数,包括d,i,p,r,v,w
                ;;
        esac
      done
时间: 2024-10-19 23:24:12

使用getopts处理shell中的输入参数的相关文章

Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载

Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数,需要的朋友可以参考下 $#代表了命令行的参数数量,可以看以下实例: 复制代码 代码如下: if [ $# != 1 ] ; then echo "USAGE: $0 TABNAME" echo " e.g.: $0 CDR_CALL_20040701" exit 1; f

Shell脚本的输入参数处理

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

Spring Controller中获取输入参数注解使用

1.处理request的uri部分的参数:@PathVariable. 2.处理request header部分的参数:@RequestHeader,@CookieValue@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上.@CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上. [email protected]注解用来接收地址中的参数,参数的格式是http://*****?uid=111111&u

shell 中命令输入的快!捷!键!

非常棒!! 非常棒!! 删除ctrl + d 删除光标所在位置上的字符相当于VIM里x或者dlctrl + h 删除光标所在位置前的字符相当于VIM里hx或者dhctrl + k 删除光标后面所有字符相当于VIM里d shift+$ctrl + u 删除光标前面所有字符相当于VIM里d shift+^ctrl + w 删除光标前一个单词相当于VIM里dbctrl + y 恢复ctrl+u上次执行时删除的字符ctrl + ? 撤消前一次输入alt + r 撤消前一次动作alt + d 删除光标所在

Shell最多可以输入多少个参数?

在脚本编写过程中,通常会涉及到参数的输入.譬如,sh 1.sh 10 20,在执行1.sh这个脚本中,10即为第一个参数,20即为第二个参数.有时,就会有这个疑惑,即shell脚本最多可以支持多少个变量呢?疑惑之余,编写了如下脚本,可求出Shell脚本中可输入参数的最大个数. 该脚本涉及到三个小脚本:1.sh 2.sh 3.sh --在这里为了方便,脚本名都是极其简单的.总的思路是给定一个特定的值n,作为输入参数的最大个数,然后将1,2,3...n作为脚本的输入参数,这通过脚本2.sh来实现,接

shell中的单引号和双引号的区别

对于常规的字符串定义变量值应添加双引号,并且等号后不能 有空格,需要强引用的,则需要单引号,需要命令引用的使用反引号. 单引号:所见即所得,即输出时会将单引号内的所有内容都原样输出,或者描述为单引号里面看到的什么就输出什么,这成为强引用. 双引号:输出双引号的所有内容:如果内容中有命令(要反引).变量.特殊转义,会先把变量.命令.转义字符解析出结果,然后在输出最终内容,这称为弱引. 反引号:一般用于命令,执行的时候命令会被执行,相当于$(),赋值和输出都要用反引号引起来. [[email pro

Linux shell中getopts命令学习--实现一个添加yum源的脚本

getopts是bash shell的内建命令,作用是在shell脚本中解析命令行传递.传递给函数或传递给另一个调用的shell脚本的位置参数(选项或参数,后面会讲解,getopts只支持短选项,若要解析长选项请参考getopt). getopts命令语法: getopts optstring name [arg] 相关的术语: 选项(option):GNU风格的命令选项,如:-x,-y等减号加上单个字母的为短选项:--help为长选项: 选项的参数:某些选项之后必须尾随参数,如:-f xxx.

getopts 处理shell脚本参数

intruduction shell 脚本有二种方法定位脚本参数,一种是使用位置变量,二是使用getopts.使用位置参数有两个限制,他需要编程者自己测试错误并建立相应的消息.若使用shift处理参数,shift命令会删除掉所有的参数,如果你想在以后再次访问他们,将是不可能的. getopts是built-in 命令,它可以方便地将命令行位置参数解析为选项并验证选项是否有效. getopts optstring name [args] getopts引用的三个环境变量 OPTARG: 上一个由g

学习Shell脚本编程(第3期)_在Shell程序中使用的参数

位置参数 内部参数 如同ls命令可以接受目录等作为它的参数一样,在Shell编程时同样可以使用参数.Shell程序中的参数分为位置参数和内部参数等. 3.1 位置参数 由系统提供的参数称为位置参数.位置参数的值可以用$N得到,N是一个数字,如果为1,即$1.类似C语言中的数组,Linux会把输入的命令字符串分段并给每段进行标号,标号从0开始.第0号为程序名字,从1开始就表示传递给程序的参数.如$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推. 3.2 内部参数 上述过程中的$0是一个