Shell脚本中两个for循环互相影响的原因是什么?
两个for循环互相影响的原因及解决办法
核心原因:Shell变量默认全局作用域
Shell里的变量默认是全局作用域,不管是在函数内部还是外部定义的变量,只要没显式声明为局部变量,全脚本都能访问和修改。
你的代码里,start函数的for循环用了变量v,checkExists函数的for循环也用了同一个变量名v。当start循环到c时,调用checkExists "$v",此时checkExists里的for循环会遍历"a" "b",循环结束后,全局变量v的值会停留在最后一次迭代的"b"。回到start函数里执行echo "after: $v"时,自然就输出了b。
解决办法:声明局部变量
在函数内部使用local关键字声明变量,把变量限制在当前函数的作用域内,避免全局污染。修改后的checkExists函数如下:
function checkExists() { local d=$1 # 声明d为局部变量 local v # 声明v为局部变量 for v in "a" "b" do if [[ $v == $d ]]; then return 1 fi done return 0 }
或者更简洁地在for循环里直接声明:
function checkExists() { local d=$1 for local v in "a" "b" do if [[ $v == $d ]]; then return 1 fi done return 0 }
修改后再运行脚本,就能得到预期的输出了。
内容的提问来源于stack exchange,提问作者kuat
相关产品推荐
相关产品推荐

