在for循环中添加参数

Add up parameters in for loop

我实现了一个包含 while for 循环的函数,定义如下:

func()
{
...
 for i in "$@"; do
     enum="source"
     sourceID=$i
     ret_ID $FILE_NAME $sourceID $enum
     ID=$req_ID
     ((ID+=ID))
 done
 echo $ID
}

函数ret_ID解析一个包含一些变量的文件

param1=0x00000001
param2=0x00000400
param3=0x000008000
...

无论我传递多少个参数,echo $ID returns 与最后一个参数关联的 ID,而不是所有参数的总和。例如,func param1 param3 returns 32768 而不是 32769.

更新:从 OP 的评论来看,这听起来像是 glenn jackman 的建议,而不是让 ret_ID() 设置一个全局变量 以便 return 将其结果 将其结果输出到标准输出 并在命令替换中捕获结果 ($(...))解决了问题。

假设问题不是 Glenn 指出的简单 逻辑 错误(((ID+=ID)) 应该是 ((ID+=req_ID )):确切的原始问题的原因尚不清楚,但由于 func()ret_ID() 都对 global 变量进行操作,因此很容易看出一个函数如何干扰另一个函数, 比如 if ret_ID() 不小心也设置了变量 $ID.

这里重写了显示此更改的函数,还建议进行一些其他更改以使函数更健壮,最值得注意的是 使用 local 变量:

func()
{
 # Declare *local* variables.
 local arg enum sourceID retID 
 # Declare the local result variable *as an integer*
 # Also, better to use variable names that at least start with a *lowercase*
 # letter to avoid conflicts with *environment* variables.
 local -i id=0 
 # ...
 for arg; do  # loop over all args; the `in "$@"` part is optional
   enum="source"
   sourceID=$arg
   # Call helper function and let it return its result via *stdout* captured
   # through a command substitution rather than by setting a global variable.
   # Note the use of double quotes to prevent problems with values with embedded spaces.
   reqID=$(ret_ID "$FILE_NAME" "$sourceID" "$enum")
   # Add the value returned to $id
   # Note that since $id was declared as an integer,
   # use of (( ... )) is optional.
   id+=$reqID
 done
 echo "$id"
}