2015-10-07 56 views
0

我正在尝试编写一个Bash脚本,它将读取特定的csv,并根据该csv中列的值移动文件。但是,当我这样做时,它将所有内容视为虚假,并且不会移动这些文件,尽管我确实知道它应该大致读取五分之一的内容。解析Bash中的CSV值

的代码如下

#!/bin/bash 

FILE=filename.csv 

while IFS=, read -a csv_line; 
    do 
    EMAIL="${csv_line[1]}" #identify the filename 
    HASVAL="${csv_line[62]}" #should be either 1 or 0 
    if [ -e "$EMAIL" ] 
    then 
     echo "detected" 
     if [ "$HASVAL" = "1" ] 
     then 
      mv "$EMAIL" /home/targetdirectory 
      echo "moved" 
     fi 
    fi 
done < $FILE 

我看不出有什么不对这个脚本。它只打印“检测到”,从不打印“移动”并且不移动文件,所以我怀疑它不正确地匹配文本。是否有可能我正在读取csv错误的内容,并且它可能不是csv中的所有值都是字符串?还是我在做其他事情?

谢谢你给予的任何帮助。

编辑:更换有问题的,如果用 [ “$ HASVAL” -eq 1]

声明给我

detected 
: integer expression expected 

在每一行,所以我不知道整数比较会擦出火花。

编辑:如下所述,它看起来像问题已解决。 .csv有DOS结尾,因为我在查看最后一列,所以它不能正确匹配,而最后一列必须修剪'/ r',以便它可以将它匹配到适当的字符串。感谢大家的帮助。

+0

在测试之前,您是否尝试过回显'$ HASVAL'的值以确认它是0还是1?你确定62是正确的领域吗? – chepner

+0

我有,并且其印刷各种0和1。 –

+0

检查'echo“$ {HASVAL} x”'的输出。 – chepner

回答

-1

编辑:最佳做法建议使用double [[]]和double等于您的if语句。还有,你是否验证过你是比较字符串值还是应该进行整数比较。

+0

编号'='是'test'命令的字符串相等运算符。 – chepner

+0

刚试过这个,它没有改变任何东西。我相信上面的海报是正确的,因为=是正确的测试操作符。 –

+0

我试图用 [“$ HASVAL”-eq 1]替换if语句,但它给了我“response:”整数表达式预期“ –