函数可以得到空参数吗?

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"