-bash:脚本中意外令牌“完成”附近的语法错误

时间:2015-02-27 19:55:56

标签: linux bash awk sed grep

我很抱歉发布此内容但这让我发疯。我是一个非常新的打击脚本,我真的很挣扎。我有以下格式8_S58_L001.sorted.bam的文件,我想从许多文件中取第一个数字(在这种情况下为8)并生成一个csv文件。这将给出下游功能处理样品的顺序。 该脚本如下,它的工作原理,但是每次运行它时都会出现错误(-bash:语法错误接近意外令牌'完成')并且很难理解原因。到目前为止,我花了两天的时间试图找到它的底部,并通过各种论坛进行了广泛的搜索。

do
test=$(ls -LR | grep .bam$| sed 's/_.*//'| awk '{print}' ORS=',' | sed 's/*$//')
echo $test>../SampleOrder/fileOrder2.csv
done

如果我只是跑

test=$(ls -LR | grep .bam$| sed 's/_.*//'| awk '{print}' ORS=',' | sed 's/*$//')
echo $test>../SampleOrder/fileOrder2.csv

然后我得到了所需的输出并且没有错误但是如果它被包含在do语句中我得到了上述错误。我希望将其合并到一个更大的脚本中,所以我想先处理这个错误。

我应该说这是在基于Linux的集群上运行。

有经验的人可以告诉我哪里出错了。

提前致谢

萨姆

2 个答案:

答案 0 :(得分:0)

bash没有do语句,done是一个保留字,当它是命令中的第一个单词时。

所以在

do
  something
  something
done

do是语法错误。 do仅在forwhile循环的上下文中有用,它用于将条件与循环体分开。

由于您在done而不是do报告语法错误,我的猜测是您已经让Windows行结尾进入您的文件。 Bash不会将\r CR )字符视为特殊字符,因此如果您的文件实际包含do\r,那么这将被视为外部命令的名称

答案 1 :(得分:0)

您应该知道grep .bam$没有做您期望它做的事情。点是一个grep通配符,匹配任何单个字符,因此模式.bam$将匹配任何以" bam"结尾的4个或更多字符的字符串。如果您要尝试匹配以" .bam"结尾的所有字符串,则应该转义该点并写入grep "\.bam$"

但正如前一位评论者所说,你应该使用shell通配符(ls *.bam)而不是grep(ls | grep .bam$