如何在expect条件语句中使用bash脚本变量

时间:2012-06-21 04:01:16

标签: bash expect

我正在写一个bash脚本并使用expect来做sftp。现在在expect块中我想在条件语句中访问bash变量。但是,我无法这样做。有人可以帮忙吗?此外,此脚本的执行是从c程序控制的,我不会将输出重定向到日志文件(这也是动态的)。我可以这样做并抑制标准输出上的所有输出 这是代码

!/usr/bin/bash   
host=$1  
user=$2  
pass=$3  
action=$4  
path=$5  
echo "Starting...."  

function doAction {  

strAction="\""$action"\""  
echo $strAction  

/usr/bin/expect <<EOF > logfile.txt  
**set bashaction $strAction**  
spawn sftp $user@$host  

expect "password:"   
send "$pass\r"  
expect"sftp>"  
send "cd $path\r"  
**if {$bashaction == "TEST"} {**  
  expect "sftp>"  
  send "prompt\r"  
}  

expect "sftp>"  
send <sftp command>  
expect "sftp>"  
send_user "quit\n"  

exit  
  EOF  
}  

doAction  
echo "DONE....."  

for 1.使用expect脚本代替工作。
对于日志记录问题,使用log_user 0和log_file -a help

3 个答案:

答案 0 :(得分:11)

您无需使用bashexpect可以处理所有这些:

#!/usr/bin/expect

set host [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
set action [lindex $argv 3]
set path [lindex $argv 4]
puts "Starting...."  

puts "\"$action\""
spawn sftp $user@$host  

expect "password:"   
send "$pass\r"  

expect"sftp>"  
send "cd $path\r"  

if {$action == "TEST"} {
    # Do something
} else {
    # Do something else
}

expect "sftp>"  
send_user "quit\r"  

puts "DONE....."

来自bash,Tcl / Expect语法有点奇怪,但扩展上述骨架不应该有任何问题。祝你好运。

答案 1 :(得分:2)

从TCL和Expect访问环境变量

由于您从另一个进程调用此Expect脚本,因此可以使用环境变量。例如,如果您的父进程已将操作导出到环境中,那么您可以使用以下命令在期望脚本中访问其值:

$::env(action)

在Bash中,您可以使用 export 内置mark the variable for export。例如:

export action

由于我不确定您是如何从C调用Expect脚本的,因此您可以确保正确导出该变量。

禁用记录到标准输出

要禁止从生成的进程记录到标准输出,Expect将提供log_user命令。您可以使用log_user 0阻止生成的进程写入标准输出。

expect(1)手册说:

  

默认情况下,发送/期望对话框会记录到stdout(和a   logfile如果打开)。命令禁用了对stdout的日志记录   “log_user 0”并由“log_user 1”重新启用。记录到日志文件   没有改变。

这实际上并不是关闭标准输出,这通常不是你想要的。这样做会导致写入stdout的任何内容抛出如下错误:

can not find channel named "stdout"
    while executing
"puts hello"
    (file "/tmp/foo" line 8)

答案 2 :(得分:0)

要禁止输出到标准输出,您可以使用

command here >/dev/null 2>/dev/null

要写入日志文件,如果要在长管道中间写入输出,可以使用类似的管道(>>>)或tee命令