2016-08-30 1 views
0

getoptsでは、ユーザーがコード内に導入するすべてのオプションを指定できます。以下のスクリプトを書いてください。ユーザーがgetoptsで一度に2つのオプションを指定できないようにする方法はありますか?

while getopts d:s o 
do case "$o" in 
    d) seplist="$OPTARG";; 
    s) paste=hpaste;; 
    [?]) print >&2 "Usage: $0 [-s] [-d seplist] file ..." 
     exit 1;; 
    esac 
done 

オプション-dと-sの両方を指定することはできません。すなわち、

ユーザーが上記のスクリプトを-dと-sの両方のオプションで実行すると、エラーを受け取るはずであるが、-dと-sの両方を指定することはできません。

+5

いずれかが発生したときにフラグを設定し、いずれかが設定されるたびにチェックすることができます – fedorqui

答えて

0

素朴な実装は$OPTION_COUNTを維持するために、次のようになります。

OPTION_COUNT=0 
while getopts d:s o 
do case "$o" in 
    d) seplist="$OPTARG"; ((OPTION_COUNT ++);; 
    s) paste=hpaste; ((OPTION_COUNT ++);; 
    [?]) print >&2 "Usage: $0 [-s] [-d seplist] file ..." 
     exit 1;; 
    esac 
done 
if [ "$OPTION_COUNT" -gt 1 ]; then echo "too many options"; fi 
0

あなたはスクリプトに渡された特定のオプションをチェックする必要があります。それを維持する方がはるかに簡単です。

#!/usr/bin/env bash 
d_option=0 
s_option=0 
while getopts d:s o 
do case "$o" in 
    d) 
     seplist="$OPTARG" 
     d_option=1 
     ;; 
    s) 
     paste=hpaste 
     s_option=1 
     ;; 
    [?]) print >&2 "Usage: $0 [-s] [-d seplist] file ..." 
     exit 1;; 
    esac 
done 
if [ "x$d_option" == "x1" ] && [ "x$s_option" == "x1" ]; then 
    echo "both options specified." 
    exit 1 
fi 
0

他のオプションのヒントを確認する必要があります。

while getopts d:s o 
do case "$o" in 
    d) if [ -z "$paste" ]; then 
      seplist="$OPTARG" 
     else 
      print >&2 "Option -s is already specified" 
      exit 1 
     fi 
     ;; 
    s) if [ -z "$seplist" ]; then 
      paste=hpaste 
     else 
      print >&2 "Option -d is already specified" 
      exit 1 
     fi 
     ;; 
    [?]) print >&2 "Usage: $0 {-s | -d seplist} file ..." 
     exit 1;; 
    esac 
done 
関連する問題