getopts 命令

 一、getopts 简介
         由于shell命令行的灵活性,自己编写代码判断时,复杂度会比较高。使用内部命令 getopts 可以很方便地处理命令行参数。一般格式为:
getopts options variable

  getopts 的设计目标是在循环中运行,每次执行循环,getopts 就检查下一个命令行参数,并判断它是否合法。即检查参数是否以 - 开头,后面跟一个包含在 options 中的字母。如果是,就把匹配的选项字母存在指定的变量 variable 中,并返回退出状态0;如果 - 后面的字母没有包含在 options 中,就在 variable 中存入一个 ,并返回退出状态0;如果命令行中已经没有参数,或者下一个参数不以 - 开头,就返回不为0的退出状态。


bash #!/bin/bash echo "OPTIND starts at $OPTIND" while getopts ":pq:" optname do case "$optname" in "p") echo "Option $optname is specified" ;; "q") echo "Option $optname has value $OPTARG" ;; "?") echo "Unknown option $OPTARG" ;; ":") echo "No argument value for option $OPTARG" ;; *) # Should not occur echo "Unknown error while processing options" ;; esac echo "OPTIND is now $OPTIND" done

在使用getopts命令的时候,shell会自动产生两个变量OPTIND和OPTARG。

OPTIND初始值为1,其含义是下一个待处理的参数的索引。只要存在,getopts命令返回true,所以一般getopts命令使用while循环;

OPTARG是当getopts获取到其期望的参数后存入的位置。而如果不在其期望内,则$optname被设为?并将该意外值存入OPTARG; 如果$optname需要拥有具体设置值而实际却没有,则$optname被设为:并将丢失设置值的optname存入OPTARG;

对于$optname,可以用后标:来表示是否需要值;而前标:则表示是否开启静默模式。

