4

getopts がそれらを処理できるようにするために、コマンドライン引数を bourne スクリプト内から関数に渡すことは可能ですか?

スクリプトの残りの部分は関数にうまくまとめられていますが、引数の処理をメイン ロジックに移動する必要があるように見え始めています。

以下は現在の記述方法ですが、機能しません。

processArgs()
{
  while getopts j:f: arg
  行う
  echo "${arg} -- ${OPTARG}"
     ケース "${arg}" in
       j) if [ -z "${filename}" ]; それから
           job_number=$OPTARG
           そうしないと
              echo "ファイル名 ${filename} は既に設定されています。"
              echo "ジョブ番号 ${OPTARG} は無視されます。
           フィ;;
       f) if [ -z "${job_number}" ]; それから
              ファイル名=$OPTARG
           そうしないと
              echo "ジョブ番号 ${job_number} は既に設定されています。"
              echo "ファイル名 ${OPTARG} は無視されます。"
           フィ;;
     エサック
  終わり
}

doStuff1
プロセス引数
doStuff2

スクリプトの引数を読み取れるように関数を定義することは可能ですか? これを他の方法で行うことはできますか?私は getopts の機能が気に入っていますが、この場合、それを取得するにはコードの美しさを犠牲にする必要があるようです。

4

1 に答える 1

6

変数の後に引数を getopts に指定できます。デフォルトは $@ ですが、これはシェル関数が引数を表すために使用するものでもあります。解決策は、スクリプトのすべてのコマンドライン引数を個々の文字列として表す "$@" を processArgs に渡すことです。

processArgs "$@"

それをスクリプトに追加し(そして11行目の引用を修正し)、意味不明なテスト引数を試します:

$ ./try -j asdf -f fooo -fasdfasdf -j424pyagnasd
j -- asdf
f -- フー
ジョブ番号 asdf はすでに設定されています。
ファイル名 foo は無視されます。
f -- asdfasdf
ジョブ番号 asdf はすでに設定されています。
ファイル名 asdfasdf は無視されます。
j -- 424pyagnasd
于 2008-12-09T08:02:30.150 に答える