2

getopts「名前のない」引数が名前の付いた引数の前にある場合、なぜすべての引数を無視するように見えるのかを理解しようとしています。

http://wiki.bash-hackers.org/howto/getopts_tutorialの例を使用して、

#!/bin/bash

while getopts ":a" opt; do
  case $opt in
    a)
      echo "-a was triggered!" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
  esac
done

そして結果を観察する:

$ ./opt_test
$ ./opt_test -a
-a was triggered!
$ ./opt_test -a -f
-a was triggered!
Invalid option: -f
$ ./opt_test a -a -f
$ ./opt_test a -a
$ ./opt_test a -f
$ ./opt_test lala -f
$ 

したがって、名前のない引数(ダッシュのない引数)を前に付けると、getoptsすべての引数が無視されるように見えます。

これはなぜですか、どうすれば回避できますか?そんなことをプログラムで捉えて、使い方画面を印刷できるようにしたいと思います。

4

4 に答える 4

3

プログラムが最初の非オプション引数に遭遇したときにオプションの処理を停止することは、かなり標準的な動作です。これは非常に多くの場合、まさにあなたが望むものです。たとえば、これについて考えてみましょう。

ssh someremotehost ls -l

オプションssh以外の最初の引数の後にオプションを処理しようとすると、リモートコマンドにパラメーターを渡すことができなくなります。getoptでサポートされているもう1つの標準は、オプションの処理が--引数で明示的に停止することです。そのため、次のような名前のファイルを削除できます-f

rm -- -f

コマンドラインのどこかでオプションを本当に処理したい場合は、独自のオプション処理ルーチンを作成できます。それほど難しいことではなく、長いオプション(--this-is-a-long-option)のサポートも実装できます。

于 2011-11-18T14:49:51.580 に答える
2

私が使用する回避策は、配列スライスをgetoptsに渡すことです。

これの代わりに:

while getopts ":a" opt; do

これを試して:

while getopts ":a" opt ${@:2}; do

これにより、getoptsが2番目から最後の引数を渡して解析し、正しく機能して最初の引数を無視します。

于 2014-02-24T17:27:32.957 に答える
1

getoptsドキュメントからの引用:

「次のいずれかは、オプションの終わりを識別します。特別なオプション「-」、「-」で始まらない引数の検索、またはエラーの発生。」

于 2011-11-18T14:53:42.463 に答える
0

名前のない(位置の)引数の前にオプションを配置するには、shift後書きを使用してクリーンアップします。

たとえば、値のないオプションがある場合:

while getopts "u" opt; do
case $opt in
  u) USE_USERNAMES="TRUE"
  ;;
  \?) echo "Invalid option -$OPTARG" >&2
  ;;
esac
done

# Clean-up after arguments parsing
if test "$USE_USERNAMES"; then
  shift 
fi

または、値を使用して:

while getopts "s:" OPT; do
case $OPT in
  s) SUBMISSIONS="$OPTARG"
  ;;
  \?) echo "Invalid option -$OPTARG" >&2
      exit 1
  ;;
esac
done

# Clean-up arguments and assign default values AFTER arguments parsing
if test "$SUBMISSIONS"; then
  shift 2
else
  SUBMISSIONS="./logins.txt"
fi

# Move on to unnamed (positional) arguments
if ! test "$1"; then
  echo "ERROR: Required first argument missing"
  exit 1
fi

# Use arguments
echo "SUBMISSIONS: $SUBMISSIONS"
echo "FIRST ARG: $1"

参照

于 2015-03-02T17:02:12.357 に答える