为什么两个for循环会互相影响?
在下面的代码块中,预期输出为:
before: a
after: a
before: c
after: c
但实际输出是:
before: a
after: a
before: c
after: b # changed, why ?
我的测试代码如下:
function checkExists() {
d=$1
for v in "a" "b" # it seems to be affected by this line, why?
do
if [[ $v == $d ]]; then
return 1
fi
done
return 0
}
function start() {
for v in "a" "c"
do
echo "before: $v"
checkExists "$v"
echo "after: $v"
done
}
start
为什么两个for循环会互相影响?
1条答案
按热度按时间w8rqjzmb1#
您没有将
v
声明为local
。因此,两个函数使用相同的变量。调用checkExists
后,v
将始终设置为“b”。与某些语言不同,shell
for
循环不会创建自己的独立世界;它们使用常规变量。如果它是一个在循环开始之前就已经存在的变量,那么它曾经拥有的任何值都将被循环破坏。在循环完成后,无论它是新的还是预先存在的,变量仍然是它在最后一次迭代中接收的值。如果在包含
for
循环的函数中没有将变量声明为局部变量(例如使用local v
),它将是一个全局变量,函数的调用者也可以看到它。但是,请注意,局部变量不是POSIX shell规范的特性。
local
声明可以在bash、ksh、zsh甚至相对严格的破折号中工作,但如果您需要脚本在严格POSIX sh中工作,则只需选择不冲突的变量名。