0

bash で getopts() 機能を使用して引数を解析する方法を学習しようとしていますが、私のプログラムでは、標準の -a -b -c タイプの引数に加えて、作業するファイルをいくつでも取得する必要があります。 、および無効な引数としてそれらをスローする代わりに、getopts にそれらを認識させる方法に関する情報が見つかりません。次に例を示します。

while getopts "a:b:c:d" flag
do

    echo Doing: "$flag" $OPTIND $OPTARG

    if [ "$flag" = a ]; then
        first="$OPTARG"
        echo Found argument: $first
    fi

... など、他の if ステートメントでも同様です。これは、私のプログラムが program -a -c のようなコマンドだけを必要とする場合にうまく機能しますが、代わりに program -a file.sh -c otherfile.sh のようなものを取り込む必要があります。

誰かがこのようなことをする方法の例を教えてもらえますか?

4

2 に答える 2

2

getoptsこれは、多かれ少なかれあなたがやりたいように使用し、実行する私のシェルスクリプトの断片です:

arg0=$(basename $0 .sh)

usage()
{
    echo "Usage: $arg0 [-qvF] [-s suffix] -j jdcfile file.msd" 1>&2
    exit 1
}

error()
{
    echo "$arg0: $*" 1>&2
    exit 1
}

Fflag=
suffix=
jdcfile=
qflag=
vflag=no
while getopts Fj:qs:v opt
do
    case "$opt" in
    (F) Fflag="-F";;
    (j) jdcfile="$OPTARG";;
    (q) qflag="-q";;
    (s) suffix="$OPTARG";;
    (v) vflag=yes;;
    (*) usage;;
    esac
done

shift $(($OPTIND - 1))

case $# in
(1) : OK;;
(*) usage;;
esac

if [ -z "$jdcfile" ]
then error "you did not specify which jdcfile to use (-j option)"
fi

msd_file=$1

あなたshiftが欠けている部分だと思います。getoptsそれと、処理ループ後のコマンドラインでの残りの引数の後続の処理。

この特定のプログラムの最後には、"$@"処理すべきファイル名が 1 つだけあります。この特定のプログラムでは、ファイルがまったくないか、複数のファイルがリストされているとエラーになります。その最終版を削除するcaseか、必要に応じて変更することができます。-j jdcfileこのコードは「オプション」も強制します。使用法メッセージに示されているように、これは必須の引数です。

の後のより典型的なパターンは次のshiftようになります。

for file in "$@"
do
    ...processing of $file...
done

これでは、ファイル名がゼロの場合に対処する必要があります。

および関数はerrorusage有用なアウトライン/プロトタイプでもあります。:コメントに記載されているように、オプション文字列の先頭を希望する場合は、エラー処理を担当できます。私はそうしないことを選択しましたが、それが私が下した決定であることを忘れていました.

于 2012-05-28T19:11:47.077 に答える
0

上記の私のコメントに基づくと、これは必要ありませんgetopts。より単純なアプローチが機能します。

#!/bin/bash

args=()

for arg in "$@"
do
  case "$arg" in
    "-a" )
      echo "We have an '-a'!"
      ;;
    "-b" )
      echo "We have a '-b'!"
      ;;
    * )
      args+=($arg)
  esac
done

echo And we have these arguments: ${args[*]}

実行を確認するには:

$ ./program one -a two three -b four
We have an '-a'!
We have a '-b'!
And we have these arguments: one two three four
于 2012-05-28T19:29:51.700 に答える