【问题标题】:shell script and databaseshell脚本和数据库
【发布时间】:2013-02-12 09:38:48
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: mysql linux shell scripting


    【解决方案1】:
    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"
    

    【讨论】:

    • 如果我从两列或多列中检索数据(数据库),比如第一列是 CourseName,第二列是 CourseEligibility,那么变量 $value 的语法是什么
    • 这更难。您需要以 CSV 等可解析格式输出,并将 IFS 设置为列分隔符。
    【解决方案2】:

    如果这种方式行不通,那就不要那样做。 for ... in 拆分单词而不是行。

    一个可能更好的解决方案是使用更多的线路感知:

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

    有关概念证明,请参阅以下脚本:

    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
    

    【讨论】:

    • 如果我从两列或多列中检索数据(数据库),比如第一列是 CourseName,第二列是 CourseEligibility,那么变量 $value 的语法是什么
    • @shehzy,我建议将其作为一个不同的问题提出,因为它更符合 SO 的工作方式。在评论框中提出问题并不能让您充分了解 SO 的人。
    • @shehzy,我相应地修改了我的答案,但我必须第二个 paxdiablo。还要考虑这种解析不是非常健壮。
    【解决方案3】:

    键可以是 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"
    

    【讨论】:

    • 感谢您的回复。
    • 如果我从两列或多列中检索数据(数据库),比如第一列是 CourseName,第二列是 CourseEligibility,那么变量 $value 的语法是什么
    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 2011-04-16
    • 1970-01-01
    • 2012-05-21
    • 2011-11-19
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多