2013-02-21 87 views
0

我想获取变量计数的最后一个增量值,但每次打印时都是初始值,我怎样才能得到变量计数的最后一个增量值。如何获取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" 
+0

在'bash'(4.2或更高版本)的最新版本中,您可以在脚本的开头添加'shopt -s lastpipe'来解决答案中描述的问题。 – chepner 2013-10-18 13:44:42

回答

2

这是因为piped 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并查看错误来测试它。

+0

不,我*不*。我的意思是你必须说它使用非POSIX扩展。并非所有的炮弹都有。 – 2013-02-21 08:53:14

0

问题是循环是在子shell中执行的,并且值不是(也不能)传播到父shell。它在子shell中执行,因为管道中的命令必须是。你有两个选择:

  1. 打印值的子shell
  2. 内使循环运行在主壳

第一个选项是很容易只使用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,这些外壳通常不支持进程替换扩展。

相关问题