在ssh上执行FOR循环

时间:2014-10-12 13:35:16

标签: unix ksh solaris-10

我试图通过ssh在几个Solaris 10远程机器上执行此代码。我正在从本地文件ipa.txt中读取一些连接信息:

#!/bin/ksh

while read hostn sid; do

   v_sid=$sid;
   ssh utest@$hostn << EOF

   for D in $(df -k |grep ora | grep -i $v_sid | awk '{print $6}')
   do
       printf "$(df -h $D |tail -1|awk '{print "FS:", $6, " usage:", $5"%"}')\n"
   done

EOF

done < ipa.txt

如果我只将 FOR 循环直接执行到终端,它就可以工作。但是,如果我将整个脚本放入.ksh文件并执行该脚本,则会在第3行(执行,FOR语句后的下一行)中收到以下错误。

ksh[2]: syntax error at line 3 : `newline or ;' unexpected

FOR 循环存在问题,但我不明白它在哪里。

有什么建议吗?

谢谢

2 个答案:

答案 0 :(得分:2)

ssh从here文档中读取之前,扩展了命令替换。如果该管道为空,则远程shell看到

for D in
do

会导致您的错误。要将确切文本发送到远程shell,请转义任何可触发本地扩展的美元符号,并使用printf的格式说明符。

ssh utest@$hostn << EOF

   for D in \$(df -k |grep ora | grep -i \$v_sid | awk '{print \$6}')
   do
       printf '%s\n' "\$(df -h $D |tail -1|awk '{print "FS:", \$6, " usage:", \$5"%"}')"
   done

EOF

答案 1 :(得分:0)

你可以尝试将条件纳入double-brackets吗?

while [[ read hostn sid ]]; do