使用getopt
为什么getopt ?
解析详细的命令行参数,以避免混淆,并澄清我们正在解析的选项,以便命令的读者能够理解发生了什么。
什么是getopt?
Getopt用于分解(解析)命令行中的选项,以方便shell过程进行解析,并检查合法选项。它使用GNU getopt(3)例程来做到这一点。
Getopt可以有以下类型的选项。
没有价值的选择
键值对选项
注意:在本文档中,在解释语法时:
在语法/示例中,[]内的任何内容都是可选参数。
<value>是一个占位符,这意味着它应该被一个实际值取代。
如何使用getopt?
语法:First Form
getopt optstring parameters
例子:
# This is correct
getopt "hv:t::" -v 123 -t123
getopt "hv:t::" -v123 -t123 # -v and 123 doesn't have whitespace
# -h takes no value.
getopt "hv:t::" -h -v123
# This is wrong. after -t can't have whitespace.
# Only optional params cannot have whitespace between key and value
getopt "hv:t::" -v 123 -t 123
# Multiple arguments that takes value.
getopt "h:v:t::g::" -h abc -v 123 -t21
# Multiple arguments without value
# All of these are correct
getopt "hvt" -htv
getopt "hvt" -h -t -v
getopt "hvt" -tv -h
这里h,v,t是选项,-h -v -t是命令行中应该给出的选项。
'h'是一个无值选项。
'v:'暗示选项-v具有值和
是强制性选项。':'表示有值。
't::'表示
Option -t有值,但是可选的。'::'表示可选。
在可选参数中,value不能与选项有空格分隔。因此,在“-t123”示例中,-t是选项123是值。
语法:第二形式
getopt [getopt_options] [--] optstring parameters
在getopt被分成五个部分之后
命令本身,即getopt
getopt_options,它描述了如何解析参数。单短线长选项,双短线选项。
——,将getopt_options与您想要解析的选项和允许的短选项分开
短期权,是在发现后立即采取的。就像表单优先语法一样。
参数,这些是你传递到程序中的选项。您想要解析的选项并在它们上设置实际值。
例子
getopt -l "name:,version::,verbose" -- "n:v::V" --name=Karthik -version=5.2 -verbose
语法:第三形式
getopt [getopt_options] -o|--options optstring [getopt_options] [--] [parameters]
在getopt被分成五个部分之后
The command itself i.e. getopt
The getopt_options, it describes how to parse the arguments. single dash long options, double dash options.
The short options i.e. -o or --options. Just like the Form first syntax but with option "-o" and before the "--" (double dash).
--, separates out the getopt_options from the options you want to parse and the allowed short options
The parameters, these are the options that you have passed into the program. The options you want to parse and get the actual values set on them.
例子
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- -name=Karthik -version=5.2 -verbose
GETOPT_OPTIONS
Getopt_options改变命令行参数的解析方式。
下面是一些getopt_选项
选项:-l或——longoptions
意思是getopt命令应该允许多字符选项
认可。多个选项以逗号分隔。
例如,——name=Karthik是在命令行中发送的长选项。在getopt中,长选项的使用类似于
getopt -l "name:,version" -- "" --name=Karthik
由于指定了name:,该选项应该包含一个值
选项:-a或——alternative
意思是getopt命令应该允许长选项有一个破折号
'-'而不是双破折号'——'。
例如,你可以用name=Karthik代替——name=Karthik
getopt -a -l "name:,version" -- "" -name=Karthik
一个完整的脚本示例的代码:
#!/bin/bash
# filename: commandLine.sh
# author: @theBuzzyCoder
showHelp() {
# `cat << EOF` This means that cat should stop reading when EOF is detected
cat << EOF
Usage: ./installer -v <espo-version> [-hrV]
Install Pre-requisites for EspoCRM with docker in Development mode
-h, -help, --help Display help
-v, -espo-version, --espo-version Set and Download specific version of EspoCRM
-r, -rebuild, --rebuild Rebuild php vendor directory using composer and compiled css using grunt
-V, -verbose, --verbose Run script in verbose mode. Will print out each step of execution.
EOF
# EOF is found above and hence cat command stops reading. This is equivalent to echo but much neater when printing out.
}
export version=0
export verbose=0
export rebuilt=0
# $@ is all command line parameters passed to the script.
# -o is for short options like -v
# -l is for long options with double dash like --version
# the comma separates different long options
# -a is for long options with single dash like -version
options=$(getopt -l "help,version:,verbose,rebuild,dryrun" -o "hv:Vrd" -a -- "$@")
# set --:
# If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters
# are set to the arguments, even if some of them begin with a ‘-’.
eval set -- "$options"
while true
do
case "$1" in
-h|--help)
showHelp
exit 0
;;
-v|--version)
shift
export version="$1"
;;
-V|--verbose)
export verbose=1
set -xv # Set xtrace and verbose mode.
;;
-r|--rebuild)
export rebuild=1
;;
--)
shift
break;;
esac
shift
done
运行脚本文件:
# With short options grouped together and long option
# With double dash '--version'
bash commandLine.sh --version=1.0 -rV
# With short options grouped together and long option
# With single dash '-version'
bash commandLine.sh -version=1.0 -rV
# OR with short option that takes value, value separated by whitespace
# by key
bash commandLine.sh -v 1.0 -rV
# OR with short option that takes value, value without whitespace
# separation from key.
bash commandLine.sh -v1.0 -rV
# OR Separating individual short options
bash commandLine.sh -v1.0 -r -V