繁体   English   中英

期望,sed和可变替代

[英]Expect, sed, and Variable Substitution

我打电话的expect从一个bash脚本脚本,并传递一个参数用于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 -- "$password\r"
    # send blank line (\r) to make sure we get back to gui
    expect "]# "
    send "sed -e -i 's/abc/${mount}/g' /my/files.new\r"
    expect "]# "
    sleep 1
    send -- "exit\r"
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.new\r"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM