2011-01-28 5 views
2

空白を含む文字列を解析するのではなく、文字列全体としてカウントできるようにしようとしています。KSHの引数の空白を数えますか?

$ ksh program.ksh "what up" 
File 'what up' not found. 

そして、これは私が取得していますものです::

$ ksh program.ksh "what up" 
File 'what' not found. 
File 'up' not found. 

は、これは私が仕事をするために試したコードです:

wflag=false 
cflag=false 

while getopts "cw" opt; do 
    case "$opt" in 
    c) 
     cflag=true 
     ;; 
    w) 
     wflag=true 
     ;; 
    /?) 
     ;; 
    esac 
done 
をこれは私が起きていたいものです

問題は、1)ksh program.ksh "what up"のようなものを試してみてください.2)ksh program.ksh "-w -c"のようなものを試してみます。もう1つは、私がwflagcflagを印刷したときのように、どちらも真です。ここで文字列として扱われるべきではない"-w -c"?カーネルのように思えます(カーネルはここで作業していますか?)。これは私の望むものではありませんが、これを解析しています。私はそれを空白文字列として扱いたい。私はWordSplittingを読んできました。(議論に関する記事は投稿できません))、と思うと私はそれを理解しています。明らかに私は何かを見逃しているか、実際にはそれを理解していないはずです:P

私の本能は、何かが空白を自動的に取り除く何かがgetoptsと私に伝えます。私は"$opt"の代わりに$(opt)を試しただけでなく、中括弧や一重引用符で囲みました。悲しいかな、葉巻。

ご協力いただければ幸いです。このテキストの壁を通して読んでいただきありがとうございます。

答えて

2

caseステートメントの最後の項目は、スラッシュの代わりにバックスラッシュを使用する必要があります。診断のためにいくつかの変更を加えて、何が起きているかを確認しましょう。

$ ./script.ksh -c 
opt [c] 
cflag true 
wflag false 

ファイン:

#!/bin/ksh 
wflag=false 
cflag=false 

# the first colon means suppress error messages 
# the colon after the x means that -x requires an argument 
while getopts ":cwx:" opt 
do 
    echo "opt $opt" 
    case "$opt" in 
     c) 
      cflag=true 
      ;; 
     w) 
      wflag=true 
      ;; 
     x) 
      echo "x is an option, $OPTARG is its argument" 
      ;; 
     \?) 
      echo "invalid option" 
      ;; 
     *) 
      echo "missing argument" 
      ;; 
    esac 
done 
echo "cflag $cflag" 
echo "wflag $wflag" 

それでは、いくつかの方法、それを呼び出してみましょう。

$ ./getoptstest.ksh -c -w 
opt [c] 
opt [w] 
cflag true 
wflag true 

また、

$ ./getoptstest.ksh -cw 
opt [c] 
opt [w] 
cflag true 
wflag true 

しかし、私たちの答えは予告されています。

$ ./getoptstest.ksh '-c -w' 
opt [c] 
opt [?] 
invalid option 
opt [?] 
invalid option 
opt [w] 
cflag true 
wflag true 

ここではどこかになっています。 Kornシェルmanページは言う:

大手:optstringのは OPTARGに無効なオプションの文字を格納するためにgetoptsはを引き起こし、にセットVNAMEにして? 不明のオプションと:必要なオプション引数が欠けている場合 - ing。それ以外の場合、getoptsはエラー・メッセージを出力します。

最後の例の前の例からわかるように、-cwのようにオプションを一緒に実行できます。'-c -w'のようなオプションを渡すと、は-c-space---wと表示されます。だから、2つの無効なオプション(---space)に加えて、それは-c-wの両方を見て、両方フラグがセットになっている理由です。 (元のスクリプトが質問に掲載されている方法です)先頭のコロンがなければ、あなたはこれらのようなエラーメッセージが取得する必要があります。

./script.ksh: - : unknown option 
./script.ksh: --: unknown option 

をよく見ると、あなたは証拠となるスペースや余分なダッシュをわかります。

manページでは、getoptsが個別に渡された引数を処理する機能や、一緒に束ねる機能を処理する機能については説明していません。

ksh program.ksh "what up"の例に何か問題があるかどうかわかりません。

これらのオプションと引数を使用して、変更されたスクリプトを試して、残りの仕組みを確認してください。

./script.ksh -x 
./script.ksh -x foo 
./script.ksh -z 
./script.ksh -c bar -w 

最後の1つはトリッキーです。ダッシュで始まらない引数が見つかった場合、前のオプションで引数が取られない場合、getoptsは処理を停止し、残りの引数はそのまま残ります。 whileループの後にshift $(($OPTIND - 1))を使用すると、通常の方法で残りの位置パラメータにアクセスできます。

残念ながら、シェル組み込みgetoptsは、--versionのような長いオプションを処理しません。外部ユーティリティーgetoptはありますが、使用時に対処しなければならない問題がいくつかあります。

+0

このような明確かつ役立つ回答をいただきありがとうございます。残念なことに、 'getopts'は長いオプションをサポートしていないので、これを達成する別の方法を見つけなければならないかもしれません。多分、すべての引数を配列に格納し、それらを一度に1つずつ処理することを試みます。助けてくれてありがとう! – Fred

+0

ksh93を使用している場合、その 'getopts'組み込み関数には、長いオプションを可能にする拡張機能があります。 – jilles

+0

@Alex:@jillesはksh93で 'getopts'が長いオプションを許可していることを知っておくべきです。これは、[official 'man's page](http://www2.research.att.com/sw/download/man/man1/ksh.html)には記載されていませんが、' getopts --man'に記載されています。しかし、 ' bloat '。 –