我有以下语法,可以将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
有人可以帮助指出为什么它会得到未绑定的变量?
答案 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
将在您的本地计算机上。