unix - 通过 ssh 执行 FOR 循环

标签 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 行收到以下错误(do 所在的行,FOR 语句之后的下一行)。

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

FOR 循环有问题,但我不明白问题出在哪里。

有什么建议吗?

谢谢

最佳答案

ssh 从此处文档读取之前,命令替换已展开。如果该管道为空,远程 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

关于unix - 通过 ssh 执行 FOR 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26325685/

相关文章:

c - 为什么 perror 函数会返回成功值?

linux ksh如何删除除最新的一些目录之外的所有目录

bash - shell脚本变量使用

linux - 使用ksh返回目录中行数最多的文件

c - 什么操作导致 select 函数在检测套接字的写入状态时超时。

linux - 如何在一行中使用多个 bash 命令

linux - 如何使用 grep 只获取一行的一部分

c - 大型 Unix C 应用程序中 fork 进程的持续时间和范围

c++ - 在 Solaris 10 上非常简单的编译失败

c - 从 Sun C 编译器迁移到 gcc