Shell 如何验证文件格式

Shell 如何验证文件格式,shell,Shell,我写了这个shell脚本。我收到了第14行和第18行的错误消息,但我看不出有什么问题。脚本应该分析*.fq的每个文件。如果给定文件的前三个字符与“HWI”不匹配,则脚本将只回复“无效格式”,但如果它们匹配,则脚本将给出该文件中“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"

我写了这个shell脚本。我收到了第14行和第18行的错误消息,但我看不出有什么问题。脚本应该分析
*.fq
的每个文件。如果给定文件的前三个字符与“HWI”不匹配,则脚本将只回复“无效格式”,但如果它们匹配,则脚本将给出该文件中“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

有人能解释我的错误是什么吗?

脚本中有几个语法问题,您可以使用类似的工具来检测一些错误。 缩进代码后,以下是您编写的代码的更正确(不完美)的版本:

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
  • 不需要在美元左右加引号
  • 无需向echo发送$f(不确定您想做什么)
  • 使用引号“”包装变量以避免分词
我没有运行代码,因为我真的不知道您想要做什么,但至少语法应该更好。

您的代码经过优化:

#!/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

此测试
[“$c”=“HWI”]
始终

[
命令根据收到的参数数量执行不同的操作。当给定1个参数时(不考虑强制的
]
最后一个参数),如果参数长度非零,则返回success

您正在将一个参数传递给
[
命令:
“$c”=“HWI”
——此字符串的长度至少为四个,因此显然不是零

对于字符串比较,需要在运算符周围加空格:
[“$c”=“HWI”]

有关如何解析
[
命令的所有详细信息,请参见以下内容:


我的重写:

#!/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
!/bin/bash
对于*.fq;do中的f
阅读-N3 first3<“$f”
如果[[$first3==“HWI”];则
echo“读取次数:$f:$(grep-Fwc HWI“$f”)”
其他的
echo“无效格式:$f”
fi
完成

echo“foo”
是一个错误,因为您需要在命令和字符串之间留一个空格。
echo$var |“string”
是一个错误,除非
string
是一个命令(并且除非该命令从标准输入读取数据,否则不会执行任何有用的操作)。添加空格并从另一行
echo
中删除
$f |
。哦,还要告诉我们你得到的错误,这样我们就不必猜测了。此外,修复she-bang(
#!/bin/sh
),你的脚本没有18行,所以这可能只是一个摘录,但如果是这样的话,那么引用行号就毫无用处了。。。