函数可以获取空参数吗?

时间:2018-08-26 11:45:23

标签: fish

我的代码

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

1 个答案:

答案 0 :(得分:2)

您的问题是这个

function bar -a user group shell

这意味着bar将其第一个参数称为“用户”,第二个“组”和第三个“外壳”。

随后运行时

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"