2016-08-10 8 views
-1

私は、1つの変数を使用して2番目の変数を生成しようとしています。 しかし、変数の後ろのアンダースコアを変数の一部として扱っています。 この状況で変数を認識させるにはどうすればよいですか?expectスクリプトでアンダースコアの前に真正なimmediatlyを使用するには?

エラー

can't read "v_host_": no such variable 
    while executing 
"set v_log_file "/some/loc/dir_$v_host_*/file.log"" 
    (file "./test.exp" line 3) 

スクリプトを期待:

#!/usr/bin/expect -f 
... 
set v_host [lindex $argv 0] 
set v_log_file "/some/loc/dir_$v_host_*/file.log" 

更新:正しいエラーメッセージをコピーしました。

答えて

2

あなたは実際はこれを言う:

set v_log_file "/some/log/dir_"$v_host"_*/file.log" 

これは法的なTclのコードではありません。二重引用符を使用している場合は、単語全体にそれらを入れる必要があります。これはと異なるとbashです。代わりに、これを行う:

set v_log_file "/some/log/dir_${v_host}_*/file.log" 

つまり、残りの文字列と区別するために、変数の名前の前後にカッコを入れることです。

set v_log_file "/some/log/dir_" 
append v_log_file $v_host 
append v_log_file "_*/file.log" 

どちらのアプローチが有効です。それとも、その最初の引数(setと同じ)変数名であるappend、と断片的な文字列を構築することができます。 (私は2つの作業方法のうち最初の方が好きですが、YMMVです)

+1

最後の文の "最初の"は、中括弧の使用を指しています。 –

+0

ありがとう、中括弧を使用して私のスクリプトを少しきれいにします。 – ScrappyDev

0

私は連結を試みて参加しましたが、何らかの理由で空白を追加していました。

代わりにappendを使用してしまい、予想される結果が得られました。 APPENDを

#!/usr/bin/expect -f 
... 
set v_host [lindex $argv 0] 
set v_log_file "/some/loc/dir_" 
append v_log_file "$v_host" "_*/file.log" 

結果:

/some/loc/dir_hostname_*/file.log 

更新ピーターLewerinがキャッチ 修正し誤植。あなたのファイルで

+1

本当ですか? 'append'の最初の引数が変数名であると考えられているので、私は尋ねています(他の引数は変数の値に追加されます。たとえば、' append v_log_file $ v_host _ */file.log')。 'set v_log_file"/some/loc/dir _ $ {v_host} _ */file.log "は簡単です。 –

+0

中括弧の使用がうまくいきませんでした(最初に試したことの1つ) – ScrappyDev

関連する問題