2017-02-05 10 views
1

У меня есть сценарий оболочки для инструмента, и я только разоблачил несколько аргументов командной строки этого инструмента, но мне интересно, как я могу получить все аргументы командной строки для инструментов внутри сценария оболочки?Как использовать все аргументы командной строки для инструмента в сценарии оболочки 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 из них, и да я могу вручную выставить их все в моей обертке сценарии, но мне интересно, если есть способ сделать это программно.

+0

Почему у вас есть обертка? Я думаю, что это не очень хорошая идея, чтобы обертка беспокоилась обо всех аргументах командной строки вещи, которую вы обертываете. – codeforester

+0

Мне нужна оболочка, потому что оригинальный инструмент не работает так, как я хотел. – upendra

+0

Есть ли у самой обертки какие-либо аргументы? – codeforester

ответ

1

Поскольку команда, которую вы пишете обертку для имеет сложный набор аргументов, я думаю, что это лучше всего сделать это:

  • Напишите обертку, так что она называется:

    wrapper args -- args_for_the_wrapped_command

  • захватить все аргументы до -- в обертке и передать остальную часть их обернутой команды, не беспокоясь о том, что эти аргументы фактически означают

  • Проверьте наличие выходного кода обернутых команд соответствующим образом, чтобы мы ловим какую-либо ошибку, вызванной неправильными аргументами

Таким образом, обертке не нужна иметь дело со сложностью синтаксического анализа завернутых аргументов командования ,

Что-то вроде этого:

# 
# grab all arguments meant for the wrapper 
# 
declare -a args_for_wrapper 
for arg in "[email protected]"; 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 "[email protected]" 

Имеет смысл?

Однако этот подход может не сработать, если предполагается, что оболочка должна сконструировать все аргументы для завернутой команды, необязательно смешать ее с тем, что она получает через свою собственную командную строку.