将整个字符串作为参数传递给 fish shell
passing whole strings as arguments in fish shell
在很多情况下,我需要将自由格式(即包含白色 space 和符号以及字母符号)字符串作为参数传递给 fish shell 中的函数。
这是我尝试使用 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'
)而不是整个字符串。我明白为什么会这样,其中字符串被转换为列表并返回列表的第一个元素。
我的问题是 - 在 fish shell 中有解决这个问题的方法吗?我不想只传入 $argv
并自己解析它,除非没有其他选择。
getopts
的使用是可选的,请原谅双关语。
我认为您需要使用双引号:$example == "example text w/ spaces and quotes"
。或者您可能需要转义空格:$example == 'example\ text\ w/\ spaces\ and\ backslashes'
。另外,如果可以参考维基百科,每个变量都是一个数组,因此您可能需要获取数组内容而不是数组中的第一个值,我认为这是正在发生的事情。
编辑:我没有正确阅读问题。无论如何,解决方案几乎相同:
- 引用:
create_a_note -t "my very interesting note" -g "@blah @rhubarb"
- 逃脱”
create_a_note -t my\ very\ interesting\ note -g @blah\ @rhubarb
我的建议是停止使用 getopts
,一个我永远无法正确使用的接口,而是使用 fish 的 built-in 参数解析工具,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.
中有更多信息
在很多情况下,我需要将自由格式(即包含白色 space 和符号以及字母符号)字符串作为参数传递给 fish shell 中的函数。
这是我尝试使用 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'
)而不是整个字符串。我明白为什么会这样,其中字符串被转换为列表并返回列表的第一个元素。
我的问题是 - 在 fish shell 中有解决这个问题的方法吗?我不想只传入 $argv
并自己解析它,除非没有其他选择。
getopts
的使用是可选的,请原谅双关语。
我认为您需要使用双引号:$example == "example text w/ spaces and quotes"
。或者您可能需要转义空格:$example == 'example\ text\ w/\ spaces\ and\ backslashes'
。另外,如果可以参考维基百科,每个变量都是一个数组,因此您可能需要获取数组内容而不是数组中的第一个值,我认为这是正在发生的事情。
编辑:我没有正确阅读问题。无论如何,解决方案几乎相同:
- 引用:
create_a_note -t "my very interesting note" -g "@blah @rhubarb"
- 逃脱”
create_a_note -t my\ very\ interesting\ note -g @blah\ @rhubarb
我的建议是停止使用 getopts
,一个我永远无法正确使用的接口,而是使用 fish 的 built-in 参数解析工具,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.