Shell选项“OPTIONNAME”无法正常使用我的脚本

时间:2017-02-13 01:21:16

标签: bash shell

我有一个bash脚本,如果在运行该脚本时提供了特定的命令行标志,我想打印出该消息。例如,这是我的bash脚本

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

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

  1. 根据您的optstring,-q不接受参数,因此quality_33=$OPTARG将空字符串赋给该变量

    • 在while之前声明quality_33=0,在这种情况下,分支使用quality_33=1
  2. 由于您使用elif来测试-q,并且if条件属实,您将永远不会看到“质量”

  3. 测试[ ! -o $quality_33 ]永远不会成立:变量为空,所以bash看到了 [ ! -o ] - 在这种情况下,“ - o”被视为普通字符串而不是运算符,并且普通的非空字符串始终为true。然后你否定了那个结果。使用单括号时,始终引用您的变量:

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