2017-07-24 20 views
0

我有8個選項,它們是運行腳本必需的。但是,我無法在第一個參數後傳遞選項值。你能不能讓我知道我在這裏做錯了什麼。getopts用於運行腳本的必需選項

#!/usr/bin/env bash 
    usage() { echo "Usage: $0 -f sample_R1.fastq -r sample_R2.fastq -hrp HISAT2_REFERENCE_PATH -g GTF_file -sp KNOWN_SPLICE_FILE -b BOWTIE2_REFERENCE.fasta -rsem_path RSEM_REFERENCE -out_path OUTPUT_PATH -h help" 1>&2; exit 1; } 

while getopts ":f:r:hrp:g:s:b:rsem_path:out_path:h" opt; do 
    case "${opt}" in 
     f) f="$OPTARG"; shift ;; # sample_R1.fastq 
     r) r="$OPTARG"; shift ;; # sample_R2_fastq 
     hrp) hrp="$OPTARG"; shift ;; # HISAT2_REFERENCE_PATH 
     g) g="$OPTARG"; shift ;;  # GTF_file 
     sp) sp="$OPTARG"; shift ;; # KNOWN_SPLICE_FILE 
     b) b="$OPTARG"; shift ;;  # BOWTIE2_REFERENCE 
     rsem_path) rsem_path="$OPTARG"; shift ;; #RSEM Reference path 
     out_path) out_path="$OPTARG"; shift ;; #Results output path 
     h | *) usage ; exit;; 
    esac 
done 

echo "f = ${f}" 
echo "r = ${r}" 
echo "hrp = ${hrp}" 
echo "g = ${g}" 
echo "sp = ${sp}" 
echo "b = ${b}" 
echo "rsem_path = ${rsem_path}" 
echo "out_path = ${out_path}" 

結果

f = ./test_data/HBR_Rep1_ERCC-Mix2_Build37-ErccTranscripts-chr22.read1.fastq 
r = 
hrp = 
g = 
sp = 
b = 
rsem_path = 
out_path = 

回答

2

有許多的問題在這裏:

  • getopts只做單字母選項,將把-hrp爲的簡寫(就像ls -lals -l -a的簡稱)。長選項有一個半標準格式(以雙破折號開頭,例如ls --color),但getopts不支持這種格式。

  • getopts選項變量(opt在這種情況下)設置的選項包括-,所以你的情況應該像如f)而不是-f)

  • 請勿在getopts循環中使用shiftgetopts跟蹤它在參數列表中的位置,並且如果參數列表在它正在工作時被移位......事情變得非常困惑。相反,在循環後使用shift $((OPTIND-1))來擺脫所有已處理的選項。

  • 你實際上沒有捕獲選項值。也就是說,解析-f sample_R1.fastq時,getopts會將OPTARG設置爲「sample_R1.fastq」,但您忽略該設置,並將f設置爲字符串「true」。

  • 最後,您開始使用「:」選項字符串,它告訴getopts它不應該報告錯誤,因爲您將採取的是,但你不。此外,即使沒有那個「:」,如果getopts看到一個不在列表中的選項,它將運行循環,並將opt設置爲「?」,所以您應該檢查並在此情況下給出用法消息。

這裏是我採取的修正版本:

#!/usr/bin/env bash 
    usage() { echo "Usage: $0 -f sample_R1.fastq -r sample_R2.fastq -H HISAT2_REFERENCE_PATH -g GTF_file -s KNOWN_SPLICE_FILE -b BOWTIE2_REFERENCE.fasta -R RSEM_REFERENCE -o OUTPUT_PATH [-h]" 1>&2; exit 1; } 

while getopts "f:r:H:g:s:b:R:o:h" opt; do 
    case "${opt}" in 
     f) f="$OPTARG" ;; # sample_R1.fastq 
     r) r="$OPTARG" ;; # sample_R2_fastq 
     H) hrp="$OPTARG" ;; # HISAT2_REFERENCE_PATH 
     g) g="$OPTARG" ;;  # GTF_file 
     s) sp="$OPTARG" ;; # KNOWN_SPLICE_FILE 
     b) b="$OPTARG" ;;  # BOWTIE2_REFERENCE 
     R) rsem_path="$OPTARG" ;; #RSEM Reference path 
     o) out_path="$OPTARG" ;; #Results output path 
     h | [?]) usage ; exit;; 
    esac 
done 
shift $((OPTIND-1)) 

echo "f = ${f}" 
echo "r = ${r}" 
echo "hrp = ${hrp}" 
echo "g = ${g}" 
echo "sp = ${sp}" 
echo "b = ${b}" 
echo "rsem_path = ${rsem_path}" 
echo "out_path = ${out_path}" 

請注意,如果你想給一個錯誤信息,如果被省略了一些選項,您需要檢查所有這些變量得到了設定。像if [ -z "$f" ] || [ -z "$r" ] || ...

+0

@melpomene糟糕。我通過將「hrp」選項切換到大寫字母H來修復它。 –

0

你並不需要 「 - 」 中的case語句等-f應該˚F-rr等

+0

我編輯了腳本,但問題仍然存在,而不是第一個參數 – user44552