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ループがサブシェルを作成し、子プロセスが親の環境を変更できないためです。代わりにこれを試してください:

 #!/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 posixbashに設定し、エラーを確認してテストします。

于 2013-02-21T08:46:41.113 に答える
0

問題は、ループがサブシェルで実行され、値が親シェルに伝播されない(そして伝播できない)ことです。パイプライン内のコマンドはサブシェルである必要があるため、サブシェルで実行されます。2つのオプションがあります。

  1. サブシェル内に値を出​​力します
  2. メインシェルでループを実行します

最初のオプションは、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"
}

スクリプトはそこで終了しているように見えるので、これは実行可能であるはずです。2番目のオプションでは、 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でスクリプトを書くことはお勧めしません。/bin/sh現在、多くのシステムはパフォーマンス上の理由からより単純なシェルを使用しており、これらのシェルはプロセス置換拡張をサポートしていないことがよくあります。

于 2013-02-21T08:51:20.697 に答える