为什么shell for循环会受到另一个for循环的影响?

blmhpbnm  于 2023-06-06  发布在  Shell
关注(0)|答案(1)|浏览(280)

为什么两个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循环会互相影响?

w8rqjzmb

w8rqjzmb1#

您没有将v声明为local。因此,两个函数使用相同的变量。调用checkExists后,v将始终设置为“b”。
与某些语言不同,shell for循环不会创建自己的独立世界;它们使用常规变量。如果它是一个在循环开始之前就已经存在的变量,那么它曾经拥有的任何值都将被循环破坏。在循环完成后,无论它是新的还是预先存在的,变量仍然是它在最后一次迭代中接收的值。
如果在包含for循环的函数中没有将变量声明为局部变量(例如使用local v),它将是一个全局变量,函数的调用者也可以看到它。
但是,请注意,局部变量不是POSIX shell规范的特性。local声明可以在bash、ksh、zsh甚至相对严格的破折号中工作,但如果您需要脚本在严格POSIX sh中工作,则只需选择不冲突的变量名。

相关问题