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

如何获取shell脚本中最后一个递增的值?,shell,Shell,我试图获取变量count的最后一个递增值,但每次打印时 0这是初始值,如何获取变量count的最后一个递增值 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=$depa

我试图获取变量count的最后一个递增值,但每次打印时 0这是初始值,如何获取变量count的最后一个递增值

 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"

这是因为管道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"
#/usr/bin/bash
计数=0
读系
做
echo“V,部门\计数=$department”
让“计数++”

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

  • 打印子shell中的值
  • 使循环在主shell中运行
  • 第一个选项很容易,仅使用POSIX外壳结构。只需用大括号将最后一个回音缠绕在循环中:

    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"
    
    count=0
    读系时;做
    echo“V,部门\计数=$department”
    让“计数++”
    
    不,我没有。我的意思是你必须说它使用非POSIX扩展。并非所有shell都有此功能。在最新版本的
    bash
    (4.2或更高版本)中,您可以在脚本开头添加
    shopt-s lastpipe
    ,以解决答案中描述的问题。