linux - -bash : syntax error near unexpected token `done' in script

标签 linux bash awk sed grep

我很抱歉发布此内容,但这让我发疯。我对 bash 脚本非常陌生,而且真的很挣扎。我有以下格式的文件 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 并不将 \r (CR) 字符视为特殊字符,因此如果您的文件实际上包含 do\r,那么它将被视为外部命令的名称。

关于linux - -bash : syntax error near unexpected token `done' in script,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28773240/

相关文章:

linux - 环境变量的问题

awk - 减去两个单独文件中相似行号的行中的每一列

json - Bash sqlite3 行 |如何转换成JSON格式

Linux:使用鼠标加*键盘*修饰符模拟滚动

linux - 如何使用 shell 脚本有效地清理文件夹

python - 让 sublime text 3 使用 anaconda python

linux - 如何修复 jpg 文件的 '[: too many arguments'

c++ - Qt 多线程信号量和条件变量

Bash 移动 * 到子文件夹失败 : cannot move to a subdirectory of itself

linux - 关于使用 ORS、NR、FS、RS 的 awk 命令的说明