我有这个:
sum() for i in $@; do ((tot += 4)); echo $tot;done
现在,如何在for循环之前重置tot变量?
我试过了:
sum() tot = 0; for i in $@; do ((tot += 4)); echo $tot;done
sum() tot = 0;done; for i in $@; do ((tot += 4)); echo $tot;done
sum() tot = 0 for i in $@; do ((tot += 4)); echo $tot;done
sum() ((tot = 0)) for i in $@; do ((tot += 4)); echo $tot;done
答案 0 :(得分:2)
您必须使用tot
关键字为函数设置本地变量local
:
sum() { local tot; for i in $@; do ((tot += 4)); echo $tot;done; }
可选地,在定义局部变量时,您还可以设置初始值:
sum() { local tot=0; for i in $@; do ((tot += 4)); echo $tot;done; }
但这是可选的。
答案 1 :(得分:2)
函数定义需要单个复合命令作为其主体。这是合法的
sum() for i in $@; do ((tot += 4)); echo $tot;done
因为for
循环是单个复合命令。一旦您尝试添加另一个命令(在这种情况下,分配给tot
),您需要确保该命令和for
循环合并在< em>另一个复合命令。
定义函数的常用方法是始终使用大括号组(或在某些情况下,子shell (...)
),即使大括号组中的唯一命令是另一个复合命令。这里,大括号组允许您将赋值语句添加到函数体:
sum () {
tot=0
for i in "$@"; do ((tot += 4)); echo "$tot"; done
}
前两次尝试是错误,因为单个赋值语句不是有效的函数体。
您的第三次尝试是错误,因为复合命令(与简单命令不同)不能在变量赋值之后。
你的第四次尝试在语法上是合法的;它定义了一个函数sum
,它将tot
的值设置为0. for
循环在定义函数后执行,而不是函数定义的一部分。