#!/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 "\n"
echo booleans: ${booleans[@]}
echo flags: ${flags[@]}
echo args: ${args[@]}
echo -e "\nBoolean types:\n\tPrecedes Flag(pf): ${booleans[pf]}\n\tFinal Arg(f): ${booleans[f]}\n\tColon Terminated(Ct): ${booleans[Ct]}\n\tNot Mentioned(nm): ${boolean[nm]}"
echo -e "\nFlag: myFlag => ${flags["myFlag"]}"
echo -e "\nArgs: 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
4条答案
按热度按时间o4tp2gmn1#
您应该阅读此getopts教程。
包含需要参数的
-a
开关的示例:就像灰机器人说的:
使用外部命令getopt(1)是不安全的,除非你 * 知道 * 它是GNU getopt,你以GNU特定的方式调用它,* 并且 * 你确保GETOPT_COMPATIBLE不在环境中。使用getopt(shell builtin)代替,或者简单地循环位置参数。
tuwxkamq2#
使用
$#
获取参数的数量,如果它不等于2,则表示提供的参数不足:接下来,检查
$1
是否等于-t
,否则使用未知标志:最后将
$2
存储到FLAG
中:注意:
usage()
是一些显示语法的函数。例如:xwmevbvl3#
下面是一个通用的简单命令参数接口,您可以将其粘贴到所有脚本的顶部。
通过运行以下命令:
输出结果如下:
基本上,参数被分为标志、布尔值和泛型参数。通过这种方式,用户可以把标志和布尔值放在任何地方,只要他/她保持泛型参数(如果有的话)的指定顺序。
让我和现在的你再也不用处理bash参数解析了!
您可以检视更新的指令码here
在过去的一年里,这非常有用,它现在可以通过在变量前面加上一个作用域参数来模拟作用域。
就像这样调用脚本
看起来我没有实现参数范围,不知道为什么我想我还不需要它。
qoefvg9y4#
尝试shFlags --Unix shell脚本的高级命令行标志库。
https://github.com/kward/shflags
非常好,非常灵活。
FLAG TYPES:这是您可以执行的DEFINE_* 的清单。所有的旗标都有名称、预设值、说明字串和选择性的“简短”名称(一个字母的名称)。有些旗标还有其他参数,这些参数会在旗标中说明。
定义字符串:接受任何输入,并将其解释为字符串。
定义布尔值:通常不接受任何参数:比如说--myflag将FLAGS_myflag设置为true,或者--nomyflag将FLAGS_myflag设置为false。或者,你可以说--myflag=true或--myflag=t或--myflag=0或--myflag=false或--myflag=f或--myflag=1传递一个选项与传递一次选项的效果相同。
定义浮点数:接受一个输入,并将其解释为浮点数。由于shell本身不支持浮点数,因此仅验证输入是否为有效的浮点值。
定义整数:接受输入并将其解释为整数。
特殊标志:有几个标志具有特殊含义:--help(或-?)以人类可读的方式打印所有标志的列表--flagfile=foo从foo中读取标志。(尚未实现)--与getopt()中一样,终止标志处理
使用示例:
注意:本文摘自shflags文档