2017-02-13 12 views
-1

私はbashスクリプトを持っていて、そのスクリプトの実行中に特定のコマンドラインフラグが提供されていればメッセージを出力したいと思います。例えば、ここに私のbashスクリプトがあります。シェルオプション "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 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 

は私が間違って何をやっている最初の出力を出力します - 私は、余分なオプションを含めるしようとすると、それは、(「品質」第2の条件に該当する)、しかし正しく

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 

を印刷しますここに?

+0

は[MCVE] - あなたのコードは最小限から遠く離れていると私はあなたが求めているものであってもよく分かりません。 – melpomene

答えて

1
  1. あなたoptstringにによると、-qのでquality_33=$OPTARG

    • はしばらく前にquality_33=0を宣言し、その変数に空の文字列を割り当て、その場合の分岐の使用で、引数を取りませんquality_33=1
  2. elifを使用して-qをテストし、ifを条件付きでテストしているためです、あなたがこれまでに「品質」

  3. テストは表示されません真た[ ! -o $quality_33 ]真になることはありません:変数が空であるので、bashが
    [ ! -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 <"; done' –

+0

興味深い。その行動は文書化されていないようです。 – melpomene

関連する問題