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

简介: 使用getopts处理shell中的输入参数在编写shell脚本中,经常要处理一些输入参数,在上一篇文章中已经有了一个简短的介绍,在使用过程中发现getopts更加方便,能够很好的处理用户输入的参数和参数值。

使用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  --n
执行这个脚本,我们就会得到预期的结果
[root@LovelyLP 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之后,我们可以直接调用,看一下是否达到了我们预期的结果:
[root@LovelyLP shell]# create-apps -a free -t jbsseap -n 
rhc app create -p redhat -a free -t jbsseap -n --no-dns
 
目录
相关文章
|
28天前
|
存储 缓存 Linux
【Shell 命令集合 磁盘维护 】Linux 设置和查看硬盘驱动器参数 hdparm命令使用教程
【Shell 命令集合 磁盘维护 】Linux 设置和查看硬盘驱动器参数 hdparm命令使用教程
35 0
|
4月前
|
机器学习/深度学习 Shell
Shell 传递参数
Shell 传递参数
43 0
|
5月前
|
SQL 分布式计算 Hadoop
55 Hive Shell参数
55 Hive Shell参数
27 0
|
28天前
|
编解码 Linux Shell
【Shell 命令集合 系统设置 】Linux 设置Linux系统的控制台参数和属性setconsole命令 使用指南
【Shell 命令集合 系统设置 】Linux 设置Linux系统的控制台参数和属性setconsole命令 使用指南
33 0
|
28天前
|
存储 Shell Linux
【Shell 命令集合 系统设置 】Linux 将参数作为命令行输入 eval命令 使用指南
【Shell 命令集合 系统设置 】Linux 将参数作为命令行输入 eval命令 使用指南
25 0
|
2月前
|
存储 Shell
Shell变量和参数
Shell变量和参数
16 3
|
4月前
|
存储 Unix Shell
Linux【脚本 04】Shell脚本传递参数的4种方式(位置参数、特殊变量、环境变量和命名参数)实例说明
Linux【脚本 04】Shell脚本传递参数的4种方式(位置参数、特殊变量、环境变量和命名参数)实例说明
173 0
|
4月前
|
Shell
shell变量和参数
shell变量和参数
27 1
|
5月前
|
Unix Shell
shell指定参数名传参
shell指定参数名传参
47 0
|
5月前
|
JavaScript Shell 开发工具
使用 npm 的配置参数 script-shell 来避免 window 执行脚本失败
使用 npm 的配置参数 script-shell 来避免 window 执行脚本失败
29 1