我正在使用向其传递参数的 bash 函数。我想捕获特定选项是否由用户定义-v NUM
或定义--verbosity=NUM
。如果按照描述定义,我想将局部变量设置vb
为NUM
。
答案1
我首先要说的是,如果我们假设目标是接受 GNU 风格的长选项,那么对这样的参数进行盲目扫描将无法找到指定详细程度的所有有效方式。
如果用户传递-xyv3
(与 相同-x
-y
-v
3
)或--output
-v2
(与 相同--output=-v2
,where-v2
是选项的参数--output
)或cmd
-x
--
foo
bar
-v
baz
(where-v
不被视为选项)或--verb=12
(GNU 选项样式解析中支持的缩写)怎么办?getopt
/getopts
可以帮助您正确解析选项。
但是,如果您不关心正确的选项解析,并且可以依赖用户始终像这样传递-v
/--verbosity
选项,而不是将这些字符串作为非选项参数传递,否则,您可以这样做:
extract_verbosity() {
unset -v REPLY
while [ "$#" -gt 0 ]; do
case "$1" in
(-v)
[ "$#" -gt 1 ] || break
shift; REPLY=$1
;;
(--verbosity=*)
REPLY=${1#*=}
esac
shift
done
[ -n "${REPLY+set}" ]
}
然后在你的函数中:
my_function() {
verbosity=0 # default
extract_verbosity "$@" && verbosity=$REPLY
...
}