Linux: getopts 命令

功能

功能主要是用来处理命令行选项和参数。
它的优势在于:

  • 不需要通过外部程序来处理位置参数
  • 可以很容易的设置你可以用来解析Shell的变量
  • 定义在POSIX

通常情况下,在处理命令行参数是需用用到循环,多次调用getopts。当没有内容可解析的时候,getopts会设置一个退出状态FALSE。

getopts用到的变量

  • OPTIND:
    • 存放一个要处理的参数的索引
  • OPTARG:
    • 这个变量被设置为由getopts找到的选项的参数
  • OPTERR:
    • 它的值为0或1.指示Bash是否应该显示由getopts产生的错误信息

基本的语法:

getopts OPTSTRING VARNAME [ARGS...]
  • OPTSTRING:
    • 告诉getopts会有哪些选项和哪会有参数(用选项后加”:”表示)
  • VARNAME:
    • 告诉getopts哪个变量用于选项报告
      *ARGS:
    • 告诉getopts解析这些可选的参数,而不是参数位置

Example

getopts fA:x VARNAME
#告诉getopts查找-f,-A,-x选项,-A选项后面会有一个参数

错误报告模式

详细错误报告模式

在详细错误报告模式下,getopts遇到一个无效的选项,VARNAME的值会被设置为”?”,并且变量OPTARGS不会被设置;如果遇到一个参数没有找到,VARNAME的值同样会被设置为”?”,变量OPTARGS不会被设置,并且会打印一个错误信息。

抑制错误报告模式

在抑制错误报告模式下,getopts遇到一个无效的选项,VARNAME的值会被设置为”?”,并且变量OPTARGS会被设置为选项字符;如果遇到一个参数没有找到,VARNAME的值同样会被设置为”:”,变量OPTARGS中会包含选项字符。

实例

#!/bin/bash 
vflag=off
filename=""
output=""
function usage(){
    echo "USAGE"
    echo "myscript [-h] [-v] [-f <filename>] [-o <filename>]"
    exit -1
}

while getopts :hvf:o: opt
do
    case "$opt" in
    v)
        vflag=on
    ;;
    f)
        if [ ! -f $filename ]
        then
            echo "The source file $filename doesn't exist!"
            exit
        fi
    ;;
    o)
        if [ ! -d $output ] 
        then
            echo "The output path 'dirname $output doesn't exist"
            exit
        fi
    ;;
    h)
        usage
        exit
    ;;
    :)
        echo "The option -$OPTARG requires an argument"
        exit 1
    ;;
    ?)
        echo "Invalid option: -$OPTARG"
        usage
    ;;
    esac
done

运行结果

bigship@bigship-virtual-machine:~/shell_learning/shift$ ./getopts2 -h
USAGE
myscript [-h] [-v] [-f <filename>] [-o <filename>]
bigship@bigship-virtual-machine:~/shell_learning/shift$ ./getopts2 -vf
The option -f requires an argument
bigship@bigship-virtual-machine:~/shell_learning/shift$ ./getopts2 -vf /etc/passwd -o /tmp/output.log
bigship@bigship-virtual-machine:~/shell_learning/shift$ 

你可能感兴趣的:(linux,getopts)