我试图获取变量计数的最后一个递增值,但每次打印时 0这是初始值,如何获得变量计数的最后一个递增值。
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"
答案 0 :(得分:2)
这是因为管道while循环创建了一个子shell而子进程无法改变父进程的环境。试试这个:
#!/usr/bin/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"
我不得不说,这不符合Posix标准。通过在bash中设置set -o posix
并查看错误来测试它。
答案 1 :(得分:0)
问题是循环是在子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中编写脚本;由于性能原因,许多系统现在使用更简单的shell作为/bin/sh
,并且这些shell通常不支持进程替换扩展。