繁体   English   中英

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

[英]-bash: syntax error near unexpected token `done' in script

我很抱歉发布这个,但这让我发疯。 我是一个非常新的打击脚本,我真的很挣扎。 我有以下格式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的集群上运行。

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

提前致谢

山姆

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

所以

do
  something
  something
done

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

既然你汇报的语法错误done ,而不是在do ,我的猜测是,你已经让Windows行结束蔓延到您的文件。 Bash不会将\\rCR )字符视为特殊字符,因此如果您的文件实际包含do\\r ,那么它将被视为外部命令的名称。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM