在expect脚本中,在特定输出之后执行if语句

3

有没有一种方法,可以在看到特定输出时执行if语句?例如,当控制台显示“bad interpreter permission denied”时,我想执行类似“dos2unix file_name”的命令?

因此,逻辑将如下所示:

if (output is "bad interpreter permission denied")
{
  send dos2unix file_name
}
fi

这是一份expect脚本。
编辑:
我能在expect脚本中做这样的事情吗?
if (grep -cim1 '^M$' lruload.sh) -eq 1; then
send dos2unix filename
fi

这应该是Bash还是Expect? - Charles Duffy
(另外,有更好的方法来检测是否需要运行“dos2unix”;为什么不直接进行测试呢?) - Charles Duffy
这似乎仍然非常像一个遵循最佳实践的情况,可以防止手头的问题首先出现; 然而,没有足够的上下文来更清晰地解决它。无论如何 - 如果您想要原生的 expect 答案,您可能还应添加 tcl 标志,因为 expect 脚本是以 TCL 为本地编写的。 - Charles Duffy
@CharlesDuffy 我该如何在一开始就防止这种情况发生? - tiger_groove
@kkmoslehpour,一个改进的方法是无条件地运行dos2unix!如果文件已经使用UNIX换行符,这不会有任何影响,并且减少了涉及条件逻辑的数量。为了找到更好的解决方案,我需要了解有关导致文件以其所在格式存在于系统中的工作流程的更多信息;可能可以在SCM配置、文件传输设置或其他地方进行调整。 - Charles Duffy
显示剩余3条评论
2个回答

1
当您说执行命令时,我希望您是指在shell中执行命令。您可以使用exec命令来实现此目的。
我不确定您正在与哪里进行交互。我是说像telnet、ftp或bash。无论如何,在任何情况下,您都将发送一个命令并期望得到提示。
send "command 1"
expect "prompt"
send "command 2"
expect {
    timeout { puts "timeout happened"}

    "bad interpreter per mission denied" {
         set result [exec dos2unix <filename>]
     }
}
# if need to intact with three application, further use 'send' and 'expect'

你有一个名为 result 的变量,用于存储 dos2unix 命令的输出结果。

0
这个逻辑/伪代码怎么样?
export cmdText=`myCmd param1 param2 2>&1`
if ($cmdText is "bad interpreter permission denied")
{
    send dos2unix file_name
}
fi

权限被拒绝的文本可能已经发送到stderr而不是stdout,因此重定向2>&1将它们两个合并在一起,使测试变得简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接