5

似乎有一些工作正在进行中以在将来添加对此的支持:

https://github.com/fish-shell/fish-shell/issues/478
https://github.com/xiaq/fish-shell/tree/opt-parse

但与此同时,处理此问题的推荐方法是什么?我应该只解析 $argv 吗?如果是这样,您有一些提示/最佳做法吗?

4

3 回答 3

11

解析$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 -hargparse --help.

于 2018-07-22T15:11:57.067 回答
8

我确定这是否是最佳实践,但与此同时您可以执行以下操作:

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
于 2013-05-21T21:37:56.127 回答
3

你可以这样做:

for item in $argv
    switch "$item"
        case -f --foo
        case -b --bar
    end
end

以上不支持在单个参数-fbz、选项值或--foo=baz、负赋值、选项结尾和破折号中编写短选项,并且始终是参数的一部分。--foo bazf 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

请参阅文档

于 2015-01-26T12:10:15.407 回答