![](/img/trans.png)
[英]BASH: syntax error near unexpected token `done' with alias named 'do'
[英]-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
仅在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$
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.