鱼壳:检查是否为功能提供了参数

use*_*492 23 shell function fish

我正在创建一个函数(下面),您可以使用该函数提供参数,目录.我测试是否$argv是带-d选项的目录,但似乎不起作用,即使没有提供参数,它也总是返回true.我也试过test -n $argv -a -d $argv测试是$argv空的刺,但是返回test: Missing argument at index 1错误.我该如何测试函数是否提供了任何参数?为什么test -d $argv不工作,根据我的理解,当没有提供参数时它应该是假的,因为空字符串不是目录.

function fcd
     if test -d $argv
         open $argv
     else
         open $PWD
     end
 end
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助.

rid*_*ish 31

count是这样做的正确方法.对于检查是否存在任何参数的常见情况,您可以使用其退出状态:

function fcd
    if count $argv > /dev/null
        open $argv
    else
        open $PWD
    end
end
Run Code Online (Sandbox Code Playgroud)

要回答第二个问题,test -d $argv如果$argv为空则返回true ,因为POSIX要求在test传递一个参数时,必须"如果$ 1不为null则退出true(0);否则,返回false".所以当$ argv为空时,test -d $argv意味着test -d必须退出true,因为-d它不是空的!哎呀!

编辑添加了遗漏end,感谢Ismail注意到

  • 上面的代码缺少“end”,我无法编辑,因为它少于最少 6 个字符 - 请更新上面的答案... (2认同)
  • 我对 ` > /dev/null` 感到困惑,所以我找到了一个更冗长但对我来说更具可读性的替代方法:`if test (count $a) -gt 0; ...; 结束` (2认同)

ste*_*vee 22

至少在鱼2.1+中,您可以命名您的参数,然后允许更多的语义代码:

function fcd --argument-names 'filename'
    if test -n "$filename"
        open $filename
    else
        open $PWD
    end
end
Run Code Online (Sandbox Code Playgroud)

  • `-a` 是文档中提到的速记标志:https://fishshell.com/docs/current/commands.html#function (2认同)
  • 调用 `test` 时 $filename 周围的引号很重要。否则:“测试:索引 2 处缺少参数”(如果未提供参数)。 (2认同)

Duk*_*uke 6

if not set -q argv[1]
    echo 'none'
else
    echo 'yes'
end
Run Code Online (Sandbox Code Playgroud)

man set页面:

   set ( -q | --query ) [SCOPE_OPTIONS] VARIABLE_NAMES...
Run Code Online (Sandbox Code Playgroud)

o -q 或 --query 测试是否定义了指定的变量名称。不输出任何内容,但内置退出状态是指定的未定义变量的数量。

  • 太好了,我正在为 if 语句执行“set -q $argv[1]”,结果证明是错误的。我们不需要**扩展**`argv`。谢谢! (3认同)

gle*_*man 5

$argv是一个列表,所以你想查看第一个元素,如果该列表中有元素:

if begin; test (count $argv) -gt 0; and test -d $argv[1]; end
    open $argv[1] 
else
    open $PWD
end
Run Code Online (Sandbox Code Playgroud)