选项字符串最开始的":"是用来去掉来自getopts本身的报错的,同时获取不能识别的选项。
(译注:如果选项字符串不以":"开头,发生错误(非法的选项或者缺少参数)时,
getopts会向错误输出打印错误信息;
如果以":"开头,则不会打印[在man中叫slient error reporting],同时将出错的选项赋给OPTARG变量)

   
   
  1. #!/bin/bash
  2.  
  3. ######################################################################
  4. #This is an example of using getopts in Bash. It also contains some
  5. #other bits of code I find useful.
  6. #Author: Linerd
  7. #Website: http://tuxtweaks.com/
  8. #Copyright 2014
  9. #License: Creative Commons Attribution-ShareAlike 4.0
  10. #http://creativecommons.org/licenses/by-sa/4.0/legalcode
  11. ######################################################################
  12.  
  13. #Set Script Name variable
  14. SCRIPT=`basename ${BASH_SOURCE[0]}`
  15.  
  16. #Initialize variables to default values.
  17. OPT_A=A
  18. OPT_B=B
  19. OPT_C=C
  20. OPT_D=D
  21.  
  22. #Set fonts for Help.[译注: 这里tput用来更改终端文本属性,比如加粗,高亮等]
  23. NORM=`tput sgr0`
  24. BOLD=`tput bold`
  25. REV=`tput smso`
  26.  
  27. #Help function
  28. function HELP {
  29. echo -e \\n"Help documentation for ${BOLD}${SCRIPT}.${NORM}"\\n
  30. echo -e "${REV}Basic usage:${NORM} ${BOLD}$SCRIPT file.ext${NORM}"\\n
  31. echo "Command line switches are optional. The following switches are recognized."
  32. echo "${REV}-a${NORM} --Sets the value for option ${BOLD}a${NORM}. Default is ${BOLD}A${NORM}."
  33. echo "${REV}-b${NORM} --Sets the value for option ${BOLD}b${NORM}. Default is ${BOLD}B${NORM}."
  34. echo "${REV}-c${NORM} --Sets the value for option ${BOLD}c${NORM}. Default is ${BOLD}C${NORM}."
  35. echo "${REV}-d${NORM} --Sets the value for option ${BOLD}d${NORM}. Default is ${BOLD}D${NORM}."
  36. echo -e "${REV}-h${NORM} --Displays this help message. No further functions are performed."\\n
  37. echo -e "Example: ${BOLD}$SCRIPT -a foo -b man -c chu -d bar file.ext${NORM}"\\n
  38. exit 1
  39. }
  40.  
  41. #Check the number of arguments. If none are passed, print help and exit.
  42. NUMARGS=$#
  43. echo -e \\n"Number of arguments: $NUMARGS"
  44. if [ $NUMARGS -eq 0 ]; then
  45. HELP
  46. fi
  47.  
  48. ### Start getopts code ###
  49.  
  50. #Parse command line flags
  51. #如果选项需要后跟参数,在选项后面加":"
  52. #注意"-h"选项后面没有":",因为他不需要参数。
  53. 选项字符串最开始的":"是用来去掉来自getopts本身的报错的,同时获取不能识别的选项。
  54. (译注:如果选项字符串不以":"开头,发生错误(非法的选项或者缺少参数)时,
  55. getopts会向错误输出打印错误信息;
  56. 如果以":"开头,则不会打印[在man中叫slient error reporting],同时将出错的选项赋给OPTARG变量)
  57.  
  58. while getopts :a:b:c:d:h FLAG; do
  59. case $FLAG in
  60. a) #set option "a"
  61. OPT_A=$OPTARG
  62. echo "-a used: $OPTARG"
  63. echo "OPT_A = $OPT_A"
  64. ;;
  65. b) #set option "b"
  66. OPT_B=$OPTARG
  67. echo "-b used: $OPTARG"
  68. echo "OPT_B = $OPT_B"
  69. ;;
  70. c) #set option "c"
  71. OPT_C=$OPTARG
  72. echo "-c used: $OPTARG"
  73. echo "OPT_C = $OPT_C"
  74. ;;
  75. d) #set option "d"
  76. OPT_D=$OPTARG
  77. echo "-d used: $OPTARG"
  78. echo "OPT_D = $OPT_D"
  79. ;;
  80. h) #show help
  81. HELP
  82. ;;
  83. \?) #unrecognized option - show help
  84. echo -e \\n"Option -${BOLD}$OPTARG${NORM} not allowed."
  85. HELP
  86. #在这里如果你不想打印完整的帮助信息,只想显示简单的错误信息,去掉上面的两行,同时使用下面的两行。
  87. #echo -e "Use ${BOLD}$SCRIPT -h${NORM} to see the help documentation."\\n
  88. #exit 2
  89. ;;
  90. esac
  91. done
  92.  
  93. shift $((OPTIND-1)) #This tells getopts to move on to the next argument.
  94. #这一行的作用是将所有命令行参数删除,可以加上这行和去掉这行在之后打印命令行参数看看结果就知道了。
  95. #echo $0 $1 $2 $3 $4 ...
  96.  
  97. ### End getopts code ###
  98.  
  99.  
  100. ### Main loop to process files ###
  101.  
  102. #这里你可以用你的脚本处理逻辑来替代。这个例子只是在终端中打印文件的文件名和后缀名。你可以把任意其他的文件处理任务放到这个while-do循环中。
  103.  
  104. while [ $# -ne 0 ]; do
  105. FILE=$1
  106. TEMPFILE=`basename $FILE`
  107. #TEMPFILE="${FILE##*/}" #另外一种获取不带后缀的文件名的方法。
  108. FILE_BASE=`echo "${TEMPFILE%.*}"` #file without extension
  109. FILE_EXT="${TEMPFILE##*.}" #file extension
  110.  
  111.  
  112. echo -e \\n"Input file is: $FILE"
  113. echo "File withouth extension is: $FILE_BASE"
  114. echo -e "File extension is: $FILE_EXT"\\n
  115. shift #Move on to next input file.
  116. done
  117.  
  118. ### End main loop ###
  119.  
  120. exit 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值