您可以采用直截了当的方法,并遍历参数以测试每个参数与给定参数(例如-t
,--therizinosaurus
)的相等性。
把它放到一个函数中:
has_param() {
local term="$1"
shift
for arg; do
if [[ $arg == "$term" ]]; then
return 0
fi
done
return 1
}
…并将其用作测试表达式中的谓词:
if has_param '-t' "$@"; then
echo "yay!"
fi
if ! has_param '-t' "$1" "$2" "$wat"; then
echo "nay..."
fi
如果要拒绝空参数,请在循环体顶部添加一个退出点:
for arg; do
if [[ -z "$arg" ]]; then
return 2
fi
# ...
这是非常易读的,并且不会给您误报,例如模式匹配或正则表达式匹配。
它还允许将标志放置在任意位置,例如,您可以将其放在-h
命令行的末尾(不考虑它的好坏)。
但是,我想得越多,就越让我感到困扰。
使用函数,您可以采用任何实现(例如getopts
)并重用它。封装规则!
但即使有命令,这种力量也可能成为缺陷。如果您将一次又一次地使用它,那么您每次都会解析所有参数。
我倾向于重用,但我必须意识到其中的含义。相反的方法是在脚本顶部解析这些参数一次,就像你害怕的那样,并避免重复解析。
您仍然可以封装该开关盒,它可以根据您的决定而定(您不必列出所有选项)。