如何编写Bash脚本批量创建目录、生成文件并执行命令
Bash批量处理phylip文件运行dollop的脚本修复
实现目标
- 原始phylip文件存储路径:
/home/agalvez/data/sims/phylip_format,目录下包含sim1.phylip、sim2.phylip等文件 - 为每个
.phylip文件创建对应目录 - 每个新建目录内放入两份内容:
- 对应
.phylip原始文件的副本 - 名为
input的配置文件,内容按顺序为:对应phylip文件的文件名 U 5 Y /home/agalvez/data/sims/trees/tree_nodenames.txt
- 对应
- 进入每个新建目录,执行命令
phylip dollop < input > screenout完成分析
初始脚本报错情况
最初编写的脚本如下:
!/bin/bash for f in *.phylip; mkdir /home/agalvez/data/sims/dollop/$f; cp $f /home/agalvez/data/sims/dollop/$f; cd /home/agalvez/data/sims/dollop/$f; echo "$f" | cat > input; echo "U" | cat >> input; echo "5" | cat >> input; echo "Y" | cat >> input; echo "/home/agalvez/data/sims/trees/tree_nodenames.txt" | cat >> input; phylip dollop < input > screenout; ;done
运行时直接抛出语法错误:
line 4: syntax error near unexpected token `mkdir' line 4: ` mkdir /home/agalvez/data/sims/dollop/$f;'
问题原因
- 脚本开头的shebang标识缺失
#,不符合bash脚本规范 for循环语法结构错误,缺少循环体起始关键字do,分号位置错乱,导致解释器无法识别循环结构,直接在执行到mkdir行时报语法错- 复制源文件时未写绝对路径,若脚本未在原始phylip文件目录下运行,会出现找不到源文件的问题
可用修复脚本
#!/bin/bash for f in *.phylip; do mkdir /home/agalvez/data/sims/dollop/$f; cp /home/agalvez/data/sims/phylip_format/$f /home/agalvez/data/sims/dollop/$f; cd /home/agalvez/data/sims/dollop/$f; echo "$f" | cat > input; echo "U" | cat >> input; echo "5" | cat >> input; echo "Y" | cat >> input; echo "/home/agalvez/data/sims/trees/tree_nodenames.txt" | cat >> input; phylip dollop < input > screenout; done
补充说明:运行前需确认
/home/agalvez/data/sims/dollop父目录已提前创建,否则mkdir会抛出无对应路径错误;如果需要生成不带.phylip后缀的同名目录,将脚本中路径里的$f替换为${f%.phylip}即可。
内容的提问来源于stack exchange,提问作者Alex galvez morante
相关产品推荐
相关产品推荐

