Bash Shell脚本 - 检查标志并获取其值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bash Shell脚本 - 检查标志并获取其值相关的知识,希望对你有一定的参考价值。
我正在尝试创建一个shell脚本,其设计如下:
script.sh -t application
首先,在我的脚本中,我想检查脚本是否已使用-t标志运行。例如,如果它没有像这样的标志运行我想让它出错:
script.sh
其次,假设有一个-t标志,我想获取该值并将其存储在我可以在我的脚本中使用的变量中,例如:
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
):
外部命令getopt(1)永远不会安全使用,除非你知道它是GNU getopt,你以GNU特定的方式调用它,并确保GETOPT_COMPATIBLE不在环境中。改为使用getopts(shell builtin),或简单地循环遍历位置参数。
使用$#
获取参数的数量,如果它不等于2,则提供的参数不足:
if [ $# -ne 2 ]; then
usage;
fi
接下来,检查$1
是否等于-t
,否则使用未知标志:
if [ "$1" != "-t" ]; then
usage;
fi
最后在$2
存储FLAG
:
FLAG=$2
注意:usage()
是一些显示语法的函数。例如:
function usage {
cat << EOF
Usage: script.sh -t <application>
Performs some activity
EOF
exit 1
}
这是一个通用的简单命令参数接口,您可以将其粘贴到所有脚本的顶部。
#!/bin/bash
declare -A flags
declare -A booleans
args=()
while [ "$1" ];
do
arg=$1
if [ "${1:0:1}" == "-" ]
then
shift
rev=$(echo "$arg" | rev)
if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "${rev:0:1}" == ":" ]
then
bool=$(echo ${arg:1} | sed s/://g)
booleans[$bool]=true
echo "$bool" is boolean
else
value=$1
flags[${arg:1}]=$value
shift
echo "$arg" is flag with value "$value"
fi
else
args+=("$arg")
shift
echo "$arg" is an arg
fi
done
echo -e "
"
echo booleans: ${booleans[@]}
echo flags: ${flags[@]}
echo args: ${args[@]}
echo -e "
Boolean types:
Precedes Flag(pf): ${booleans[pf]}
Final Arg(f): ${booleans[f]}
Colon Terminated(Ct): ${booleans[Ct]}
Not Mentioned(nm): ${boolean[nm]}"
echo -e "
Flag: myFlag => ${flags["myFlag"]}"
echo -e "
Args: one: ${args[0]}, two: ${args[1]}, three: ${args[2]}"
通过运行命令:
bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f
输出将是这样的:
"firstArg" is an arg
"pf" is boolean
"-myFlag" is flag with value "my flag value"
"secondArg" is an arg
"Ct" is boolean
"thirdArg" is an arg
"f" is boolean
booleans: true true true
flags: my flag value
args: firstArg secondArg thirdArg
Boolean types:
Precedes Flag(pf): true
Final Arg(f): true
Colon Terminated(Ct): true
Not Mentioned(nm):
Flag: myFlag => my flag value
Args: one => firstArg, two => secondArg, three => thirdArg
基本上,参数被分为标志布尔和泛型参数。通过这样做,用户可以将标志和布尔值放在任何地方,只要他/她按指定的顺序保留通用参数(如果有的话)。
允许我,现在你再也不用处理bash参数解析了!
尝试使用shFlags - Unix shell脚本的高级命令行标志库。
http://code.google.com/p/shflags/
它非常好,非常灵活。
标记类型:这是您可以执行的DEFINE _ *的列表。所有标志都采用名称,默认值,帮助字符串和可选的“短名称”(单字母名称)。有些标志有其他参数,用标志描述。
DEFINE_string:接受任何输入,并将其表示为字符串。
DEFINE_boolean:通常不接受任何参数:例如--myflag将FLAGS_myflag设置为true,或者--nomyflag将FLAGS_myflag设置为false。或者,您可以说--myflag = true或--myflag = t或--myflag = 0或--myflag = false或--myflag = f或--myflag = 1传递选项与传递选项具有相同的效果选项一次。
DEFINE_float:接受输入并将其表示为浮点数。由于shell本身不支持浮点数,因此输入仅被验证为有效的浮点值。
DEFINE_integer:接受输入并将其表示为整数。
特殊标志:有一些标志具有特殊含义: - 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文档中获取了这个文本
以上是关于Bash Shell脚本 - 检查标志并获取其值的主要内容,如果未能解决你的问题,请参考以下文章
如何从 shell/shell 脚本获取 sqlplus 命令的输出状态?
打开终端并运行 shell 脚本(CentOS)后出现 Bash 错误 [重复]
sh Bash shell脚本,用于检查本地Vault服务器的密封状态,并尝试使用保管库保密库中的密钥进行密封。支持HA Va