如何验证文件格式

时间:2015-04-14 15:55:37

标签: shell

我写了这个shell脚本。我收到了第14行和第18行的错误消息,但我没有看到错误。该脚本应该分析*.fq的每个文件。如果给定文件的前三个字符不匹配" HWI"然后脚本将回复" invalide格式",但如果它们匹配,那么脚本将给出我的数字" HWI"该文件中的行。

!/bin/sh
for f in *.fq
do
a="$(head -n1 $f)"
c="$(expr substr $a 2 3)"
echo $c
nr="$(grep -w "HWI" $f | wc -l)
if [ "$c"="HWI" ] ;
then
  echo $f |  "the number of read of $f is $nr"
else
  echo"Invalide Format"
fi
done

有人可以解释我的错误吗?

3 个答案:

答案 0 :(得分:0)

您的脚本中存在多个语法问题,您可以使用http://www.shellcheck.net/之类的工具来检测某些错误。 缩进代码后,这是你所写的更正确(不完美)的版本:

for f in *.fq 
do 
    a=$(head -n1 "$f")
    c=$(expr substr "$a" 2 3)
    echo "$c"
    nr=$(grep -w "HWI" "$f" | wc -l)
    if [ "$c" == "HWI" ]; then
        echo "The number of read of $f is $nr"
    else 
        echo "Invalide Format"
    fi
done
  • 无需报价" "在$(..)
  • 附近
  • 无需管道$ f回声(不确定你要做什么)
  • 引用" "包装变量以避免分词

我没有运行代码,因为我不知道你想要做什么,但至少语法应该更好。

答案 1 :(得分:0)

您的代码已经完善:

#!/bin/sh
for f in *.fq
do
a="$(head -n1 $f)"
c=$(expr "substr $a 2 3")
echo $c
nr="$(grep -w "HWI" $f | wc -l)"
if [ "$c"="HWI" ] ;
then
  echo $f  "the number of read of $f is $nr"
else
  echo "Invalide Format"
fi
done
  

错误:

     

第1行:缺少#

     

第5行:使用expr

时语法错误      

第7行:缺少报价

     

第10行:使用echo

的语法错误      

第12行:在echo

之后缺少空格      

最后一行:缺少循环结束done

答案 2 :(得分:0)

此测试[ "$c"="HWI" ]始终 true

[命令根据接收的参数数量做不同的事情。当给出1个参数(折扣强制]最后一个参数)时,如果参数的长度不为零,则返回成功。

您正在向[命令传递一个参数:"$c"="HWI" - 此字符串的长度至少为,因此显然不为零。< / p>

对于字符串比较,您需要运算符周围的空格:[ "$c" = "HWI" ]

有关如何解析[命令的所有详细信息,请参阅此处:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html#tag_20_128


我的重写:

#!/bin/bash
for f in *.fq; do
    read -N3 first3 < "$f"
    if [[ $first3 == "HWI" ]]; then
        echo "number of reads: $f: $(grep -Fwc HWI "$f")"
    else
        echo "Invalide Format: $f"
    fi
done