Linux -bash:意外标记“done';手稿

Linux -bash:意外标记“done';手稿,linux,bash,awk,sed,grep,Linux,Bash,Awk,Sed,Grep,我很抱歉发布这个,但这让我发疯。我对bash脚本非常陌生,我真的很挣扎。我有以下格式的文件8_S58_L001.sorted.bam,我想从许多文件中提取第一个数字(本例中为8),并生成一个csv文件。这将给出下游函数处理样本的顺序。 脚本如下所示,它可以正常工作,但是每次运行它时,我都会遇到一个错误(-bash:syntax error near unexpected token'done'),我很难理解为什么。到目前为止,我已经花了两天的时间试图找到它的底部,并通过各种论坛进行了广泛的搜索

我很抱歉发布这个,但这让我发疯。我对bash脚本非常陌生,我真的很挣扎。我有以下格式的文件8_S58_L001.sorted.bam,我想从许多文件中提取第一个数字(本例中为8),并生成一个csv文件。这将给出下游函数处理样本的顺序。 脚本如下所示,它可以正常工作,但是每次运行它时,我都会遇到一个错误(-bash:syntax error near unexpected token'done'),我很难理解为什么。到目前为止,我已经花了两天的时间试图找到它的底部,并通过各种论坛进行了广泛的搜索

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的集群上运行的

有经验的人能告诉我哪里出了问题吗

提前谢谢


Sam

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

所以在

do
是一个语法错误
do
仅在
for
while
循环的上下文中有用,用于将条件与循环体分离


由于您在
done
上报告了一个语法错误,而不是
do
,因此我猜想您让Windows行结束符潜入了您的文件。Bash并不认为
\r
(CR)字符是特殊的,因此如果文件实际包含
do\r
,则该字符将被视为外部命令的名称。

您应该知道
grep.bam$
并没有实现您期望的功能。点是匹配任何单个字符的grep通配符,因此模式
.bam$
将匹配以“bam”结尾的4个或更多字符的任何字符串。如果您试图匹配以“.bam”结尾的所有字符串,则应转义点并写入
grep“\.bam$”


但正如前面的一位评论员正确指出的那样,您应该使用shell通配符(
ls*.bam
)而不是grep(
ls | grep.bam$

do用于循环。为什么您觉得需要将它放在一个没有循环的
do
语句中?没有
do
语句,就像没有
then
语句一样。有一个
for
语句和一个
while
语句,它们都包含单词
do
作为语法的一部分,就像
if
语句所使用的
then
一样。另外,如果您正在使用awk,您不需要grep和/或sed,因为awk可以做任何他们能做的事情,您应该做
ls*.bam
而不是
ls | grep bam
。最后,您需要引用您的变量。不要粗鲁,但脚本中的每一句话在某种程度上都是错误的。如果您发布一些示例输入和预期输出,我们可以让您走上正确的道路。感谢您的回复。多亏了rici,我想我已经找到了问题的根源。我一直盯着这段代码看了这么长时间,以至于我没有意识到实际上并不需要循环,因此可以省略do和done,它工作得很好。这是我第一次尝试bash脚本。这可能不是最优雅的解决方案,但它确实有效(我是生物学家而不是程序员)!它应该采取文件列表格式8_S58_L001.sorted.bam采取第一个数字并输出单个csv.rici,感谢您的回复。我一直在通过改编我在网上找到的其他脚本来处理我的数据。很多脚本中似乎都有do和done语句,但您要说的是,这个脚本没有任何问题,在这种情况下,我可以简单地删除do和done。Thanks@Sam:
while条件;做done
是一个语句<代码>做。。。完成没有。好的,我想我现在明白了。其他脚本已将do作为for循环的一部分。你可能已经猜到了,我是生物学家而不是程序员。非常感谢你的帮助!
do
  something
  something
done