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文档中获取了这个文本