首页 > 解决方案 > 在 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 步?任何提示将非常感谢。谢谢!

标签: bashshell

解决方案


欢迎使用 bash 脚本!

这里有一些提示:

  1. 在一个 bash 脚本文件中可以有多行,只要你喜欢就行。
  2. 正如弗兰克在他的回答中提到的那样,您可以从您的 shell 脚本中调用其他 bash 脚本(或任何其他可执行程序)。
  3. 您可以使用变量使您的脚本更通用,例如,如果您想将结果命名为“C3”而不是“C2”。(以下未显示)
  4. 如果您的脚本变得更复杂,您可以使用 bash 函数,例如参见https://ryanstutorials.net/bash-scripting-tutorial/bash-functions.php
  5. 我建议将 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 教程开始:

希望这可以帮助!如果您还有其他问题,或者我误解了您的问题,请随时提问!

干杯,

安东尼


推荐阅读