for loop over ssh: ошибка несвязанной переменной - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть ниже синтаксис, который сравнил бы дату изменения файлов XML с переменной f1_mdate.

typeset -f mdate | ssh 101.101.101.101 "cd "$tar_dir"; $(cat); for xml_file in *.xml; do mdate_xml=$(mdate $xml_file) if [[ "$f1_mdate" == "$mdate_xml" ]]; then  echo 1; fi; done"

xml_file: unbound variable
mdate_xml: unbound variable

Может кто-нибудь помочь подсказать, почему он получает несвязанную переменную?

1 Ответ

0 голосов
/ 24 апреля 2018

Я считаю, что проблема заключается в цитировании; это будет понятнее, если я поставлю разрывы строк там, где оболочка видит закрывающие кавычки:

typeset -f mdate | ssh 10.225.28.45 "cd "\
$tar_dir"; $(cat); for xml_file in *.xml; do mdate_xml=$(mdate $xml_file) if [[ "\
$f1_mdate" == "\
$mdate_xml" ]]; then  echo 1; fi; done"

С точки зрения того, как написать это правильно ... это очень сложно, потому что у вас есть два слоя оболочки, которые интерпретируют команды, разбирают кавычки и интерполируют переменные. Я обычно пишу небольшой сценарий оболочки, копирую его на удаленный компьютер и запускаю его удаленно, просто чтобы обойти это ... или использую инструмент, подобный ansible.

В качестве примера того, как получить данные на удаленный компьютер и с него: я создал /tmp/a.sh на удаленном компьютере foo. Вот содержание /tmp/a.sh:

while read line
do
    echo "xyzzy> $line"
done

На моем локальном компьютере /tmp/xyz содержит

foo
bar
baz

Запуск

cat /tmp/xyz | ssh foo bash /tmp/a.sh

даст

xyzzy> foo
xyzzy> bar
xyzzy> baz
xyzzy> 

Вы можете перенаправить вывод в файл:

cat /tmp/xyz | ssh foo bash /tmp/a.sh > a.txt

Файл a.txt будет на вашем локальном компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...