我最近开始学习编写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
任何人都可以解释一下吗?
答案 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)
您将num1
,num2
和num3
的文字值作为字符串传递的位置。在示例中,您没有将那些变量作为已定义值的占位符传递,而是作为原始字符串传递。
您需要通过将$
放在变量名之前作为包含这些值的实际占位符来传递
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
不是数字,而是变量。因此将其替换为值num3
。 num3
不是数字,因此将其替换为值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")
所以评估的确是递归的,直到达到一个数字或一个极限为止。