问题
写shell的时候遇到一段未如预期执行的代码:
...
str=""
mysql -u xx -h localhost -pxx -Ne "select col1,col2 from db1.tbl1" | while read a b;do
str=$str,$a,$b
done
echo "str is $str"
预期最后打印的应该是db读取的内容拼接结果,但实际打印出来str为空:
str is
原因
这是因为使用了管道|,在管道中的循环逻辑不能作用到外部变量,也就是说在上述do 循环体中,str=$str,$a,$b
中的str变量被看成了另一个局部变量。
解决
避免使用管道即可
# 先把mysql内容写到临时文件
mysql -u xx -h localhost -pxx -Ne "select col1,col2 from db1.tbl1" > .tmp
#然后从临时文件读取内容解析
while read a b; do
str=$str$a$b
done < .tmp
echo $str