如何定义一个接受参数或不参与的函数?

时间:2018-02-23 02:08:22

标签: fish

我正在使用Fish shell .... 基本上,做这样的事情:

if (first argument == --r) {
  do something
} else {
  Do something
  if (first argument == --n) {
    do more 
  }
}

为了实现我尝试的第一个if语句:

 if test (count $argv) -eq 1 -a $argv[1] = '--r'

但是这给了一个信息: test:缺少索引6处的参数

4 个答案:

答案 0 :(得分:2)

Fish中的函数不需要在定义函数时指定其参数。用户发送给函数的任何参数都会自动存储在名为argv的数组中。为了确定是否发送了参数,您可以计算数组中的元素数,或者将数组的长度确定为字符串。我做后者:

    function my_func
        if [ -z "$argv" ]; # No arguments
            echo "No arguments supplied"
            return
        else # At least one argument
            if [ "$argv[1]" = "--r" ];
                echo "Excellent!"
                return
            end
        end
    end

如果您更喜欢使用count,那么它看起来会更像这样:

    function my_func
        if [ (count $argv) -eq 1 -a "$argv[1]" = "--r" ];
            # Exactly one argument with specified value "--r"
            echo "Excellent!"
            return
        else # May have arguments, but none equal to "--r"
            echo "Give me the right arguments"
            return
        end
    end

您对set -q argv[1]的使用也是一个不错的选择。但是,当您检查字符串相等性时,请不要忘记用引号括起变量,例如:test "$argv[1]" = "--r"

这是另一种方法,使用switch...case条件测试:

    function my_func
        # No arguments
        if [ -z "$argv" ]; and return

        # At least one argument
        switch $argv[1];
            case --r;
                # do some stuff
                return
            case "*";
                # Any other arguments passed
                return
            end
        end
    end

答案 1 :(得分:0)

这对我有用:

if set -q argv[1] ;and test $argv[1] = "--r"

答案 2 :(得分:0)

让我们从执行此操作时出现的错误开始:

if test (count $argv) -eq 1 -a $argv[1] = '--r'

这是因为鱼首先展开$argv[1]然后执行test。如果argv没有值,则该语句变为

if test 0 -eq 1 -a  = '--r'

test命令的有效语法是什么。由于test在评估之前解析整个表达式,因此第一个子表达式的计算结果为false并不重要。

而不是test (count $argv) -eq 1只做set -q argv[1]来测试argv是否至少有一个参数。请注意缺少美元符号。

如果您正在使用2.7.0或更高版本的鱼,我建议使用新的argparse内置来处理参数。有鱼的几个标准函数使用它,因此您可以查看它们,以及man argparse,以获取如何使用它的示例。使用argparse几乎总是更安全,不太可能导致错误,因为使用手写鱼脚本进行粗略的参数解析,并且将提供与包括所有fish builtins在内的大多数命令相同的参数解析语义。包括正确处理短旗和长旗。

答案 3 :(得分:-1)

如果参数是可选的,那么你可以通过以下方式完成:

//check if variable exists
if (typeof variable === 'undefined'){
}
else{
if(typeof variable){}
}