0

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

3 回答 3

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"
于 2013-02-12T09:44:08.893 回答
1

如果这种方式行不通,那就不要那样做。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
于 2013-02-12T09:43:17.630 回答
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"
于 2013-02-12T09:59:17.447 回答