Expect、sed和变量替换



我从bash脚本调用expect脚本,并传递一个用于sed字符串替换的参数。

但它在sed语句中错误地输出了变量的b/c。关于如何解决这个问题,有什么建议吗?我试过逃离/,但没有成功。

参数已成功传递(cde)

代码:

#!/usr/bin/expect -f
# ./sshlogin.exp uptime
set hosts {myhost.com}
set user root
set password xxxx
set mount [lindex $argv 0]
foreach vm $hosts {
    set timeout -1
    # now ssh
    spawn ssh $user@$vm -o StrictHostKeyChecking=no
    match_max 100000 # Look for passwod prompt
    expect "*?assword:*"
    # Send password aka $password
    send -- "$passwordr"
    # send blank line (r) to make sure we get back to gui
    expect "]# "
    send "sed -e -i 's/abc/${mount}/g' /my/files.newr"
    expect "]# "
    sleep 1
    send -- "exitr"
expect eof }

错误:

# sed -e 's/abc/cde
> /g' /my/files.new
sed: -e expression #1, char 37: unterminated `s' command

什么是坏的

以下是无效调用:

sed -e -i 's/abc/${mount}/g'

它无效,因为:

  1. 引用的表达式与-e标志不关联
  2. ${mount}可以包含换行符或前导/尾随空白字符

如何修复

为了解决您的问题,您应该:

  1. 切换命令行参数
  2. 确保为-i标志提供了一个参数(例如一个空字符串),以便它能够与非GNU sed一起使用
  3. 使用string trim装载变量中删除任何换行符或前导/尾随空格

例如:

set mount [string trim [lindex $argv 0]]
# ...
send "sed -i'' -e 's/abc/${mount}/g' /my/files.newr"

最新更新