17

シェル getopts コマンドで解析する必要がある空白を含む引数を処理する方法を探しています。

while getopts ":a:i:o:e:v:u:" arg
  do
  echo "ARG is: $arg" >> /tmp/submit.log
  case "$arg" in
  a) arg1="$OPTARG" ;;
  i) arg2="$OPTARG" ;;
  o) arg3="$OPTARG" ;;
  ...
  u) argn="$OPTARG" ;;
  -) break ;;
  \?) ;;
  *) echo "unhandled option $arg" >> /tmp/submit.log ;;
  ?) echo $usage_string
     exit 1 ;;
  esac
done

-u に "STRING WITH WHITE SPACE" のような引数がある場合、文字列の最初の部分だけがトリガーされ、while ループは最後まで実行されません。

どうもありがとう。

4

2 に答える 2

39

若いプレイヤーのための罠 (つまり私!)

次のような行に注意してください。

main $@

本当に必要なものは次のとおりです。

main "$@"

そうしないgetoptsと、オプションが細かく分割されます

http://www.unix.com/shell-programming-scripting/70630-getopts-list-argument.html

于 2011-11-20T02:19:51.647 に答える
12

Matが指摘しているように、スクリプトフラグメントはすでに正しいです。シェルからスクリプトを呼び出す場合は、引数を適切に引用する必要があります。

myscript -u "string with white space"
myscript -u 'string with white space'
myscript -u string\ with\ white\ space
myscript -u string' w'ith\ "whi"te" "''space

これらの引用符を要求することはスクリプトの欠陥ではなく、呼び出し元のシェルが機能する方法です。すべてのプログラム、スクリプト、またはその他のプログラムは、文字列のリストとして引数を受け取ります。呼び出し元のシェルの引用符は、これらの引数を個別の「単語」(リスト要素)に並べ替えるために使用されます。上記のすべての呼び出し(UNIXシェルから作成)は、3つの文字列のリストをスクリプトに渡します。$0はスクリプト名(myscript)、$1-u$2は文字列string with white spaceです。

于 2011-05-16T20:23:48.573 に答える