shell脚本和数据库

时间:2013-02-12 09:38:48

标签: mysql linux shell scripting

我正在使用shell脚本从数据库中检索课程名称。当课程名称中出现空间,例如计算机科学,环境科学等时,名称存储在列表的两个不同实例中,即在空间之前和之后的空间之类如“不同实例中的计算机”和不同实例列表中的“科学”,但是我想把它像“计算机科学”一样存储在同一个列表实例中,我该如何克服这个问题

这是我的检索课程名称的代码

db_value=`mysql -uroot -proot -Dproject_db -rN --execute
    "SELECT CourseName FROM applicant_result"`
z=1
for value in $db_value
  do
      echo "V,eligibility_$z=$value"
      let "z+=1"
  done
  echo "E,resume"

我得到的结果(注意V,eligibility_2和V,eligibility_3的值)

V,eligibility_1=chemistry
V,eligibility_2=computer                                       
V,eligibility_3=science
V,eligibility_4=mathematics
V,eligibility_5=physics

3 个答案:

答案 0 :(得分:3)

z=1
mysql -uroot -proot -Dproject_db -rN --execute "SELECT CourseName FROM applicant_result" | while read value
do 
    echo "V,eligibility_$z=$value"
    let "z+=1"
done
echo "E,resume"

答案 1 :(得分:1)

如果这种方式不起作用,那就不要这样做了。 for ... in分为单词而不是行。

一个可能更好的解决方案是使用更多线路识别的东西:

mysql blah blah blah | awk '{
    n = n + 1;
    print "V,eligability_"n"=$0
} END { print "E,resume" }'

请参阅以下tanscript以获取概念证明:

pax> echo 'chemistry
...> computer science
...> mathematcis
...> physics
...> basket weaving' | awk '{
...>     n = n + 1;
...>     print "V,eligibility_"n"="$0
...> } END {print "E,resume"}'
V,eligibility_1=chemistry
V,eligibility_2=computer science
V,eligibility_3=mathematcis
V,eligibility_4=physics
V,eligibility_5=basket weaving
E,resume

答案 2 :(得分:0)

键可以是IFS变量 - 输入字段分隔符 这决定了输入应该分成哪些字符。 所以在你的情况下,你想用新的行分开:

#!/bin/bash

db_value=`mysql -uroot -proot -Dproject_db -rN -e "SELECT CourseName, CourseEligibility FROM applicant_result"`

oldIFS="$IFS" # save old to be able to restore it later
IFS="
";
z=1
for value in $db_value; do
  name=`echo $value | cut -f1`
  elig=`echo $value | cut -f2`
  #do whatever with $name and $elig
  echo "V,eligibility_$z=$name"
  : $[z++]
done
IFS="$oldIFS"
echo "E,resume"