2016-11-16 3 views
0

Я делаю сценарий, который принимает варианты, и два из них: -s и -e. -s требует указать дату начала и дату окончания и дату окончания и дату окончания, но я хочу сделать так, чтобы никто не мог быть использован без другого. Другими словами, если я использую опцию -s, также требуется опция -e и наоборот.Как мне выбрать вариант, требующий другого варианта?

Вот мой код до сих пор

#!/bin/bash 

gflag=false 
uflag=false 
sflag=false 
eflag=false 
rflag=false 
nflag=false 
tflag=false 

while getopts g:u:s:e:rnt opt; do 
    case "$opt" in 
    g) 
     gflag=true 
     groupParam=$OPTARG 
     echo "-g was triggered, Parameter: $OPTARG" >&2 
     ;; 
    u) 
     uflag=true 
     userParam=$OPTARG 
     echo "-u was triggered, Parameter: $OPTARG" >&2 
     ;; 
    s) 
     sflag=true 
     startParam=$OPTARG 
     echo "-s was triggered, Parameter: $OPTARG" >&2 
     ;; 
    e) 
     eflag=true 
     endParam=$OPTARG 
     echo "-e was triggered, Parameter: $OPTARG" >&2 
     ;; 
    r) 
     rflag=true 
     echo "-r was triggered" >&2 
     ;; 
    n) 
     nflag=true 
     echo "-n was triggered" >&2 
     ;; 
    t) 
     tflag=true 
     echo "-t was triggered" >&2 
     ;; 
    esac 
done 

Как я могу изменить свой код, чтобы быть в состоянии сделать это?

ответ

1

После разбора всех опций (после цикла while), вы можете сделать

if ($sflag && ! $eflag) || (! $sflag && $eflag); then 
    echo "Cannot specify -s without -e or vice versa" >&2 
    exit 1 
fi 

Я, пользуясь тем, что true и false являются встроенными командами, которые возвращают ожидаемый статус.

Можно также написать это без использования подоболочки, но это немного шумнее:

if { $sflag && ! $eflag; } || { ! $sflag && $eflag; }; then 
+0

Спасибо, что работал отлично. Мне было интересно, есть ли в getopts встроенный способ, но это отлично работает. – mackdiogo

Смежные вопросы