利用getopts处理参数

4年以前  |  阅读数:220 次  |  编程语言:Shell 

使用getopts处理参数虽然是方便,但仍然有小小的局限性:

  • 选项参数的格式必须是-d val,而中间不能有空格,如-dval
  • 所有选项必须写在参数的前面。因为getopts是从命令行前面开始处理,遇到非-开头的参数,或者选项参数结束标记–就中止了,如果中间遇到非选项的命令行参数,后面的选项参数就都取不到了
  • 不支持长选项。如–debug

getops命令可以识别带空格值的选项和参数,并分离选项和参数

# !/bin/bash           

# 使用getopts识别输入选项
while getopts ab:c opt           # 识别选项,赋给变量opt,开始while遍历;字符串ab:c是选项列表,每个字母代表一个选项,带值选项后面有:;不带:的是开关型选项(true/false),不需要指定选项值,cmd命令含有开关型选项就表示true
do
    case "$opt" in                 # 使用case命令,条件匹配变量$opt
    "a")                                   # 若命令行输入-a,则命中
        echo 'Option a'                    # 选项-a的逻辑
        ;;                      
    "b")  
        echo "Option b value : $OPTARG"    # 若命令行输入-b,则命中;通过getopts的环境变量$OPTARG,输出当前-b选项的值
        ;;      
    "c")                                   # 若命令行输入-c,则命中
        echo 'Option c'                    # 选项-c的逻辑
        ;;  
    "*") 
        echo 'unknown option: $opt'        # 如果输入了选项列表之外的选项,输出提示“unknown option :未知选项”
        ;;      
    esac
done
echo "$OPTIND"                             # getopts环境变量$OPTIND,存放当前选项在参数列表中的位置;getopts起始值是1,处理一个开关型选项,OPTIND加1,而处理一个带值选项,OPTIND则会加2

# 完成选项识别后,读取剩余参数
shift $[ $OPTIND - 1]                      # [$OPTIND - 1]表示当前选项的位置参数值,对选项列表进行左移操作;shift左移选项位置后,剩余参数正好到$1位置    

count=1
for param in "$@"                          # 遍历参数列表
do
    echo "param $count : $param"           # 输出参数值     
    count=$[ $count + 1] 
done

执行:

# ./getopts -ac -b "value 123"  "param1 123" param2  # 分离选项和参数
 相关文章:
利用getopts处理参数