Linux-Bash Shell-获取命令行参数

#!/bin/bash

################################################################################
# Author   : Jet Bi
# License  : www.cyeap.com    
# Summary  : Bash Shell获取命令行参数的示例
# Notes    : -
################################################################################

#-------------------------------------------------------------------------------
# 方式一: 直接利用$n(n为1-9)的方式按位置进行获取
#-------------------------------------------------------------------------------
echo "第一个参数:"$1
echo "第二个参数:"$2
echo "第三个参数:"$3

#-------------------------------------------------------------------------------
# 方式二: 使用内置命令getopts获取命名参数
#     语法:
#         getopts optstring varname
#     解析:
#         1.optstring是一个符合规则的字符串,如: 'a:b:cd'
#           这表示可以传4个选项 -a -b -c -d 其中-a, -b选项的:表示是选项后面要有参数的
#         2.varname表示读取到的选项
#         3.特殊变量${OPTARG}能够获取选项后面跟的参数
#         4.特殊变量${OPTIND}反映下一个要处理的参数索引,初始值是1
#     注:
#         1.getopts不支持长选项参数
#         2.对于有参数的选项必须要用空格分隔,如-a arg
#         3.对于没有参数的选项是可以连起来的,如 -bc 等同于 -b -c
#-------------------------------------------------------------------------------
while getopts 'a:bcd:' OPT; do
    case ${OPT} in
      a)
        echo "选项-a已经生效"
        echo "选项-a是可以带参数的,参数值为:"${OPTARG}
        ;;
      b)
        echo "选项-b已经生效"
        echo "选项-b是不需要参数的"
        ;;
      c)
        echo "选项-c已经生效"
        echo "选项-c是不需要参数的"
        ;;
      d)
        echo "选项-d已经生效"
        echo "选项-d是可以带参数的,参数值为:"${OPTARG}
        ;;
      *)
        echo "无效的参数"
        ;;
    esac
done

#-------------------------------------------------------------------------------
# 方式三: 使用外部命令getopt获取命名参数
#     语法
#         getopt [OPTION...] -o 短选项optstring -l 长选项optstring -- parameters
#     解析
#         1.getopt命令的选项说明
#             -a  表示是否支持长选项的简单模式(即以一个 - 接长选项),必须与-l同时用
#             -o  后面接getopt支持短选项列表 
#             -l  后面接getopt支持长选项列表
#         2.optstring是一个符合规则的字符串,如: 'a:,b:,cd::'(短选项)'apple:,banana:,cherry::'(长选项)
#             一个:代表必选参数
#             两个::代表可选参数  
#         3.每解析一个选项,有参数的shift 2 ,没有参数的 shift   
#-------------------------------------------------------------------------------

# 1.使用getopt获取一个解析后的字符串
parse_options=$(getopt -o a,b:,c::,d -l apple,banana:,cherry:: -- $@)

# 2.将传递的参数设置成刚解析的字符串,--代表传递的参数,eval是为了防止有shell关键字和可选参数的的空格识别
eval set -- $parse_options

# 3.遍历参数
while true; do
    case "$1" in
      -a | --apple)
          echo "I have an apple!"
          shift
          ;;
      -b | --banana)
          echo "I have a banana,banana is $2"
          shift 2
          ;;
      -c | --cherry)
          case $2 in
            '')
                echo "I have a cherry!"
                shift 2
                ;;
            *)
                echo "I have a cherry!It is $2"
                shift 2
                ;;
          esac
          ;;
      -d)
          echo "I have a dog!"
          shift
          ;;
      --)
          shift
          break
          ;;
      *)
          echo "Parse Error!"
          exit 1
          ;;
    esac
done
#-------------------------------------------------------------------------------
#getopts和getopt的区别
#
#1.getopts 是Shell内建命令
#  getopt  是一个独立外部工具
#2.getopts 使用语法简单
#  getopt  使用语法复杂
#3.getopts 不支持长选项 
#  getopt  支持长选项
#4.getopts 不会重排所有参数的顺序
#  getopt  会重排参数顺序 
#5.getopts 的Shell内置 OPTARG 这个变量,getopts 通过修改这个变量依次获取参数
#  getopt  必须使用 set 来重新设定位置参数,然后在 getopt 中使用 shift 来依次获取参数
#6.getopts 可以接受参数有空格
#  getopt  只有新版的才可以有空格
#-------------------------------------------------------------------------------

猜你喜欢

转载自www.cnblogs.com/qq1207501666/p/13192660.html