函数可以得到空参数吗?
Can function get empty arguments?
我的代码
function foo
argparse -n foo 'u/user=' 'g/group=' 's/shell=' -- $argv
bar $_flag_u $_flag_g $_flag_s
end
function bar -a user group shell
echo $user
echo $group
echo $shell
end
foo $argv
执行和结果
> fish test.fish -u user_name -g group_name -s shell_name
user_name
group_name
shell_name
> fish test.fish -g group_name -s shell_name
group_name
shell_name
> fish test.fish -u user_name -s shell_name
user_name
shell_name
>
我要的期待
> fish test.fish -u user_name -g group_name -s shell_name
user_name
group_name
shell_name
> fish test.fish -g group_name -s shell_name
group_name
shell_name
> fish test.fish -u user_name -s shell_name
user_name
shell_name
>
能达到预期吗?
如果不使用 -u 选项,我的预期是 bar 函数中的 $user 为空。
(意思是"echo $status"的结果在"set -q user"之后是1)
如果我别无选择,我会这样做:
(参考:https://github.com/fish-shell/fish-shell/issues/3926)
function foo
argparse -n foo 'u/user=' 'g/group=' 's/shell=' -- $argv
set -q _flag_u; or set _flag_u ''
set -q _flag_g; or set _flag_g ''
set -q _flag_s; or set _flag_s ''
bar $_flag_u $_flag_g $_flag_s
end
function bar -a user group shell
if test -n $user
# do something
end
if test -n $group
# do something
end
if test -n $shell
# do something
end
end
foo $argv
您的问题是:
function bar -a user group shell
这意味着 bar 调用它的第一个参数 "user"、第二个 "group" 和第三个 "shell"。
当你 运行
bar $u $g $s
fish 扩展了变量。如果它们被设置,它们将扩展到与它们有元素一样多的参数(在 fish 中,所有变量都是列表!)。
因此,您会将 $u 放入 $user,将 $g 放入 $group,将 $s 放入 $shell.
但是,如果未设置一个(因为在调用 foo
时未给出选项),则该变量将扩展为空,因此如果例如--group
没有给出,这就像
bar $u $s
这会将 $u 的内容分配给 $user,将 $s 的内容分配给 $group - 因为它是 bar 看到的第二个参数。
要禁止这种情况,请使用 set -q
或双引号变量:
bar "$_flag_u" "$_flag_g" "$_flag_s"
我的代码
function foo
argparse -n foo 'u/user=' 'g/group=' 's/shell=' -- $argv
bar $_flag_u $_flag_g $_flag_s
end
function bar -a user group shell
echo $user
echo $group
echo $shell
end
foo $argv
执行和结果
> fish test.fish -u user_name -g group_name -s shell_name
user_name
group_name
shell_name
> fish test.fish -g group_name -s shell_name
group_name
shell_name
> fish test.fish -u user_name -s shell_name
user_name
shell_name
>
我要的期待
> fish test.fish -u user_name -g group_name -s shell_name
user_name
group_name
shell_name
> fish test.fish -g group_name -s shell_name
group_name
shell_name
> fish test.fish -u user_name -s shell_name
user_name
shell_name
>
能达到预期吗?
如果不使用 -u 选项,我的预期是 bar 函数中的 $user 为空。
(意思是"echo $status"的结果在"set -q user"之后是1)
如果我别无选择,我会这样做:
(参考:https://github.com/fish-shell/fish-shell/issues/3926)
function foo
argparse -n foo 'u/user=' 'g/group=' 's/shell=' -- $argv
set -q _flag_u; or set _flag_u ''
set -q _flag_g; or set _flag_g ''
set -q _flag_s; or set _flag_s ''
bar $_flag_u $_flag_g $_flag_s
end
function bar -a user group shell
if test -n $user
# do something
end
if test -n $group
# do something
end
if test -n $shell
# do something
end
end
foo $argv
您的问题是:
function bar -a user group shell
这意味着 bar 调用它的第一个参数 "user"、第二个 "group" 和第三个 "shell"。
当你 运行
bar $u $g $s
fish 扩展了变量。如果它们被设置,它们将扩展到与它们有元素一样多的参数(在 fish 中,所有变量都是列表!)。
因此,您会将 $u 放入 $user,将 $g 放入 $group,将 $s 放入 $shell.
但是,如果未设置一个(因为在调用 foo
时未给出选项),则该变量将扩展为空,因此如果例如--group
没有给出,这就像
bar $u $s
这会将 $u 的内容分配给 $user,将 $s 的内容分配给 $group - 因为它是 bar 看到的第二个参数。
要禁止这种情况,请使用 set -q
或双引号变量:
bar "$_flag_u" "$_flag_g" "$_flag_s"