期望脚本无法从文件中读取mkdir并执行

时间:2014-12-28 15:38:12

标签: shell cygwin expect mkdir

这是this topic的延续;因为这是与OP不同的问题我正在制作一个新主题。我有一个期望脚本我无法工作,应该从文件中读取命令并执行它们。这是脚本本身,称为script.sh

#!/usr/bin/expect

set prompt {\$\s*$}
set f [open "script_cmds_u.txt"]
set cmds [split [read $f] "\n"]
close $f

foreach cmd $cmds {
    spawn $cmd
    expect -re $prompt
}

expect eof
close

文件script_cmds.txt如下所示:

mkdir cmdlisttest1
mkdir cmdlisttest2

要运行我使用的脚本

tr -d '\r' < testpswd2.sh > testpswd2_u.sh
tr -d '\r' < script_cmds.txt > script_cmds_u.txt
chmod +x testpswd2_u.sh
./testpswd2_u.sh

这样做我收到以下错误:couldn't execute "mkdir cmdlisttest1": no such file or directory

所以我尝试了一些改变:

  • 在循环中将其更改为send $cmd。这会将输出更改为mkdir cmdlisttest1couldn't compile regular expression pattern: invalid escape \ sequence。我也会在\n中的命令之后使用\rscript_cmds.txt尝试此操作。
  • 删除循环中的expect -re $prompt。然后我得到mkdir cmdlisttest1mkdir cmdlisttest2并挂起。
  • spawn "\n"之后加send $cmd;然后我得到

    mkdir cmdlisttest1spawn

    couldn't execute "

    ": no such file or directory

1 个答案:

答案 0 :(得分:4)

错误是由于spawn将整个字符串(例如:mkdir cmdlisttest1)作为不带参数的命令。

请尝试使用argument expansion(感谢@glenn jackman):

foreach cmd $cmds {
    spawn {*}$cmd
    expect -re $prompt
}

另一种选择:

foreach cmd $cmds {
    spawn [lindex $cmd 0] [lrange $cmd 1 [llength $cmd]]
    expect -re $prompt
}

使用[lindex $cmd 0],您将获得 mkdir ;
使用[lrange $cmd 1 [llength $cmd]],参数(例如 cmdlisttest1 )。

  

lindex 列表索引
      从列表中返回索引的第#项。注意:列表从0开始,而不是1,因此第一项是索引0,第二项是索引1,依此类推。

     

lrange 列出最后一个
      返回由列表中的第一个到最后一个条目组成的列表。如果first小于或等于0,则将其视为第一个列表元素。 如果last为end或值大于列表中元素的数量,则将其视为结束。如果first大于last,则返回空列表。