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变为空