2017-02-13 81 views
-1

我有一个bash脚本,如果在运行脚本时提供特定的命令行标志,我想打印出该消息。例如,这里是我的bash脚本Shell选项“OPTIONNAME”对我的脚本无法正常工作

while getopts ":hi:l:1:2:U:O:s:p:5:3:qQm:M:I:X:" opt; do 
    case $opt in 
    i) 
    index_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 
    ;; 
    O) 
    bam_out=$OPTARG # Samoutput file 
    ;; 
    s) 
    sra_id=$OPTARG # SRA ID 
    ;; 
    p) 
    num_threads=$OPTARG # Number of threads 
    ;; 
    5) 
    five_trim=$OPTARG # 5' trim 
    ;; 
    3) 
    three_trim=$OPTARG # 3' trim 
    ;; 
    q) 
    quality_33=$OPTARG # Phred 33 
    ;; 
    Q) 
    quality_64=$OPTARG # Phread 64 
    ;; 
    m) 
    min_intl=$OPTARG # Minimum intron length 
    ;; 
    M) 
    max_intl=$OPTARG # Maximum intron length 
    ;; 
    t) 
    tra_as=$OPTARG # Report alignments tailored for transcript assemblers including StringTie 
    ;; 
    c) 
    tra_cuff=$OPTARG # Report alignments tailored specifically for Cufflinks 
    ;; 
    esac 
done 


if [ ! -z $left_reads ] && [ ! -z $right_reads ]; then 
    echo "original" 

elif [ ! -z $left_reads ] && [ ! -z $right_reads ] && [ ! -o $quality_33 ]; 
then 
    echo "quality" 
fi 

而当我尝试像这样运行。它打印正确

sh test.sh -i index -l "F" -1 reads_1.fq -1 e_coli_1000_1.fq -2 reads_2.fq -2 e_coli_1000_2.fq -p 2 -O final_bam -5 10 -3 10 -m 20 -M 200 
original 

然而,当我尝试包括一个额外的选项(相当于第二个条件 - “质量”),它仍然打印第一输出

sh Hisat2_align.sh -i index -l "F" -1 reads_1.fq -1 e_coli_1000_1.fq -2 reads_2.fq -2 e_coli_1000_2.fq -p 2 -O final_bam -5 10 -3 10 -m 20 -M 200 -q 
original 

我在做什么错这里?

+0

[MCVE] - 你的代码是远远最小的,我什至不知道你在问什么。 – melpomene

回答

1
  1. 根据您的optstring,-q不带任何参数,所以quality_33=$OPTARG分配空字符串变量

    • 的,而之前宣布quality_33=0,在这种情况下,分支使用quality_33=1
  2. 由于您正在使用elif来测试-qif条件是真的,你永远不会看到“质量”

  3. 测试[ ! -o $quality_33 ]永远不会为真:变量是空的,所以庆典看到
    [ ! -o ] - 在这种情况下,“O”被作为一个纯字符串不是一个运算符,并且一个普通的非空字符串总是为真。然后你否定这个结果。当使用单支架,总是引用您的变量:

    elif [ ! -z "$left_reads" ] && [ ! -z "$right_reads" ] && [ "$quality_33" -eq 1 ] 
    
+0

当读取一个没有参数的选项时,'getopts'实际上是否重置了'OPTARG'? – melpomene

+0

是的。一个例子:'set - -a 1 -b; OPTIND = 1;而getopts“a:b”opt; do echo“> $ opt < > $ OPTARG <”;完成' –

+0

有趣。这种行为似乎没有记录。 – melpomene