【发布时间】:2020-12-25 15:47:06
【问题描述】:
我有以下 shell 脚本,我想在其中检查远程机器上的特定目录内容并将它们打印到文件中。
file=serverList.csv
n=0
while [ $n -le 2 ]
do
while IFS=: read -r f1 f2
do
# echo line is stored in $line
if echo $f1 | grep -q "xx.xx.xxx";
then
ssh user@$f1 ls path/*war_* > path/$f1.txt < /dev/null; ls path/*zip_* >> path/$f1.txt < /dev/null;
ssh user@$f1 ls -d /apps/jetty*_* >> path/$f1.txt < /dev/null;
fi
done < "$file"
sleep 15
n=$(( n+1 ))
done
我每 2 分钟在 cron 作业中使用此脚本,如下所示:
*/2 * * * * /path/myscript.sh
但不知何故,我最终得到了以下输出文件:
/apps/jetty/webapps_wars/test_new.war
path/ReleaseTest.static.zip_2020-08-05
path/ReleaseTest.static.zip_2020-08-05
path/ReleaseTest.static.zip_2020-08-05
path/jetty_xx.xx_2020-08-05
path/jetty_new
path/jetty_xx.xx_2020-08-05
path/jetty_new
我不确定为什么我会两次获得列表中的文件,有时是 3 次。但我直接从腻子执行shell,它工作正常。为了更正此脚本,我需要进行哪些更改?
【问题讨论】:
-
您使用了太多的
*通配符和许多ls而不是更好的过滤器,因此您会得到许多相似的行:然后两个解决方案 piggy one 过滤器输出;好的一篇评论你循环使用更多的正则表达式和更好的文件名过滤;您可能会考虑使用 find (with -o... -o .... -o ...) 来获取您的文件名列表,您还将获得唯一且没有ls的结果编写脚本的一种不好的做法例如,在您的情况下,您会看到它为什么不好