如何解决将整个字符串作为参数传递给鱼壳
在很多情况下,我需要将自由格式(即包含空格和符号以及字母符号)的字符串作为参数传递给鱼壳中的函数。
这是我尝试使用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。