如何在Bash包装器脚本中使用工具的所有命令行参数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Bash包装器脚本中使用工具的所有命令行参数?相关的知识,希望对你有一定的参考价值。

我有一个为工具编写的包装脚本,我只暴露了该工具的几个命令行参数,但我想知道如何在包装器脚本中获取工具的所有命令行参数?

这是我感兴趣的工具:

hisat2 [options]* -x <hisat2-idx> {-1 <m1> -2 <m2> | -U <r> | --sra-acc <SRA accession number>} [-S <hit>]

Options    
Input options
-q
Reads (specified with <m1>, <m2>, <s>) are FASTQ files. FASTQ files usually have extension .fq or .fastq. FASTQ is the default format. See also: --solexa-quals and --int-quals.    
--qseq
Reads (specified with <m1>, <m2>, <s>) are QSEQ files. QSEQ files usually end in _qseq.txt. See also: --solexa-quals and --int-quals.   
-f
Reads (specified with <m1>, <m2>, <s>) are FASTA files. FASTA files usually have extension .fa, .fasta, .mfa, .fna or similar. FASTA files do not have a way of specifying quality values, so when -f is set, the result is as if --ignore-quals is also set.    
-r
Reads (specified with <m1>, <m2>, <s>) are files with one input sequence per line, without any other information (no read names, no qualities). When -r is set, the result is as if --ignore-quals is also set.    
-c
The read sequences are given on command line. I.e. <m1>, <m2> and <singles> are comma-separated lists of reads rather than lists of read files. There is no way to specify read names or qualities, so -c also implies --ignore-quals.

在我的包装器脚本中,我能够公开hisat2工具的所有必需选项。

#!/bin/bash

usage() {
      echo ""
      echo "Usage : sh $0 -i Input_folder -l lib_type {-1 <left_reads> -2 <right_reads> | -U <single_reads> | -s <sra_id>} -S <output_sam> -p numb_threads"
      echo ""

cat <<'EOF'
  -i </path/to/input folder>

  -l Library type

  -1 </path/to/reads_1>

  -2 </path/to/reads_2>

  -U </path/to/single_reads>

  -S </path/to/sam output>

  -s SRA ID

  -p Number of threads

EOF
    exit 0
}

while getopts ":hi:l:1:2:U:S:s:p:" opt; do
  case $opt in
    i)
    input_folder=$OPTARG # Input folder
     ;;
    l)
     lib_type=$OPTARG # Library type
     ;;
    1)
    left_reads=$OPTARG # Left reads
     ;;
    2)
    right_reads=$OPTARG # Right reads
     ;;
    U)
    single_reads=$OPTARG # single end reads
     ;;
    S)
    sam_out=$OPTARG # Samoutput file
     ;;
    s)
    sra_id=$OPTARG # SRA ID
     ;;
    p)
    num_threads=$OPTARG # Number of threads
     ;;
    h)
    usage
     exit 1
      ;;
    ?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done


for i in $input_folder/*; do
    cp $i .
   fbname=$(basename "$i" .ht2 | cut -d. -f1)
done

if [ ! -z $left_reads ] && [ ! -z $right_reads ];
then
    hisat2 -x $fbname --rna-strandness $lib_type -1 $left_reads -2 $right_reads -S temp.sam -p $num_threads
    samtools view -bS temp.sam > $sam_out
    rm temp.sam
fi

当我查看可选参数时,有超过20个,是的,我可以在我的包装脚本中手动公开它们,但我想知道是否有办法以编程方式进行。

答案

由于您编写包装器的命令有一组复杂的参数,我认为最好这样做:

  • 编写包装器,以便将其调用为: wrapper args -- args_for_the_wrapped_command
  • 抓住所有参数直到包装器中的--并将其余参数传递给包装命令,而不必担心这些参数实际意味着什么
  • 适当地检查包装命令的退出代码,以便我们捕获由错误参数引起的任何错误

这样,包装器不需要处理解析包装命令参数的复杂性。

像这样的东西:

#
# grab all arguments meant for the wrapper
#
declare -a args_for_wrapper
for arg in "$@"; do
  if [[ "$arg" == "--" ]]; then
    shift  # get rid off "--" itself
    break
  else
    # the argument consumption logic can be placed here as well
    # or collect the args into an array
    args_for_wrapper+=("$arg")
    shift
  fi
done

# consume wrapper's argument contained in the array

# call the wrapped command
wrapped_command "$@"

说得通?

但是,如果包装器应该为包装命令构造所有参数,则可能无法使用此方法,可选地将其与通过其自己的命令行接收的参数混合。

以上是关于如何在Bash包装器脚本中使用工具的所有命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Bash 中更改命令行参数?

如何在bash脚本中使用命令行参数?

使用bash脚本,编写一个实现将命令行的多个参数逆序输出的程序。

在 linux/bash 中添加到命令行参数

Bash 脚本无法识别命令行参数? [复制]

如何在 bash 脚本中确定触摸屏设备?