Bash Shell脚本 – 检查一个标志并获取它的值

我正在试图制作一个shell脚本,它被devise成像这样运行:

script.sh -t application 

首先,在我的脚本中,我想检查脚本是否已经用-t标志运行。 例如,如果它已经没有像这样的标志运行,我想它错误:

 script.sh 

其次,假设有一个-t标志,我想获取值并将其存储在我可以在脚本中使用的variables中,例如:

 FLAG="application" 

到目前为止,我在这方面取得的唯一进展是$ @抓住了所有的命令行参数,但是我不知道这是如何与标志相关的,或者甚至是可能的。

你应该阅读这个getopts教程。

-a开关需要参数的例子:

 #!/bin/bash while getopts ":a:" opt; do case $opt in a) echo "-a was triggered, Parameter: $OPTARG" >&2 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done 

像greybot说的( getopt != getopts ):

除非您知道它是GNU getopt,否则您可以使用外部命令getopt(1),除非您知道它是以GNU特定的方式调用, 并且确保GETOPT_COMPATIBLE不在环境中。 改用getopts(shell builtin),或者简单地遍历位置参数。

使用$#来获取参数的数量,如果它不等于2,则没有提供足够的参数:

 if [ $# -ne 2 ]; then usage; fi 

接下来,检查$1等于-t ,否则使用未知标志:

 if [ "$1" != "-t" ]; then usage; fi 

最后在FLAG存储$2

 FLAG=$2 

注意: usage()是一些显示语法的函数。 例如:

 function usage { cat << EOF Usage: script.sh -t <application> Performs some activity EOF exit 1 } 

尝试shFlags – Unix shell脚本的高级命令行标志库。

http://code.google.com/p/shflags/

这是非常好,非常灵活。

标记types:这是您可以执行的DEFINE _ *的列表。 所有标志都带有一个名称,默认值,帮助string和可选的“简短”名称(单字母名称)。 有些旗子有其他的参数,用旗子来描述。

DEFINE_string:接受任何input,并将其解释为一个string。

DEFINE_boolean:通常不会采用任何参数:say –myflag将FLAGS_myflag设置为true,或者–nomyflag将FLAGS_myflag设置为false。 或者,您可以说–myflag = true或–myflag = t或–myflag = 0或–myflag = false或–myflag = f或–myflag = 1传递选项与传递选项一次。

DEFINE_float:接受一个input并将其解释为一个浮点数。 由于shell不支持浮动本身,所以input仅仅被validation为一个有效的浮点值。

DEFINE_integer:接受一个input并将其解释为一个整数。

特殊标志:有几个标志具有特殊含义:–help(或 – ?)以可读的方式打印所有标志的列表–flagfile = foo从foo读取标志。 (还没有实现) – 和getopt()一样,终止标志处理

示例用法:

 -- begin hello.sh -- ! /bin/sh . ./shflags DEFINE_string name 'world' "somebody's name" n FLAGS "$@" || exit $? eval set -- "${FLAGS_ARGV}" echo "Hello, ${FLAGS_name}." -- end hello.sh -- $ ./hello.sh -n Kate Hello, Kate. 

注意:我从shflags文档中获取了这个文本