2

次の2つのいずれかとして実行する必要があるスクリプトがあります。

script.sh -t TYPE
script.sh -t TYPE -f FILE
  • -tフラグなしで実行された場合、エラーが発生して終了します。
  • -tフラグを指定して実行する場合は、値を取得して「$ TYPE」という変数に格納し、「JUST$TYPE」と出力します。
  • -fフラグを指定して実行する場合は、値を取得して「$ FILE」という変数に格納し、「$TYPEと$FILE」を出力します。

こことインターネットの両方の情報とチュートリアルから、一般的にこれは私が得ることができる最も近いものです。誰かが私がこの既存のコードに2番目の条件を入れるのを手伝ってもらえますか?

while getopts ":t:" opt; do
  case $opt in
    a)
      echo "JUST $OPTARG" >&2
      ;;
    \?)
      echo "Error - Invalid type argument" >&2
      exit 1
      ;;
    :)
      echo "Error - No type argument" >&2
      exit 1
      ;;
  esac
done
4

2 に答える 2

4

コマンドライン引数の処理方法が混乱していると思います。

一般的な方法は、すべての引数の処理がプログラム/スクリプトの実際のジョブに先行することです。

オプションにコロンが追加されている場合はさらに(に関連してgetopts)、オプションに引数があると予想されることを示します。

あなたのcase声明も過密に見えます。コロンと疑問符をテストする必要はありません。テスト全体をwhileループの後に置くことができます


私はこのようにします

#!/bin/bash
unset TYPE
unset FILE

#uncomment if you want getopts to be silent
#OPTERR=0

while getopts "t:f:" opt; do
  case $opt in
    t)
      TYPE=$OPTARG
      echo "JUST $OPTARG"
      ;;
    f)
      FILE=$OPTARG
      ;;
  esac
done

if ! test "$TYPE" ; then
    echo "-t is obligatory"
    exit 1
fi

if test "$TYPE" && test "$FILE" ; then
    echo "$TYPE and $FILE"
fi
于 2013-01-22T12:19:11.023 に答える
2

これを見てください:

TYPE=""
FILE=""

while getopts "t:f:" opt; do
    case $opt in
        t)  TYPE="$OPTARG"
            ;;
        f)  FILE="$OPTARG"
            ;;
    esac
done

if [ -z "$TYPE" ]; then
  echo "No -t. Bye."
  exit 1 # error
else
  if [ -n "$FILE" ]; then
    echo "$TYPE and $FILE"
  else
    echo JUST $TYPE
  fi
fi
于 2013-01-22T12:16:39.973 に答える