Fish shell: 检查是否为函数提供了参数

Fish shell: Check if argument is provided for function

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

function fcd
     if test -d $argv
         open $argv
     else
         open $PWD
     end
 end

感谢您的帮助。

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

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

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

function fcd
    if count $argv > /dev/null
        open $argv
    else
        open $PWD
    end
end

回答你的第二个问题,如果 $argv 为空,test -d $argv returns 为真,因为 POSIX 要求当 test 传递一个参数时,它必须 "Exit true (0) if is not null; otherwise, exit false"。所以当 $argv 为空时,test -d $argv 意味着 test -d 必须退出 true 因为 -d 不为空!啊!

编辑 添加了一个遗漏的 end,感谢 Ismail 的关注

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

function fcd --argument-names 'filename'
    if test -n "$filename"
        open $filename
    else
        open $PWD
    end
end

可能不相关,但我想为这个问题添加另一个角度。

我想将洞察力扩大到更广泛的范围,即使用 fisherman 组开发的库测试 shell 代码的范围。

使用 mock 您可以检查打开命令是否安全无副作用地调用。

示例:

function fcd
    if count $argv > /dev/null
        open $argv
    else
        open $PWD
    end
end
mock open 0 "echo $args"
fcd "cool" # echoes cool
mock open 0 "echo $args"
fcd # echoes $PWD

是最近的图书馆,但它可以帮助测试可能有危险的东西,例如 rm

mock rm 0 "echo nothing would happen on $args"
rm "some file" # simply echoes the message with a list of the files that would been affected

希望能给出更开箱即用的观点

P.S.: 很抱歉公然宣传,但我认为这是一个很酷的想法,很高兴被 shell 脚本编写者采纳,以测试和增加 [=32] 的可持续性=] 脚本是疯了。 :P

编辑:我最近注意到有关我发布的示例的错误。请不要使用 rm *,因为星号不被视为参数,fish shell 将星号扩展到找到的文件列表并且该命令仅模拟第一个调用,这意味着第一个文件将被忽略通过模拟,但所有后续文件都将被 擦除 因此,如果尝试示例并使用单个文件而不是通配符,请小心。

if not set -q argv[1]
    echo 'none'
else
    echo 'yes'
end

来自 man set 页面:

   set ( -q | --query ) [SCOPE_OPTIONS] VARIABLE_NAMES...

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