awk怪异解析'~';在ssh连接中使用expect时分析错误
我试图根据计算机的内存使用情况自动建立符号链接,为此,我想首先检查主目录下使用内存最多的目录,为此,我使用以下命令awk怪异解析'~';在ssh连接中使用expect时分析错误,awk,expect,Awk,Expect,我试图根据计算机的内存使用情况自动建立符号链接,为此,我想首先检查主目录下使用内存最多的目录,为此,我使用以下命令 cd/directory&&du-h2>/dev/null | awk'{if($1~/G/){print$0}}}| grep'/.| awk-F'.'{print$3}' 这在ssh连接上非常有效,但当我尝试将其放在expect下的脚本中时,会出现错误: { if ( ~ /G/) {print myscriptname}} ^ parse error { if
cd/directory&&du-h2>/dev/null | awk'{if($1~/G/){print$0}}}| grep'/.| awk-F'.'{print$3}'
这在ssh连接上非常有效,但当我尝试将其放在expect下的脚本中时,会出现错误:
{ if ( ~ /G/) {print myscriptname}}
^ parse error
{ if ( ~ /G/) {print myscriptname}}
^ parse error
我发现最奇怪的是,不知何故,该命令试图使用我实际脚本的文件名作为参数,即使我通过ssh连接运行该命令也很困难
我的完整代码是
#!/bin/bash
expect <<-EOF
set timeout 5
spawn ssh -oPort=22 user@ip
expect "*password" { send "password\r" }
expect "*#" { send "cd /directory && du -h 2>/dev/null | awk '{ if ($1 ~ /G/) {print $0}}' | grep './' | awk -F '.' '{print $3}'\r" }
expect "*#" { send "exit\r" }
EOF
#/bin/bash
除此之外,这是由于使用双引号参数发送
——Tcl将在双引号字符串中展开任何$variables
你可能想要改变
expect "*#" { send "cd /directory && du -h 2>/dev/null | awk '{ if ($1 ~ /G/) {print $0}}' | grep './' | awk -F '.' '{print $3}'\r" }
为此,请使用大括号防止变量扩展
expect "*#" {
send {cd /directory && du -h 2>/dev/null | awk '$1 ~ /G/ && /.\// {print $0}' | awk -F '.' '{print $3}'}
send "\r"
}
啊,是的,我看到了主要的问题:您的expect代码位于shell-Herdeoc中,并且需要进行变量扩展。这在expect启动之前就已经发生了 这里的秘诀是告诉shell引用整个here文档:
expect << 'EOF'
...
EOF
预期或转义,如\$1
和\$0
?可能的代码副本不完整,我已更新了itI我没有尝试在远程计算机上运行脚本,我正在我的计算机上运行它,脚本让我的机器连接到远程机器如果不让你的机器连接到远程机器,为什么要调用ssh
?在任何情况下,您是否按照我的建议尝试转义awk命令中的$
s?当我尝试此操作时,我在~上得到一个解析错误,$0变量扩展成为我脚本的文件名,$3变为空