我的代码
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
答案 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"