似乎有一些工作正在进行中以在将来添加对此的支持:
https://github.com/fish-shell/fish-shell/issues/478
https://github.com/xiaq/fish-shell/tree/opt-parse
但与此同时,处理此问题的推荐方法是什么?我应该只解析 $argv 吗?如果是这样,您有一些提示/最佳做法吗?
似乎有一些工作正在进行中以在将来添加对此的支持:
https://github.com/fish-shell/fish-shell/issues/478
https://github.com/xiaq/fish-shell/tree/opt-parse
但与此同时,处理此问题的推荐方法是什么?我应该只解析 $argv 吗?如果是这样,您有一些提示/最佳做法吗?
解析$argv
适用于基本场景,但否则会变得乏味且容易出错。
在 fish 有自己的参数解析解决方案之前,社区创建了:
从 fish 2.7.0 开始,您可以使用 fish 的内置选项解析器:argparse
function foo --description "Example argparse usage"
set --local options 'h/help' 'n/count=!_validate_int --min 1'
argparse $options -- $argv
if set --query _flag_help
printf "Usage: foo [OPTIONS]\n\n"
printf "Options:\n"
printf " -h/--help Prints help and exits\n"
printf " -n/--count=NUM Count (minimum 1, default 10)"
return 0
end
set --query _flag_count; or set --local _flag_count 10
for i in (seq $_flag_count); echo foo; end
end
要查看可能的全部范围,请运行argparse -h
或argparse --help
.
我确定这是否是最佳实践,但与此同时您可以执行以下操作:
function options
echo $argv | sed 's|--*|\\'\n'|g' | grep -v '^$'
end
function function_with_options
for i in (options $argv)
echo $i | read -l option value
switch $option
case a all
echo all the things
case f force
echo force it
case i ignore
echo ignore the $value
end
end
end
输出:
➤ function_with_options -i thing -a --force
ignore the thing
all the things
force it
你可以这样做:
for item in $argv
switch "$item"
case -f --foo
case -b --bar
end
end
以上不支持在单个参数-fbz
、选项值或--foo=baz
、负赋值、选项结尾和破折号中编写短选项,并且始终是参数的一部分。--foo baz
f baz
--name!=value
--
-
--
为了解决这些问题,我编写了一个getopts函数。
getopts -ab1 --foo=bar baz
现在看看输出。
a
b 1
foo bar
_ baz
左侧的项目代表与 CLI 关联的选项标志或键。右边的项目是选项值。下划线_
字符是没有键的参数的默认键。
用于read(1)
处理生成的流并switch(1)
匹配模式:
getopts -ab1 --foo=bar baz | while read -l key option
switch $key
case _
case a
case b
case foo
end
end
请参阅文档。