2016-11-16 29 views
0

我正在製作一個接受選項的腳本,其中兩個是-s-e-s需要一個開始日期和-e要求和結束日期,但我想這樣做,所以一個人不能沒有另一個使用。換句話說,如果我使用-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 

我走的事實,truefalse都內建返回預期的狀態命令的優勢。

也可以這樣寫,而無需使用子shell,但它是一個有點嘈雜:

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

謝謝你,非常完美。我想知道是否有一些內置的getopts方式來做到這一點,但這工作得很好。 – mackdiogo

相關問題