2014-10-12 6 views
2

Я пытаюсь выполнить этот код на нескольких удаленных ящиках Solaris 10 поверх ssh. Я читаю некоторую информацию о соединении с локальным ipa.txt файлом:Execute FOR loop over ssh

#!/bin/ksh 

while read hostn sid; do 

    v_sid=$sid; 
    ssh [email protected]$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 цикла, но я не понимаю, где она находится.

Любое предложение?

Спасибо

+0

Вам не хватает закрывающего ')' в подстановке команд, выходные данные которых вы итерируете. – chepner

+0

@chepner извините, это была опечатка, но проблема не устранена – Shaunyl

ответ

2

Команда замещения расширяется до тогоssh читает из здесь документа. Если этот трубопровод пуст, удаленная оболочка видит

for D in 
do 

, который приведет к вашей ошибке. Чтобы отправить точный текст в удаленную оболочку, избегайте любых знаков доллара, которые могут вызывать локальные расширения и использовать спецификатор формата для printf.

ssh [email protected]$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 
+0

Большое вам спасибо, это работает как шарм :) – Shaunyl

0

вы можете попытаться поставить условие в double-brackets?

while [[ read hostn sid ]]; do 
+0

Я получаю ошибку: ksh [3]: ошибка синтаксиса в строке 3: 'hostn 'неожиданно – Shaunyl