采用 getopt
为什么要选择?
要解析详细的命令行参数以避免混淆并阐明我们正在解析的选项,以便使命令的读者可以了解正在发生的事情。
什么是getopt?
getopt
用于在命令行中分解(解析)选项,以方便shell过程进行解析,并检查合法选项。它使用GNU getopt(3)
例程执行此操作。
getopt
可以具有以下类型的选项。
- 无价值选择
- 键值对选项
注意:在本文中,在解释语法期间:
- []内的所有内容在语法/示例中均为可选参数。
- 是一个占位符,表示应替换为实际值。
如何使用getopt
?
语法:第一种形式
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 ::'表示选项-t具有值,但是可选的。'::'表示可选。
在可选参数中,值不能与选项分隔。因此,在“ -t123”示例中,-t是选项123的值。
语法:第二种形式
getopt [getopt_options] [--] [optstring] [parameters]
在将getopt分为五个部分之后
- 命令本身即getopt
- getopt_options,它描述了如何解析参数。单破折号长选项,双破折号选项。
- -,将getopt_options与要解析的选项和允许的简短选项分开
- 简短选项-找到后立即采取。就像Form first语法一样。
- 参数,这些是您传递到程序中的选项。您要解析的选项并获取在其上设置的实际值。
例子
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
语法:第三形式
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
在将getopt分为五个部分之后
- 命令本身即getopt
- getopt_options,它描述了如何解析参数。单破折号长选项,双破折号选项。
- 简短选项,即-o或--options。就像Form first语法一样,但选项为“ -o”且在“-”之前(双破折号)。
- -,将getopt_options与要解析的选项和允许的简短选项分开
- 参数,这些是您传递到程序中的选项。您要解析的选项并获取在其上设置的实际值。
例子
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
GETOPT_OPTIONS
getopt_options更改了解析命令行参数的方式。
以下是一些getopt_options
选项:-l或--longoptions
意味着getopt命令应允许识别多字符选项。多个选项用逗号分隔。
例如,--name=Karthik
是在命令行中发送的长选项。在getopt中,长选项的用法就像
getopt "name:,version" "--name=Karthik"
由于指定了name :,因此该选项应包含一个值
选项:-a或--alternative
意味着getopt命令应允许long选项使用单破折号'-'而不是双破折号'-'。
例如,--name=Karthik
您可以只使用-name=Karthik
getopt "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
-s
,请将其设置为位置参数:./myscript 45 anystring
。