0

我正在尝试获取变量计数的最后一个增量值,但是每次打印初始值 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"
4

2 回答 2

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。set -o posix通过在 bash 中设置并查看错误来测试它。

于 2013-02-21T08:46:41.113 回答
0

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

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

第一个选项很容易仅使用 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 通常不支持进程替换扩展。

于 2013-02-21T08:51:20.697 回答