Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如果不使用通配符,工具将不匹配换行符_Linux_Bash_Shell_Centos_Expect - Fatal编程技术网

Linux 如果不使用通配符,工具将不匹配换行符

Linux 如果不使用通配符,工具将不匹配换行符,linux,bash,shell,centos,expect,Linux,Bash,Shell,Centos,Expect,我正在编写一个脚本,使用Expect远程安装linux软件更新(使用.bin更新工具)。我在匹配一个块时遇到了问题,我尝试了一系列变体,但都没有成功。我已经使用了其他类似的脚本,但是我使用了通配符来匹配换行符,在这种情况下,我需要确保文件列表正是我所期望的,所以我不想用任何可能隐藏不匹配的通配符来分解它 有人能看一下并告诉我我做错了什么吗 控制台输出,普通 检查本地修改。 Jira目录中所做修改的列表。 下面提供了中的文件修改列表 atlassian jira目录。 修改的文件: atlassi

我正在编写一个脚本,使用Expect远程安装linux软件更新(使用.bin更新工具)。我在匹配一个块时遇到了问题,我尝试了一系列变体,但都没有成功。我已经使用了其他类似的脚本,但是我使用了通配符来匹配换行符,在这种情况下,我需要确保文件列表正是我所期望的,所以我不想用任何可能隐藏不匹配的通配符来分解它

有人能看一下并告诉我我做错了什么吗

控制台输出,普通

检查本地修改。
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。