如何在shell脚本中获取最后一个递增的值?

时间:2013-02-21 08:39:13

标签: shell

我试图获取变量计数的最后一个递增值,但每次打印时 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"

2 个答案:

答案 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中执行,因为管道中的命令必须是。您有两种选择:

  1. 在子shell中打印值
  2. 使循环在主shell中运行
  3. 第一个选项很容易只使用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通常不支持进程替换扩展。