Shell 如何验证文件格式
我写了这个shell脚本。我收到了第14行和第18行的错误消息,但我看不出有什么问题。脚本应该分析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"
*.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行,所以这可能只是一个摘录,但如果是这样的话,那么引用行号就毫无用处了。。。