Unix在expect脚本中创建和使用变量

时间:2015-05-06 10:52:09

标签: unix awk ssh expect csh

在我尝试自动访问远程计算机时, 我试图在expect脚本中创建和使用变量。 我正在尝试执行以下操作: #!/ bin / csh -f /用户/箱/预期<< EOF_EXPECT 设置USER [lindex $ USER 0] 设置主机[lindex $ HOST 0] 设置PASSWD [lindex $ PASSWD 0] 设置超时1 产生ssh $ USER @ $ HOST 期待" assword:" 发送" $ PASSWRD \ r" 期待">" set list_ids(`ps -ef | grep gedit | awk' {print $ 2}'`) 期待">" 用于($ list_ids)中的id     发送" echo $ id \ r" 结束 发送"退出\ r" EOF_EXPECT 这段代码有几个挑战: ps | grep | awk行不会在shell中起作用。它不使用awk命令仅提取pid。相反,它需要整行。 变量$ list_ids是无法识别的,虽然我使用我认为是期望脚本中的变量设置来设置它。 最后,如何进行for循环以便识别$ id和$ id_list? 我正在使用csh。 $ env(list_ids)对我不起作用,$ env未定义。

2 个答案:

答案 0 :(得分:0)

  1. shell和tcl变量都标有$。您的shell将扩展此文档的内容。你不希望这样。 csh没有$2的值,因此将其展开为空字符串,awk命令最终变为ps -ef | grep gedit | awk '{ print }'。这就是为什么你在输出中得到整行。

    你的背景有点困惑。如果您希望它通过嵌入式awk命令,则需要从外部$转义csh。 (这很可怕,但显然是csh的情况。)

    通常,您不需要尝试合并csh和tcl命令/ etc.像这样,它将极大地帮助你了解正在发生的事情。

  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
    %
    
  4. $env(list_ids)是一个tcl变量。那个csh对它一无所知与任何东西无关(除了上面第一点的问题,所以逃避它)。如果您在运行list_ids脚本的csh会话中导出tcl,那么$env(list_ids)应该在expect脚本中运行。

    您不希望()命令中的值set左右我想不到。我相信他们是字面意思。如果您尝试从ps管道的(shell展开)输出创建一个tcl列表,那么您需要:

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

    但正如我之前所说,你真的不想混合这样的背景。

    如果您可以使用非csh shell,这可能对此有帮助,因为csh一般都不是很好。

    此外,如果您可以直接将expect脚本编写为脚本文件,则不在try脚本中嵌入expect脚本会有所帮助。

答案 1 :(得分:0)

在这里阅读帮助了我很多: 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]
}