代码之家  ›  专栏  ›  技术社区  ›  user2268507

比较bash脚本函数中的参数

  •  0
  • user2268507  · 技术社区  · 11 年前

    我目前有以下功能:

    function abs()
    {
      return ($1<0 ?-$1:$1);
    }
    

    当我尝试运行脚本时,我遇到语法错误:

    bin/bash1.sh: line 5: syntax error near unexpected token `$1'
    bin/bash1.sh: line 5: `  return ($1<0 ?-value:value);'
    

    有人能告诉我该怎么写这个函数吗?

    非常感谢。

    3 回复  |  直到 11 年前
        1
  •  2
  •   user3553031    11 年前

    这个 return bash中的语句不能这样使用。它仅用于设置函数的退出状态,其参数(如果存在)必须是整数文本。如果要将其他值传递回调用者,则必须使用其他方法。

    您还需要使用双括号,以便bash将表达式视为算术表达式;否则,它将治疗 <0 作为从名为“0”的文件重定向stdin的尝试。

    请尝试以下操作:

    function abs() { 
        echo $(($1<0 ?-$1:$1)); 
    };
    
        2
  •  1
  •   that other guy    11 年前
    abs()
    {
      echo $(($1<0 ?-$1:$1));
    }
    
    echo "abs -321 is $(abs -321)"
    

    在Java、C、C++、C#和Python等语言中,猜测基于您已经知道的语言的语法是一种可行的策略,但不幸的是,它在Bash中不起作用。尝试 Bash Guide 从零开始学习语言。

        3
  •  0
  •   konsolebox    11 年前

    命令替换是一个选项,但使用全局变量代替,因为分叉成本很高。

    function abs {
      (( __ = $1 < 0 ? -$1 : $1 ))
    }
    
    abs -4
    echo "$__"
    

    输出:

    4
    

    看见 Arithmetic Expansion Shell Arithmetic (prev. Arithmetic Evaluation) .

    • (( __ = $1 < 0 ? -$1 : $1 )) 相当于 __=$(( $1 < 0 ? -$1 : $1 )) .
    • () 使用声明函数时不需要 function . abs() { } 也可以是一种表单,并且与原始的基于sh的shell兼容,但如果您只是使用bash运行代码,这无关紧要。