getopts 用法

醉酒当歌 提交于 2020-03-17 02:36:41

参考:https://blog.csdn.net/xluren/article/details/17489667
c语言里面有个getopt_long,可以获取用户在命令下的参数,然后根据参数进行不同的提示或者不同的执行。

[hello@Git shell]$ bash test.sh -a hello
this is -a the arg is ! hello
[hello@Git shell]$ more test.sh 
#!/bin/bash
 
while getopts "a:" opt; do
  case $opt in
    a)
      echo "this is -a the arg is ! $OPTARG" 
      ;;
    \?)
      echo "Invalid option: -$OPTARG" 
      ;;
  esac
done

getopts的使用形式是:getopts option_string variable

getopts一共有两个参数,第一个是-a这样的选项,第二个参数是 hello这样的参数。

选项之间可以通过冒号:进行分隔,也可以直接相连接,:表示选项后面必须带有参数,如果没有可以不加实际值进行传递

例如:getopts ahfvc: option表明选项a、h、f、v可以不加实际值进行传递,而选项c必须取值。使用选项取值时,必须使用变量OPTARG保存该值。

[hello@Git shell]$ bash test.sh -a hello -b
this is -a the arg is ! hello
test.sh: option requires an argument -- b
Invalid option: -
[hello@Git shell]$ bash test.sh -a hello -b hello -c 
this is -a the arg is ! hello
this is -b the arg is ! hello
this is -c the arg is ! 
[hello@Git shell]$ more test.sh 
#!/bin/bash
 
while getopts "a:b:cdef" opt; do
  case $opt in
    a)
      echo "this is -a the arg is ! $OPTARG" 
      ;;
    b)
      echo "this is -b the arg is ! $OPTARG" 
      ;;
    c)
      echo "this is -c the arg is ! $OPTARG" 
      ;;
    \?)
      echo "Invalid option: -$OPTARG" 
      ;;
  esac
done
[hello@Git shell]$

执行结果结合代码显而易见。同样你也会看到有些代码在a的前面也会有冒号,比如下面的
情况一,没有冒号:

[hello@Git shell]$ bash test.sh -a hello
this is -a the arg is ! hello
[hello@Git shell]$ bash test.sh -a
test.sh: option requires an argument -- a
Invalid option: -
[hello@Git shell]$ more test.sh 
#!/bin/bash
 
while getopts "a:" opt; do
  case $opt in
    a)
      echo "this is -a the arg is ! $OPTARG" 
      ;;
    \?)
      echo "Invalid option: -$OPTARG" 
      ;;
  esac
done
[hello@Git shell]$ 

情况二,有冒号:

[hello@Git shell]$ bash test.sh -a hello
this is -a the arg is ! hello
[hello@Git shell]$ bash test.sh -a 
[hello@Git shell]$ more test.sh 
#!/bin/bash
 
while getopts ":a:" opt; do
  case $opt in
    a)
      echo "this is -a the arg is ! $OPTARG" 
      ;;
    \?)
      echo "Invalid option: -$OPTARG" 
      ;;
  esac
done

情况一输入 -a 但是后面没有参数的的时候,会报错误,但是如果像情况二那样就不会报错误了,会被忽略。
getopts option_string variable

当optstring以”:”开头时,getopts会区分invalid option错误和miss option argument错误。

invalid option时,varname会被设成?,$OPTARG是出问题的option;

miss option argument时,varname会被设成:,$OPTARG是出问题的option。

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

参考自:http://xingwang-ye.iteye.com/blog/1601246
二、https://blog.csdn.net/tcx1992/article/details/80664265
2.1 getopts脚本实例
通过例子可以更好地理解getopts。以下getopts脚本接受下列选项或参数。
• a 设置变量ALL为true
• h 设置变量HELP为true

• f 设置变量FILE为true
• v 设置变量VERBOSE为true

对于所有变量设置,一般总假定其初始状态为false:

[sam@chenwy sam]$ ./getopt1 -a -h
ALL is true
HELP is true
[sam@chenwy sam]$ cat getopt1
#!/bin/sh
ALL=false
HELP=false
FILE=false
VERBOSE=false

while getopts ahfgv OPTION
do
case $OPTION in
a)ALL=true
echo "ALL is $ALL"
;;
h)HELP=true
echo "HELP is $HELP"
;;
f)FILE=true
echo "FILE is $FILE"
;;
v)VERBOSE=true
echo "VERBOSE is $VERBOSE"
;;
esac
done

在上述例子中使用脚本:

while getopts ahfgv OPTION

可以看出while循环用于读取命令行,options_string为指定的5个选项(-a,-h,-f,-g,-v),脚本中varible为OPTION。注意这里并没有用连字符指定每一单个选项。
运行上述脚本,给出几个有效和无效的选项,结果为:

[sam@chenwy sam]$ ./getopt1 -a -h
ALL is true
HELP is true
[sam@chenwy sam]$ ./getopt1 -a -h -p
ALL is true
HELP is true
./getopt1: illegal option -- p
[sam@chenwy sam]$ ./getopt1 -p
./getopt1: illegal option -- p

2.3 使用getopts指定变量取值
有时有必要在脚本中指定命令行选项取值。getopts为此提供了一种方式,即在option_string中将一个冒号放在选项后。例如:

getopts ahfvc: OPTION

上面一行脚本指出,选项a、h、f、v可以不加实际值进行传递,而选项c必须取值。使用选项取值时,必须使用变量OPTARG保存该值。如果试图不取值传递此选项,会返回一个错误信息。错误信息提示并不明确,因此可以用自己的反馈信息屏蔽它,方法如下:
将冒号放在option_string开始部分。

while getopts :ahfgvc: OPTION

在case语句里使用?创建一可用语句捕获错误。

[sam@chenwy sam]$ cat getopt1
#!/bin/sh
ALL=false
HELP=false
FILE=false
VERBOSE=false
COPIES=0

while getopts :ahfgvc: OPTION
do
case $OPTION in
a)ALL=true
echo "ALL is $ALL"
;;
h)HELP=true
echo "HELP is $HELP"
;;
f)FILE=true
echo "FILE is $FILE"
;;
v)VERBOSE=true
echo "VERBOSE is $VERBOSE"
;;

c)COPIES=$OPTARG
echo "COPIES is $COPIES"
;;
?)
echo "`basename ` -[a h f v] -[c value] file" 
;;
esac
done

输入所有合法选项:

[sam@chenwy sam]$ ./getopt1 -ah -c 3
ALL is true
HELP is true
COPIES is 3

选项- c不赋值,将返回错误,但显示的是脚本语句中的反馈信息

[sam@chenwy sam]$ ./getopt1 -ah -c
ALL is true
HELP is true
getopt1 -[a h f v] -[c value] file

去掉前面的冒号,提到系统的提示消息

[sam@chenwy sam]$ ./getopt1 -ah -c
ALL is true
HELP is true
./getopt1: option requires an argument -- c
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!