2012-04-09 14 views
4

expectスクリプトでexpectコマンドをどのようにして正確な文字列が一致するのを待ってからスクリプトの次の行に進むかを知りたい。expectプログラムスクリプトのexpectコマンドを正確な文字列の一致を待つ方法

Bourneシェル(SH)スクリプト:

#!/bin/sh 
#!/usr/bin/expect 

spawn ssh -Y [email protected] 
expect -exact "[email protected]'s password: " 

# replace password with ur own passwd 
send "geomax45\r" 

# replace the prompt with ur own prompt 
expect "[email protected]:~$ " 

# run application 
send "./sample\r" 

expect "*Menu*\r 
1. print hello world\r 
2. print Bye world\r 
3. quit\r 
enter choice: " 
# enter choice 1 
send "1\r" 
expect "Bye world\r 
*Menu*\r 
1. print hello world\r 
2. print Bye world\r 
3. quit\r 
enter choice: $" 
# enter choice 2 
send "2\r" 

上記のコードでコード1を入力した後は、画面上で発生する "さようなら世界\ rを......" という文字列を待つ必要があります。しかし、画面に別の文字列が表示されても、コードは次の行を実行して、オプション2を入力します。これは、expectの定義に従って行われません。 expectコマンドの完全な文字列が一致するまで待機する必要があります。

厳密な文字列の一致が発生するまで待つように、より厳しいコマンドを使用できるかどうかを知りたいです。この問題で私を助けてください

+1

あなたのスクリプトに 'exp_internal 1'を追加してください - これは冗長で、あなたが今試合が試行されていることを示しているので、なぜ試合が成功したのか分かります。 –

答えて

3

すでにあなたのスクリプトでこれを使用しています:expect -exact。しかし、長いマッチング文字列は問題を引き起こすことがほぼ保証されています。必要ならば複数のexpectコマンドに分割して、一番小さい一意のマッチにカットしてください。

この場合、表示する内容に基づいて、適切なコマンドはおそらくexpect -exact "choice:"です。しかし、本質的には、可能なプログラム出力の完全な詳細なしにこれを判断することは不可能である。

+0

私はexpect - exactコマンドを使用しようとしましたが、 "expect"は前のステップで正確な文字列のマッチングなしに次のコマンドを実行できるようにしています。 " – chaitu

+0

まだ複数行の文字列全体を一致させようとしていますか?私が言ったように、それは動作しません( 'match_max'と' 'expect''マンページの' 'システムの消化不良 ''についての議論を参照してください)。おそらく、タイムアウトもチェックするべきです。 – geekosaur

関連する問題