2016-01-05 6 views
1

Я хотел бы добавить пару необязательных аргументов в getopts. Например, для приведенного ниже кода я хочу добавить 2 необязательных аргумента - cagefile и knownlinc. Как я могу это сделать, изменив этот код?Как добавить необязательные аргументы в getopts в bash?

while getopts ":b:c:g:hr:" opt; do 
    case $opt in 
    b) 
     blastfile=$OPTARG 
     ;; 
    c) 
     comparefile=$OPTARG 
     ;; 
    h) 
     usage 
     exit 1 
     ;; 
    g) 
    referencegenome=$OPTARG 
     ;; 
    r) 
    referenceCDS=$OPTARG 
     ;; 
    \?) 
     echo "Invalid option: -$OPTARG" >&2 
     exit 1 
     ;; 
    :) 
     echo "Option -$OPTARG requires an argument." >&2 
     exit 1 
     ;; 
    esac 
done 
+0

ли вы собираетесь использовать longopts (например, '--help') с shortopts (например,' -h')? – anishsane

ответ

3

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

#!/bin/bash 

# parse basic commands (only example) 
while getopts "t:" opt; do 
    case "$opt" in 
    t) TVAR="$OPTARG" 
     ;; 
    *) echo "Illegal argument."; exit 1 
     ;; 
    esac 
done 
echo "TVAR set to: $TVAR" 

# shift to remaining arguments 
shift $(expr $OPTIND - 1) 

while test $# -gt 0; do 
    [ "$1" == "cagefile" ] && echo "cagefile found!" 
    [ "$1" == "knownlinc" ] && echo "knownlinc found!" 
    shift 
done 

выход будет ..

» ./test.sh 
» ./test.sh -t 
./test.sh: option requires an argument -- t 
Illegal argument. 
» ./test.sh -t 2 
TVAR set to: 2 
» ./test.sh -t 2 cagefile 
TVAR set to: 2 
cagefile found! 
» ./test.sh -t 2 cagefile knownlinc 
TVAR set to: 2 
cagefile found! 
knownlinc found! 
+0

Как назначить файлы 'cagefile' и' knownlinc'? В принципе, я хочу запустить свой скрипт следующим образом: sh evolinc-part-I.sh -c cuffcompare.gtf -g Brassica_genome.fa -r Brassica_cds.fa -b TE_transcripts.fa' (все это обязательные аргументы) и -t Brassica_cage.gtf (cagefile) и -x Brassica_known.gff (эти два варианта) ' – upendra

+0

Я не понимаю. Я думаю, вы смешиваете * options * и * arguments *. У cmd, например 'test.sh -t -a test', есть * два * опции' t' и 'a', но только' a' имеет аргумент. Если вы определяете в getopts нечто вроде 'getopts 't:« opt' * аргумент * для 't' уже является обязательным. –