for循环越过ssh获取未绑定的变量错误

时间:2018-04-24 13:01:25

标签: bash shell unix ssh

我有以下语法,可以将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 :(得分:0)

我认为问题在引用;如果我在shell看到结束引号的地方设置换行符,这将更清楚:

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"

就如何正确编写而言......这非常棘手,因为你有两层shell,它们解释命令,剥离引号和插入变量。我经常写一个小的shell脚本,将它scp到远程机器并远程运行,只是为了解决这个问题......或者使用像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将在您的本地计算机上。