Shell中while循环作用域


我们知道使用while循环一行一行的处理变量中的数据的写法是这样的

local result=""
echo "${result}" |while read line;do
    ...
done

比如下面这个

local tmp=""
echo "${result}" |while read line;do
    tmp = "${result}|${line}"
done

其实我们期望的是把result中的每一行读取出来,然后使用竖线分隔的。但是上面的写法是有问题的,tmp最终根本不会得到想要的结果的。
这里这种写法while循环中无论怎么改变外面变量的值,只要一旦代码执行到循环外边,对tmp的更变都会消失,或者说在循环内部的变量是无法影响循环外边的变量的。如果想要改变循环外面数据的值,只需要加个括号,使while循环整体变成一个子shell

local tmp=""
echo "${result}" | (
  while read line;do
    tmp = "${result}|${line}"
  done
)

评论