2011/09/07

using RANDOM number in `expect` 在expect中 使用亂數

expect 超好用
尤其是 加上 autoexpect
根本就是 Office 裡的 巨集錄製 功能
只要你照著做一次 她就幫你做好整個架構
你只需要做些小修剪 就可以上線了

但是 很討厭的是
expect 裡面 沒有亂數(random number)功能
所以 我有些地方 想要他做些不同的改變 就很麻煩

我試著 用 bash 裡的變數 $RANDOM 去給 expect 用:
#!/usr/bin/expect -f
set var_r $env(RANDOM)
send "rand=$var_r.\n\r"
但是 RANDOM 不算是 環境(ENVironment)變數
所以 會出這種錯誤:
can't read "env(RANDOM)": no such variable
    while executing
"set var_r $env(RANDOM)"
    (file "xxx.exp" line 2)
解決辦法: 先 export/declare 這個變數 讓環境變數中 有叫做 'RANDOM' 的東西:
# export RANDOM
# xxx.exp
rand2=18835. 
看起來 問題似乎解決了! 真Happy...
再來玩一次!
# xxx.exp
rand2=18835.
@@"
阿不是亂數嗎? 怎每次出來結果都一樣?
原來... 我們 export RANDOM 時, 只給他一個叫RANDOM的變數名跟當下的變數值
他沒法像bash 給你的 $RANDOM 一樣 每次都會丟不同的數值出來
變成 每次要執行 .exp 檔之前 要先自己想辦法 export RANDOM 一次!
而且 如果 .exp 用到$RANDOM不只一次 .... 每個人抓到的亂數都會是一樣的
這.....
只好換跑道..........

轉向 "system" 命令下手!
system 後面 就直接接 你要 shell 做的事情 就對了
所以 就直接這樣亂搞:
system "export RANDOM"
哈哈... 結果,子程序(shell)的環境變數,無法上傳回去給老爸!
所以......
換個方向 再來亂搞:
system "/bin/echo $RANDOM"
沒想到.....  出現這訊息:
can't read "RANDOM": no such variable
    while executing
"system "/bin/echo $RANDOM ""
    (file "xxx.exp" line 2)
嗯... expect 的變數名 也都用 "$" 開頭
看樣子 他是以為我要叫他把 expect 的變數印(echo)出來?
好吧~ 給他個 escape  再來亂搞:
system "/bin/echo \$RANDOM"
Hahaa... 亂數終於出現!!
但是.... system echo出來的東西 我要怎樣拎回 expect 裡用?
這樣玩看看?
set var_r [system /usr/bin/expr \$RANDOM]
=_="
直接在銀幕上印一個亂數
但是 我要處理的變數 竟然直接回空字串給我

好吧~
再換跑道... 繼續亂搞:
set var_r [exec /bin/echo \$RANDOM]
結果:
rand=$RANDOM.
~_~"
大哥~ 我是要你  echo $RANDOM 這個變數出來! 不是要你印 "$RANDOM" 這幾個字出來
真是欠人罵!

後來想想, exec 指令 應該是叫用 execle 這類函式,所以老爸的環境不會被複製做去
這下怎處理? =_="

exec 生了個 沒有 RANDOM 的環境出來
那麼 我就硬生一個 有RANDOM的環境出來給他 不就好了?
所以......


終極的一招:
set var_r [exec /bin/bash -c "/bin/echo \$RANDOM"]
呵呵~
再小修改一下,方便後面 if 判斷:
set var_r [exec /bin/bash -c "/usr/bin/expr \$RANDOM % 2 + 1"]
if ($var_r==1) {
  send "111\n\r"
} else {
  send "2222\n\r"
}

其中, 不知道為什麼原因
當 expr 送 "0" 回來 會出現錯誤?
這得有請高手解答了~
我的解法是: 不要讓他回  "0" 就好啦~
所以最後面會多 " + 1 "  XD

child process exited abnormally
    while executing
"exec /bin/bash -c "/usr/bin/expr \$RANDOM % 2 ""

沒有留言:

張貼留言