将整个字符串作为参数传递给鱼壳

问题描述

在很多情况下,我需要将自由格式(即包含空格和符号以及字母符号)的字符串作为参数传递给鱼壳中的函数。

这是我尝试使用getopts(无济于事)的示例:

function create_a_note --description 'create a new text note'
    
  set -l title ''
  set -l tags ''

  getopts $argv | while read -l key value
      switch $key
          case t title
              set title $value
          case g tags
              set tags $value
      end
  end

  if test -z $title
    error "title must be set (use the -t option)" >&2
    return 1
  end

  # do something interesting with the title and tags
end

我这样调用它:

create_a_note -t 'my very interesting note' -g '@blah @rhubarb'

每当我使用这种方法时,变量$title$tags都会获得字符串的第一个单词(即$title == 'my'$tags == '@blah'),而不是整个字符串。我知道为什么会这样,将字符串转换为列表,然后返回列表的第一个元素。

我的问题是-鱼壳内是否有解决方法?除非没有其他选择,否则我不想传递$argv自己解析。

使用getopts是可选的,如果您想双关语的话。

解决方法

我的建议是停止使用getopts(我永远无法理解的接口),而转而使用fish内置的参数解析工具argparse

function create_a_note --description 'create a new text note'
    
  set -l title ''
  set -l tags ''
  argparse 't/=+' 'g/=+' -- $argv
                       
  if test -z "$_flag_t"
    echo "title must be set (use the -t option)" >&2
    return 1               
  end                      
                           
  echo $_flag_t; echo $_flag_g
end

特别地,argparse 't/=+' 'g/=+'表示“需要参数的-t选项和需要参数的-g选项”。这些参数分别存储在$_flag_t$_flag_g中。 argparse manual中有更多信息。

,

我认为您需要使用双引号:$example == "example text w/ spaces and quotes"。或者,您可能需要转义空格:$example == 'example\ text\ w/\ spaces\ and\ backslashes'。另外,如果需要使用Wikipedia,则每个变量都是一个数组,因此您可能需要获取数组内容,而不是数组中的第一个值,这是我认为正在发生的事情。

编辑:我没有正确阅读问题。无论如何,解决方案几乎都是相同的:

  • 行情:create_a_note -t "my very interesting note" -g "@blah @rhubarb"
  • 转义” create_a_note -t my\ very\ interesting\ note -g @blah\ @rhubarb

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...