问题是循环在子 shell 中执行,并且值不会(也不能)传播到父 shell。它在子shell中执行,因为管道中的命令必须如此。你有两个选择:
- 打印子外壳内的值
- 使循环在主外壳中运行
第一个选项很容易仅使用 POSIX shell 结构。只需将循环用花括号中的最终 echo 包裹起来:
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 中看到一种支持进程替换扩展的方法,例如 bash:
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 中编写脚本;由于性能原因,许多系统现在使用更简单的 shell /bin/sh
,这些 shell 通常不支持进程替换扩展。