Linux 如果不使用通配符,工具将不匹配换行符
我正在编写一个脚本,使用Expect远程安装linux软件更新(使用.bin更新工具)。我在匹配一个块时遇到了问题,我尝试了一系列变体,但都没有成功。我已经使用了其他类似的脚本,但是我使用了通配符来匹配换行符,在这种情况下,我需要确保文件列表正是我所期望的,所以我不想用任何可能隐藏不匹配的通配符来分解它 有人能看一下并告诉我我做错了什么吗 控制台输出,普通Linux 如果不使用通配符,工具将不匹配换行符,linux,bash,shell,centos,expect,Linux,Bash,Shell,Centos,Expect,我正在编写一个脚本,使用Expect远程安装linux软件更新(使用.bin更新工具)。我在匹配一个块时遇到了问题,我尝试了一系列变体,但都没有成功。我已经使用了其他类似的脚本,但是我使用了通配符来匹配换行符,在这种情况下,我需要确保文件列表正是我所期望的,所以我不想用任何可能隐藏不匹配的通配符来分解它 有人能看一下并告诉我我做错了什么吗 控制台输出,普通 检查本地修改。 Jira目录中所做修改的列表。 下面提供了中的文件修改列表 atlassian jira目录。 修改的文件: atlassi
检查本地修改。
Jira目录中所做修改的列表。
下面提供了中的文件修改列表
atlassian jira目录。
修改的文件:
atlassian jira/WEB-INF/classes/seraph-config.xml
bin/setenv.sh
conf/server.xml
删除的文件:
(无)
添加的文件:
atlassian jira/WEB-INF/classes/crowd.properties
[输入]
我最近一次尝试匹配它并发送Enter(换行符仅添加到堆栈溢出中,不存在于脚本中
expect{*检查本地修改*修改的文件:\r\n\t拉森jira/WEB-INF/classes/seraph config.xml\r\n\tbin/setenv.sh\r\n\tconf/server.xml\r\n删除的文件:\r\n\t(无)\r\n添加的文件:\r\n\t拉森jira/WEB-INF/classes/crowd.properties\r\n\r\n\[Enter\]}
当我使用-d
标志运行expect
时,它将打印以下内容:
expect:does“\r\nn\r\n\r\n检查本地修改。\r\n\r\n Jira目录中所做的修改列表。\r\n\r\n以下提供了LASSIAN Jira目录中的文件修改列表。\r\n\r\n修改的文件:\r\n\t LASSIAN Jira/WEB-INF/classes/seraph config.xml\r\n\tbin/setenv.sh\r\n\tconf/server.xml\r\n删除的文件:\r\n\t(无)\r\n添加的文件:\r\n\t lassian jira/WEB-INF/classes/crowd.properties\r\n\r\n[输入]\r\n“(生成id exp5)匹配全局模式”*检查本地修改*修改的文件:\r\n\t lassian jira/WEB-INF/classes/seraph config.xml\r\n\tbin/setenv.sh\r\n\tconf/server.xml\r\n删除的文件:\r\n\t(无)\r\n添加的文件:\r\n\t lassian jira/WEB-INF/classes/crowd.properties\r\n\r\n\[输入\]?否
我从外部bash脚本运行,如下所示:
!/usr/bin/env bash
set-e
sudo expect-d在Tcl中,嵌入大括号({}
)中的反斜杠转义字符串(如\r\n
)没有特殊意义。您应该在此处使用双引号
$tclsh
%放置{foo\tbar\r\n}
foo\tbar\r\n
%放入“foo\tbar\r\n”
富吧
%
据Tcl称:
- [6]大括号。
如果单词的第一个字符是大括号(
{
),且规则[5]不适用,则该单词将由匹配的右大括号(}
)终止。大括号嵌套在单词中:对于每个额外的大括号,必须有一个额外的右大括号(但是,如果单词中的左大括号或右大括号引用了反斜杠,则在查找匹配的右大括号时不计入该反斜杠).除下文所述的反斜杠换行以外,大括号之间的字符不进行任何替换
,分号、换行符、右括号或空格也不接受任何特殊解释。单词将由之间的字符组成在外支架中,不包括支架本身
但请注意,当您使用双引号时。要匹配[Enter]
,您需要编写\\\\[Enter\\\]
,因为默认情况下expect
语句使用全局样式匹配。例如:
$expect-c'spawn-noecho bash-c{echo“[Enter]”;expect-eof'
[输入]
$expect-c'spawn-noecho bash-c{echo“[Enter]”;expect“\\\[Enter\\\]”;expect eof'
[输入]
$expect-c'spawn-noechobash-c{echo“[Enter]”;expect-ex“\[Enter\]”;expect-eof'
[输入]
$
更新: 刚刚注意到你正在使用Bash的here doc。然后你必须再做一次级别引用
$expect spawn-noecho bash-c{echo“[Enter]”
>期望“\\[输入]”
>预期eof
>EOF
[输入]
$
或者您可以使用expect“\\\[输入\\\]”
>预期eof
>EOF
[输入]
$
根据
manbash
,对于,我需要进行两个更改以使其匹配:
正如所建议的,我需要用“
而不是{}
我还需要将-ex参数传递给expect命令,否则它仍然不匹配,即使调试输出逐字符指示输出与预期匹配
这就是我的结论,让它尽可能可读:
sudoexpect请查看我问题底部的更新。在尝试双引号后,except
仍会超时,但其调试输出表明字符串确实匹配。@Dov\[Enter\]
应该是\\[Enter\\\]
当我使用\\\[
时,我得到以下错误:命令名无效”在执行从“expect”中调用的“Enter\\”时输入\“检查本地修改。\r\n\r\n\r\n在Jira目录中所做的修改列表。\r\n\r\n以下提供了一个列表…”更新了答案。将expect嵌入到shell中比较混乱。请查看我的,您可以用它在shell代码中编写expect all。