1

だから私はgetopts、getoptなどについて読んでいますが、私の問題に対する正確な解決策は見つかりませんでした。

私のスクリプトの使用法の基本的な考え方は次のとおりです。

./program [-u] [-s] [-d] <TEXT>

-d が渡された場合、TEXT は必要ありません。TEXT は通常、テキストの段落であることに注意してください。

私の主な問題は、getopts がフラグの解析を終了すると、TEXT パラメータの位置を知る方法がないことです。ただし、ユーザーが失敗して次のようなことをした場合、 TEXT が最後の引数であると想定できます。

./program -u "sentence 1" "sentence 2"

その場合、プログラムは使用法が正しくないことを認識しません。

私が最も近いのは、 getopt と IFS を使用して実行することです

ARGS=$(getopt usd: $*)
IFS=' ' read -a array <<< "$ARGS"

唯一の問題は、TEXT がテキストの長い段落である可能性があり、このメソッドはスペースのためにテキストのすべての単語を分割することです。

私の最善の策は、正規表現を使用して使用法が正しく形成されていることを確認してから、getopts で引数を抽出することだと考えていますが、より簡単な解決策があればいいと思います

4

2 に答える 2

3

それは非常に簡単getoptsです:

#!/bin/bash
u_set=0
s_set=0
d_set=0
while getopts usd OPT; do
  case "$OPT" in
    u) u_set=1;;
    s) s_set=1;;
    d) d_set=1;;
    *) # getopts produces error
       exit 1;;
  esac
done
if ((!d_set && OPTIND>$#)); then
  echo You must provide text or use -d >>/dev/stderr
  exit 1
fi
# The easiest way to get rid of the processed options:
shift $((OPTIND-1))
# This will run all of the remaining arguments together with spaces between them:
TEXT="$*"
于 2013-10-02T23:06:20.047 に答える
0

これは私が通常行うことです:

local badflag=""
local aflag=""
local bflag=""
local cflag=""
local dflag=""

while [[ "$1" == -* ]]; do
  case $1 in
    -a)
      aflag="-a"
      ;;

    -b)
      bflag="-b"
      ;;

    -c)
      cflag="-c"
      ;;

    -d)
      dflag="-d"
      ;;

    *)
      badflag=$1
      ;;
  esac
  shift
done

if [ "$badflag" != "" ]; do
    echo "ERROR CONDITION"
fi

if [ "$1" == "" ] && [ "$dflag" == "" ]; do
    echo "ERROR CONDITION"
fi

local remaining_text=$@
于 2013-10-02T21:34:34.930 に答える