問題は、ループがサブシェルで実行され、値が親シェルに伝播されない(そして伝播できない)ことです。パイプライン内のコマンドはサブシェルである必要があるため、サブシェルで実行されます。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
現在、多くのシステムはパフォーマンス上の理由からより単純なシェルを使用しており、これらのシェルはプロセス置換拡張をサポートしていないことがよくあります。