【问题标题】:Assignment of parameters for functions in Shell ScriptShell 脚本中函数的参数分配
【发布时间】:2019-03-07 05:36:19
【问题描述】:

我最近开始学习编写 Shell 脚本,让我感到困惑的一件事是参数分配的顺序。

这是我混淆的代码

#!/bin/bash
Expression() 
{
    local num3=$1
    local num4=$2
    local num5=$3
    local sum=$(((num3-num4)+num5))
echo $sum
}
num1=5
num2=3
num3=7
sum=$(Expression num1 num2 num3)
echo "The result is $sum"

而不是将输出作为

The result is 9

自5-3+7=9

我是这样理解的

The result is 7

谁能解释一下?

【问题讨论】:

    标签: bash shell parameters parameter-passing


    【解决方案1】:

    问题在于表达式

    sum=$(Expression num1 num2 num3)
    

    您将num1num2num3文字 值作为字符串传递的位置。在示例中,这些变量不是作为已定义值的占位符传递的,而是作为原始字符串传递的。

    您需要将它们作为包含这些值的实际占位符传递,方法是在变量名称前放置 $

    sum=$(Expression "$num1" "$num2" "$num3")
    

    我猜您错误地做出的决定是,bash 中的算术运算符 $((..)) 构造允许您在没有 $ 前缀的情况下访问变量。但是对于命令替换语法$(..) 要求变量名称以$ 为前缀,否则只有文字值会被传递,正如您在此处看到的那样。

    至于7的值,很明显num3在函数内部既定义了全局又定义了local。所以它的值是5,所以5-3+5 的操作是在你所期望的5-3+7 上执行的。

    【讨论】:

      【解决方案2】:

      正确的代码:

      #!/bin/bash
      Expression() 
      {
          local num4=$1
          local num5=$2
          local num6=$3
          local sum=$((((num4-num5))+num6))
      echo $sum
      }
      num1=5
      num2=3
      num3=7
      sum=$(Expression num1 num2 num3)
      echo "The result is $sum"
      

      输出:

      ./script.sh
      The result is 9
      

      为什么您的代码不起作用?当您使用 bash -x 选项运行代码时,您会看到不同之处:

      $ bash -x ./script.sh
      + num1=5
      + num2=3
      + num3=7
      ++ Expression num1 num2 num3
      ++ local num3=num1
      ++ local num4=num2
      ++ local num5=num3
      ++ local sum=7
      ++ echo 7
      + sum=7
      + echo 'The result is 7'
      The result is 7
      

      num3 被声明为局部变量和全局变量。由于该函数使用本地 1,因此使用值 5 而不是您预期的 7。

      【讨论】:

        【解决方案3】:

        您必须在变量前面放置一个$

        sum=$(Expression $num1 $num2 $num3)
        

        这里发生的是您传递变量的名称,而不是值。让我们看一下您的程序的简化版本

        #!/bin/bash                                                                                                                                                                                                                                                                     
        Expression()
        {
            local num5=$1
            echo $((num5))
        }
        num3=7
        echo "The result is $(Expression num3)"
        

        您传递的是文本num3,而不是值7$(()) 运算符尝试计算数字。 num5 不是数字,而是变量。所以它被替换为值num3num3 不是数字,所以它被替换为值 7

        你可以嵌套这个,输出是5

        #!/bin/bash                                                                                                                                                                                                                                                                     
        num1=num2
        num2=num3
        num3=num4
        num4=5
        echo $((num1))
        

        你也可以试试这个:

        #!/bin/bash                                                                                                                                                                                                                                                                     
        num1=num2
        num2=num3
        num3=num4
        num4=num1
        echo $((num1))
        

        结果是

        line 6: num4: expression recursion level exceeded (error token is "num4")
        

        所以评估确实是递归的,直到达到一个数字或一个限制。

        【讨论】:

          猜你喜欢
          • 2018-08-08
          • 1970-01-01
          • 1970-01-01
          • 2014-08-11
          • 2018-11-18
          • 2020-11-27
          • 1970-01-01
          • 2015-06-02
          • 2013-04-10
          相关资源
          最近更新 更多