getoptまたはgetoptsなしで賢明に実行されるように、ヘルプオプションにサブパラメータを含めますか?

getoptまたはgetoptsなしで賢明に実行されるように、ヘルプオプションにサブパラメータを含めますか?

ファイルを選択して特定の内容を印刷できるスクリプトを作成しています。例えば、

san#./script.sh

Expected Usage : ./script.sh --file1 --dns

(ここでfile1を確認し、dns名を検索して印刷します。デフォルトでは、1つのパラメータの下にサブパラメータがあります)

次の個々のパラメータ/オプションを試しました。

options=$@

arguments=($options)

index=0;
for argument in $options
do
    index=`expr $index + 1`;
    case $argument in
    -a | --fun1 ) run_function1 ;;
    -b | --fun2 ) run_function2 ;;
    -c | --fun3 ) run_function3 ;;
    esac
done
exit;

[ ${1} ] || helpinfo

誰でも二重パラメータ(サブオプション)を提案できますか?

目的のターゲットオプション:

./script.sh


OPTIONS : ./script.sh -h

./script --fun1 stackoverflow
        microsoft
        Google
     --fun2 Yahoo 

デフォルトでは、各関数はファイルを表示します。 getoptやgetoptsを見てみましたが、長いオプションはありません(--longは不可能で、代わりに-lのみを使用できます)。しかし、再びサブパラメータについてはわかりません。この問題を解決するのに役立つ人はいますか?getoptまたはを使用したくありませんgetopts

ベストアンサー1

これは私がここに提供した最初のバージョンよりもユーザーフレンドリーなバージョンです。特に、同等の長いオプションと短いオプションのコードの重複を防ぎます。短いオプション(-q)、長いオプション(--quiet)、引数付きのオプション、累積的な短いオプション(-qlfinput 代わりに-q -l -f input)、一意に短縮された長いオプション(--qui代わりに--quiet)、オプションの終了など、必要なすべてのオプションを処理する必要があります--

ほとんどのコードは修正されました。表示されている部分だけを修正してください。

#!/bin/bash

# Update USAGE (USAGE1, USAGE2, USAGE3 may remain unchanged):
USAGE='Usage: prog [-q|--quiet] [-l|--list] [-f file|--file file] [-Q arg|--query arg] args'
USAGE1='
Ambiguously abbreviated long option:'
USAGE2='
No such option:'
USAGE3='
Missing argument for'

# List all long options here (including leading --):
LONGOPTS=(--quiet --list --file --query)

# List all short options that take an option argument here
# (without separator, without leading -):
SHORTARGOPTS=fQ

while [[ $# -ne 0 ]] ; do
  # This part remains unchanged
  case $1 in
  --) shift ; break ;;  ### no more options
  -)  break ;;          ### no more options
  -*) ARG=$1 ; shift ;;
  *)  break ;;          ### no more options
  esac

  # This part remains unchanged
  case $ARG in
  --*)
    FOUND=0
    for I in "${LONGOPTS[@]}" ; do
      case $I in
      "$ARG")  FOUND=1 ; OPT=$I ; break ;;
      "$ARG"*) (( FOUND++ )) ; OPT=$I ;;
      esac
    done
    case $FOUND in
    0) echo "$USAGE$USAGE2 $ARG" 1>&2 ; exit 1 ;;
    1) ;;
    *) echo "$USAGE$USAGE1 $ARG" 1>&2 ; exit 1 ;;
    esac ;;
  -["$SHORTARGOPTS"]?*)
    OPT=${ARG:0:2}
    set dummy "${ARG:2}" "$@"
    shift ;;
  -?-*)
    echo "$USAGE" 1>&2 ; exit 1 ;;
  -??*)
    OPT=${ARG:0:2}
    set dummy -"${ARG:2}" "$@"
    shift ;;
  -?)
    OPT=$ARG ;;
  *)
    echo "OOPS, this can't happen" 1>&2 ; exit 1 ;;
  esac

  # Give both short and long form here.
  # Note: If the option takes an option argument, it it found in $1.
  # Copy the argument somewhere and shift afterwards!
  case $OPT in
  -q|--quiet) QUIETMODE=yes ;;
  -l|--list)  LISTMODE=yes ;;
  -f|--file)  [[ $# -eq 0 ]] && { echo "$USAGE$USAGE3 $OPT" 1>&2 ; exit 1 ; }
              FILE=$1 ; shift ;;
  -Q|--query) [[ $# -eq 0 ]] && { echo "$USAGE$USAGE3 $OPT" 1>&2 ; exit 1 ; }
              QUERYARG=$1 ; shift ;;
  *)          echo "$USAGE$USAGE2 $OPT" 1>&2 ; exit 1 ;;
  esac
done

# Remaining arguments are now in "$@":

echo "QUIETMODE = $QUIETMODE"
echo "LISTMODE = $LISTMODE"
echo "FILE = $FILE"
echo "QUERYARG = $QUERYARG"
echo "REMAINING ARGUMENTS:" "$@"

おすすめ記事