bash - 在 bash 脚本中创建步骤
问题描述
首先,我对 shell 脚本比较陌生。我想知道是否有人可以帮助我在 bash 脚本中创建“步骤”。例如,我想运行一次分析,然后让脚本使用第一次分析中生成的输出文件进行下一次分析。
例如,下面的脚本将生成输出文件“filt_C2”:
./sortmerna --ref ./rRNA_databases/silva-arc-23s-id98.fasta,./index/silva-arc-23s-id98.db:./rRNA_databases/silva-bac-23s-id98.fasta,./index/silva-bac-23s-id98.db:./rRNA_databases/silva-euk-18s-id95.fasta,./index/silva-euk-18s-id95.db:./rRNA_databases/silva-euk-28s-id98.fasta,./index/silva-euk-28s-id98.db:./rRNA_databases/rfam-5s-database-id98.fasta,./index/rfam-5s-database-id98.db:./rRNA_databases/rfam-5.8s-database-id98.fasta,./index/rfam-5.8s.db --reads ~/path/to/file/C2.fastq --aligned ~/path/to/file/rrna_C2 --num_alignments 1 --other **~/path/to/file/filt_C2** --fastx --log -a 8 -m 64000
此步骤完成后,我想运行另一个步骤,该步骤将使用生成的输出文件“filt_C2”。我一直在为每个步骤创建多个 bash 脚本;但是,如果我可以在一个 bash 文件中执行每一步,效率会更高。那么,有没有办法制作一个脚本来完成第 1 步,然后使用第 1 步中生成的文件转到第 2 步?任何提示将非常感谢。谢谢!
解决方案
欢迎使用 bash 脚本!
这里有一些提示:
- 在一个 bash 脚本文件中可以有多行,只要你喜欢就行。
- 正如弗兰克在他的回答中提到的那样,您可以从您的 shell 脚本中调用其他 bash 脚本(或任何其他可执行程序)。
- 您可以使用变量使您的脚本更通用,例如,如果您想将结果命名为“C3”而不是“C2”。(以下未显示)
- 如果您的脚本变得更复杂,您可以使用 bash 函数,例如参见https://ryanstutorials.net/bash-scripting-tutorial/bash-functions.php
- 我建议将 sortmerna 放在环境 PATH 变量中的目录中,并将多个替换
~/path/to/file
为另一个变量(例如 WORKDIR)以保持一致性和灵活性。
例如,假设您将脚本命名为print_analysis.sh
:
#!/bin/bash
# print_analysis.sh
# Written by Nikki E. Andrzejczyk, November 2018
# Set variables
WORKDIR=~/path/to/file
# Stage 1: Generate filt_C2 using SortMeRNA
./sortmerna --ref ./rRNA_databases/silva-arc-23s-id98.fasta,./index/silva-arc-23s-id98.db:./rRNA_databases/silva-bac-23s-id98.fasta,./index/silva-bac-23s-id98.db:./rRNA_databases/silva-euk-18s-id95.fasta,./index/silva-euk-18s-id95.db:./rRNA_databases/silva-euk-28s-id98.fasta,./index/silva-euk-28s-id98.db:./rRNA_databases/rfam-5s-database-id98.fasta,./index/rfam-5s-database-id98.db:./rRNA_databases/rfam-5.8s-database-id98.fasta,./index/rfam-5.8s.db \
--reads "$WORKDIR/C2.fastq" \
--aligned "$WORKDIR/rrna_C2" \
--num_alignments 1 \
--other "$WORKDIR/filt_C2" \
--fastx --log -a 8 -m 64000
# Stage 2: Process filt_C2 to generate result_C2
./stage2 "$WORKDIR/filt_C2" > "$WORKDIR/result_C2.txt"
# Stage 3: Print the result in result_C2
less "$WORKDIR/result_C2.txt"
请注意我如何使用尾随反斜杠\
,以便我可以将长sortmerna
命令拆分为多个较短的行,以及#
用于人类可读的注释。
如上所述仍有改进的余地,但在这个快速示例中没有实现,但希望这个快速示例向您展示如何扩展您的 bash 脚本并使其一次性执行多个步骤。
Bash 实际上是一种非常强大的脚本和编程语言。要了解更多信息,您可能需要从以下 Bash 教程开始:
- https://ryanstutorials.net/bash-scripting-tutorial/
- http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
希望这可以帮助!如果您还有其他问题,或者我误解了您的问题,请随时提问!
干杯,
安东尼
推荐阅读
- javascript - 检查对象数组是否存在
- google-apps-script - 每当脚本运行时,如何更改 onEdit 函数?- 谷歌表格
- android - 启动对话框时如何显示键盘?
- go - 为什么 context.Context 信号会影响新的 goroutine?
- node.js - 如何在每次刷新页面时验证会话 cookie 的完整性,应该这样做吗?
- pandas - 熊猫石斑鱼缺少时间步长
- node.js - Node.js 连接到 Squelize
- javascript - 如何将时间值从一个文本框设置到另一个邪恶的时间选择器?
- java - 如何在java中使用*拆分字符串?
- java - 使用java流影响一些逻辑列表