shell脚本中getopts的使用

      在shell中,getopts用于解析命令选项和参数。getopts是Bash shell的内置命令,不支持长选项,仅解析短选项,即一个破折号("-")和一个字母或数字,如-1,-e, -E等。
      getopts格式如下:

getopts OptString Name [Arg ...]

      1.getopts命令后面的字符串如":a:c:Fg:"就是可以使用的选项列表即OptString,每个字符代表一个选项,后面带冒号(:)的意味着选项除了定义本身之外,还会带上一个参数作为选项的值。
      2.每次调用getopts命令时,它都会查找OptString中定义的一个选项。如果找到,它会将此选项字符放入名为Name的变量中。如果选项与OptString中定义的选项不匹配,则getopts将变量Name设置为问号("?").如果该选项需要一个参数,getopts会获取该参数,并将其存放于$OPTARG中。如果未找到所需的参数,则变量Name将设置为冒号
      3.两个预先定义的变量:
      (1).OPTARG:用来获取当前选项的参数值;
      (2).OPTIND:代表当前选项在选项列表中的索引位置;当shell脚本启动时,OPTIND的值为1;处理一个开关型选项,OPTIND加1;处理一个带参数的选项,OPTIND会加2。
      4.如果OptString中第一个字符是冒号,getopts使用静默错误报告(getopts uses silent error reporting),在此模式下,不会打印任何错误消息;如果第一个字符不是冒号,如果命令行中包含了没有在getopts列表中的选项,会有警告信息,类似illegal option -- x;
      5.字符后面带冒号(:),表示该选项应该有一个参数,在命令行中用空格与其分开(或紧挨着)若字符后面没有冒号,表示不需要参数
      6.getopts处理父命令(parent command)的位置参数,在bash中,它存储在shell变量"$@"中。
      7.两个破折号("--")的特殊选项被getopts解释为选项的结尾
      8.getopts设计为在脚本中多次运行,例如循环运行。它每次循环迭代处理一个选项。当没有更多选项需要处理时,getopts返回false,这会自动终止while循环。因此,getopts经常和while一起使用。

      测试代码如下:

#! /bin/bash

author=""
addr_csdn=""
addr_github=""

echo "all parameters: $@"

OptString=":a:c:Fg:"
while getopts ${OptString} name; do
#while getopts "a:c:Fg:" name; do
    case "$name" in
        "a")
            echo "option: $name, value is: $OPTARG, index is: $OPTIND"
            author=$OPTARG ;;
        "c")
            echo "option: $name, value is: $OPTARG, index is: $OPTIND"
            addr_csdn=$OPTARG ;;
        "g")
            echo "option: $name, value is: $OPTARG, index is: $OPTIND"
            addr_github=$OPTARG ;;
        "F")
            echo "option: $name, shell script name: $0, index is: $OPTIND" ;;
        ":")
            echo "Error: missing parameter value: ${OptString}, index is: $OPTIND"
            exit 1 ;;
        "?")
            echo "Error: unknown option: ${OptString}, index is: $OPTIND"
            exit 1 ;;
        "*") # exit abnormally
            echo "** abort **"
            exit 1 ;;
    esac
done

if [ ! -z ${author} ]; then
    echo "author: ${author}"
fi

if [ ! -z ${addr_csdn} ]; then
    echo "csdn addr: ${addr_csdn}"
fi

if [ ! -z ${addr_github} ]; then
    echo "github addr: ${addr_github}"
fi

echo "processed parameters OPTIND: $OPTIND"

echo "remove processed parameters"
# shift is a bash built-in which kind of removes arguments from the beginning of the argument list
shift $((OPTIND-1))

echo "remaining parameters: $@"
echo "test finish"

      在windows和linux上执行结果相同,如下:

shell脚本中getopts的使用_第1张图片

      GitHub:https://github.com/fengbingchun/Linux_Code_Test

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