【问题标题】:Unix create and use variables inside expect scriptUnix在expect脚本中创建和使用变量
【发布时间】:2015-05-06 22:26:49
【问题描述】:

在我尝试自动访问远程计算机时, 我正在尝试在期望脚本中创建和使用变量。

我正在尝试执行以下操作:

#!/bin/csh -f
/user/bin/expect<<EOF_EXPECT
set USER     [lindex $USER 0]
set HOST     [lindex $HOST 0]
set PASSWD   [lindex $PASSWD 0]
set timeout 1
spawn ssh $USER@$HOST
expect "assword:"
send "$PASSWRD\r"
expect ">"
set list_ids (`ps -ef | grep gedit | awk '{ print $2 }'`)
expect ">"
for id in ($list_ids)
    send "echo $id\r"
end
send "exit\r"
EOF_EXPECT

此代码的几个挑战:

  1. ps | grep | awk 行不像在 shell 中那样工作。它不仅使用awk 命令提取pid。相反,它占用了整行。

  2. 变量 $list_ids 无法识别,尽管我使用我认为是期望脚本中的变量设置来设置它。

  3. 最后,如何进行for循环,以便识别$id$id_list

我正在使用 csh。 $env(list_ids) 对我不起作用,$env 未定义。

【问题讨论】:

    标签: unix awk ssh expect csh


    【解决方案1】:
    1. shell 和tcl 变量都标有$。您的此处文档的内容正在由您的外壳扩展。你不想要那个。 csh 没有 $2 的值,因此将其扩展为空字符串,awk 命令最终变为 ps -ef | grep gedit | awk '{ print }'。这就是为什么您会在输出中获得整行。

      您的上下文在这里有点混乱。如果您希望它通过嵌入式 awk 命令,您需要从外部 csh 中转义 $。 (这很可怕,但显然 csh 就是这种情况。)

      一般情况下,您不需要尝试合并 csh 和 tcl 命令/等。像这样,它将极大地帮助您了解正在发生的事情。

    2. “无法识别”是什么意思?您是否收到任何其他错误(例如来自 set 命令)?
    3. 我想你在找foreach:

      $ tclsh
      % foreach a [list 1 2 3 4] b [list 5 6 7 8] c [list a b c d] d [list w x y z]
          puts "$a $b $c $d"
      }
      1 5 a w
      2 6 b x
      3 7 c y
      4 8 d z
      %
      

    $env(list_ids) 是一个 tcl 变量。 csh 对此一无所知,与任何事情无关(除了上面第一点中的问题,请避开它​​)。如果您在运行tcl 脚本的csh 会话中导出list_ids,那么$env(list_ids) 应该在expect 脚本中工作。

    我不认为您不希望 () 围绕 set 命令中的值。我相信它们是字面的。如果您尝试从该ps 管道的(shell 扩展)输出创建一个 tcl 列表,那么您需要:

    set list_ids [list `ps ....`]
    

    但正如我之前所说,你真的不想像那样混合上下文。

    如果您可以使用非csh shell,这可能也会有所帮助,因为csh 通常根本不好。

    另外,如果您可以直接编写一个期望脚本作为脚本文件,那么不将期望脚本嵌入到 csh 脚本中会有所帮助。

    【讨论】:

    • 谢谢! [list ....] 真的很有帮助。我不得不使用csh,它是更大脚本的一部分。 foreach 在我的expect 脚本下无法识别,所以我最后使用了while。把我的答案贴在下面。
    【解决方案2】:

    在这里阅读对我有很大帮助: http://antirez.com/articoli/tclmisunderstood.html

    以下几行可以解决所有问题:

    set list_ids [list {`ps -ef | grep gedit | awk '{print \$2 }'}]
    set i 0
    while {[lindex \$list_ids \$i] > 0} {
      puts [lindex \$list_ids \$i]
      set i [expr \$i + 1]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      相关资源
      最近更新 更多