在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"
}
我实现了一个包含 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"
}