问题是循环是在子shell中执行的,并且值不是(也不能)传播到父shell。它在子shell中执行,因为管道中的命令必须是。你有两个选择:
- 打印值的子shell
- 内使循环运行在主壳
第一个选项是很容易只使用POSIX shell结构。简单地包裹在最终的回声循环在大括号:
count=0
mysql -uroot -proot -Dproject_ivr_db -rN --execute "SELECT Department FROM
entrytests_datetime WHERE Discipline='msc'" | {
while read department; do
echo "V,department_$count=$department"
let "count++"
done
echo "V,count=$count"
echo "E,resume"
}
由于剧本似乎要结束了那里,这应该是可行的。对于第二个选项,我只能在支持进程替换的shell中看到一种方式,例如扩展例如,庆典:
count=0
while read department; do
echo "V,department_$count=$department"
let "count++"
done < <(mysql -uroot -proot -Dproject_ivr_db -rN --execute "SELECT Department
FROM entrytests_datetime WHERE Discipline='msc'")
echo "V,count=$count"
echo "E,resume"
我会建议在bash 对创作剧本;由于性能原因,许多系统现在使用更简单的外壳作为/bin/sh
,这些外壳通常不支持进程替换扩展。
在'bash'(4.2或更高版本)的最新版本中,您可以在脚本的开头添加'shopt -s lastpipe'来解决答案中描述的问题。 – chepner 2013-10-18 13:44:42