【问题标题】: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)
您将num1、num2 和num3 的文字 值作为字符串传递的位置。在示例中,这些变量不是作为已定义值的占位符传递的,而是作为原始字符串传递的。
您需要将它们作为包含这些值的实际占位符传递,方法是在变量名称前放置 $
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 不是数字,而是变量。所以它被替换为值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")
所以评估确实是递归的,直到达到一个数字或一个限制。