如何在Expect条件语句中使用Bash脚本变量

如何在Expect条件语句中使用Bash脚本变量,bash,expect,Bash,Expect,我正在编写一个Bash脚本并使用Expect-to-do-sftp。现在在Expect块中,我想访问条件语句中的Bash变量。但是,我不能这样做。你怎么能做到这一点 此外,该脚本的执行由C程序控制,我希望将输出重定向到日志文件(这也是动态的)。我可以这样做并抑制标准输出上的所有输出吗 代码如下: !/usr/bin/bash host=$1 user=$2 pass=$3 action=$4 path=$5 echo "Starting...." function doAc

我正在编写一个Bash脚本并使用Expect-to-do-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....."
/usr/bin/bash
主机=$1
用户=$2
通行证=3美元
行动=4美元
路径=$5
回声“开始……”
函数作用{
strAction=“\”“$action”\”
回声反射

/usr/bin/expect您不需要使用Bash。expect可以处理所有这些:

#!/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语法有点奇怪,但是扩展上述框架应该不会有任何问题。

要将输出抑制为标准输出,可以使用

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

若要写入日志文件,则可以使用类似的管道(<代码> >代码>或<代码> > >代码>),或者如果要在长管道的中间写入输出,请使用<代码> TE/<代码>命令。 由于您是从另一个进程调用此Expect脚本,因此可以使用环境变量。例如,如果您的父进程已将操作导出到环境中,则您可以通过以下方式访问Expect脚本中的值:

$::env(action)
在Bash中,可以使用导出内置项。例如:

export action
因为我不确定您是如何从C调用Expect脚本的,所以由您来确保正确导出变量

禁用标准输出的日志记录 要禁用从派生进程到标准输出的日志记录,Expect提供log\U user命令。您可以使用
log\U user 0
阻止派生进程写入标准输出

expect(1)手册说明:

默认情况下,发送/期望对话记录到标准输出(和 日志文件(如果打开)。命令将禁用对标准输出的日志记录 “日志用户0”并由“日志用户1”重新启用。登录到日志文件 没有变化

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

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

是否需要
设置bashaction
?为什么不直接在if语句中引用
$strAction
?谢谢。我也做了同样的事情。同样,此脚本的执行是从c程序名控制的,我不想将输出重定向到日志文件(这也是动态的).我可以这样做并抑制所有的输出吗stdout@puneetagrawal是重定向命令输入/输出的答案