我正在尝试根据计算机的内存使用量自动建立符号链接,为此,我想先检查主目录下的哪个目录使用的内存最多,为此,我正在使用此命令
cd /directory && du -h 2>/dev/null | awk '{ if ($1 ~ /G/) {print $0}}' | grep './' | awk -F '.' '{print $3}'
这在ssh连接上可以完美地工作,但是当我尝试将其放在脚本中时,我得到了错误:
{ 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
答案 0 :(得分:1)
这归因于send
的双引号参数-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"
}
是的,是的,我看到了一个主要问题:您期望的代码在shell heredoc中,并且需要进行变量扩展。那是在期望未启动之前发生的。
这里的秘密是告诉外壳将整个文档单引号:
expect << 'EOF'
...
EOF
现在,$1
和$0
将留给awk使用。