2013-02-12 342 views
0

我使用shell脚本从数据库检索课程名称。当计算机科学,环境科学等领域中存在空间名称时,名称存储在列表的两个不同实例中,即在空间之后和空间之后,如不同实例中的“计算机”和列表的不同实例中的“科学”我想把它保存像“计算机科学”列表中的同一个实例,我如何克服这个问题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 

回答

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 
+0

如果我从两列或多列像第一列检索数据(数据库)是CourseName和第二是CourseEligibility那么这将是对变量$语法值 – shehzy 2013-02-12 11:23:01

+1

@shehzy,我建议问这是一个不同的问题,因为它更符合SO的工作方式。在评论框中提问不会让你对SO人有太多的报道。 – paxdiablo 2013-02-12 11:54:24

+1

@shehzy,我相应地修改了我的答案,但我必须第二** paxdiablo **。还要考虑到这种解析不是非常健壮。 – fejese 2013-02-12 14:09:05

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" 
+0

是的,它解决了我的问题。感谢您的帮助 – shehzy 2013-02-12 10:41:59

+0

如果我从两列或更多列中检索数据(数据库),如第一列是CourseName,第二是CourseEligibility,那么变量$ value的语法是什么 – shehzy 2013-02-12 11:07:45

+0

这很难。您需要以CSV等可解析格式输出,并将IFS设置为列分隔符。 – Barmar 2013-02-12 11:11:08

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" 
+0

感谢您的回复。 – shehzy 2013-02-12 10:52:14

+0

如果我从两列或更多列(如第一列是CourseName)检索数据(数据库),第二是CourseEligibility,那么变量$ value的语法是什么 – shehzy 2013-02-12 11:22:38