Shell脚本中功能的参数分配

时间:2018-10-02 05:25:03

标签: bash shell parameters parameter-passing

我最近开始学习编写Shell脚本代码,而令我感到困惑的是参数分配的顺序。

这是我很困惑的代码

NAMES             PORTS                     

happy_stallman                                          

repository        0.0.0.0:30081->8081/tcp   

代替输出为

#!/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"

因为5-3 + 7 = 9

我得到它

The result is 9

任何人都可以解释一下吗?

3 个答案:

答案 0 :(得分:3)

正确的代码:

#!/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。

答案 1 :(得分:3)

问题出在表达式

sum=$(Expression num1 num2 num3)

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

您需要通过将$放在变量名之前作为包含这些值的实际占位符来传递

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

我想您的决定是错误的,$((..))中的算术运算符bash构造使您可以访问没有前缀$的变量。但是对于命令替换语法,$(..)要求变量名以$开头,否则如您在此处看到的那样,仅传递文字值。

对于值7,很明显,num3是在函数内部定义的,全局是local。因此,它保留了值5,因此对5-3+5执行了您期望的操作5-3+7

答案 2 :(得分:0)

您必须在变量前面放置$

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")

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