我写了这个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
有人可以解释我的错误吗?
答案 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
我没有运行代码,因为我不知道你想要做什么,但至少语法应该更好。
答案 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