0

我正在尝试编写一个访问不同服务器的脚本,查找特定文件的更新时间并返回时间以供进一步处理。问题是当在特定服务器上找不到文件时脚本退出,任何人都可以帮忙吗?

while true
do
for i in  ocmp1 ocmp6 ocmp7 ocmp8 ocmp9 ocmp10 krrbtc krrbtd krrbte
do
ssh $i '
set -e
x=`hostname`;
echo -e "\n********************************"
echo -e "LATEST $x CDR: ";
echo -e "********************************\n"
x="tail -1 /data/cdr/cdr.log";
a=`find /data/cdr/cdr.log -maxdepth 0 -printf "%TY%Tm%Td%TH%TM%TS"`;
c=`find /data/cdr/cdr-ivr.log -maxdepth 0 -printf "%TY%Tm%Td%TH%TM%TS" -type d | tee log`;
b=`date +"%Y%m%d%H%M%S"`;
a=${a/.*};
c=${c/.*};
SD=$(($b - $a));

当找不到文件并给出以下错误并且脚本退出而不继续时:

********************************
LATEST krrbtc CDR: 
********************************

find: /data/cdr/cdr-ivr.log: No such file or directory
bash: line 13: 20131107223022 - : syntax error: operand expected (error token is " ")

任何帮助将非常感激。谢谢

4

2 回答 2

3

find当您已经知道文件的位置时,为什么还要使用?为什么不检查文件是否存在,然后处理它?

IE

if [[ -f "/data/cdr/cdr-ivr.log" ]]; then
  #code here
  #more code here
  ...
于 2013-11-07T17:46:41.630 回答
1

当找不到文件时,你的变量a是空的,导致减法失败。

您可以采用ifJason 的答案中的方法来避免错误情况,并且仅在文件存在时执行您的代码。

或者,如果您希望始终有一个值,例如在没有文件时说零,您可以使用 bash“默认值”构造。在示例的最后一行中,您将执行以下操作:

SD=$((${b:-0} - ${a:-0}));

如果相应的变量为空或未设置,这将替换为零,并防止脚本死亡。

此外,您可能希望通过附加到每个命令来忽略find' 错误。2>/dev/nullfind

于 2013-11-07T19:00:16.373 回答