【问题标题】:shell scripting BASHshell 脚本 BASH
【发布时间】:2018-02-23 17:30:58
【问题描述】:
#!/bin/bash
mdate="$(date | awk '{print $2$3}')";  
cd /var/tmp/precheck;  
found="$(ls -l *.txt | awk '{print $6$7}')"  
for txtdate in $found  
do  
if [ $mdate = $txtdate ]; then  
echo "Pre-Check Success"  
else  
echo "Pre-Check FAILURE"  
fi  
done

在上述脚本中,.txt 文件使用当前日期进行验证。如果日期戳匹配,则返回 SUCCESS 否则 FAILURE..

在这里,它对我有用,除了它返回所有文件的条件。我只需要返回一个条件:成功或失败。

如果任何一个文件与当前日期戳不匹配,它应该返回一个失败条件。如果所有匹配,它应该只返回一个 SUCCESS 条件。

【问题讨论】:

标签: bash shell


【解决方案1】:

让我们尝试一种完全不同的方法:

if find /var/tmp/precheck -name '*.txt' -mtime +0 | grep -q .; then 
    status="FAILURE"
fi

printf 'Pre-Check %s\n' "${status:-Success}"

如果发现任何文件在一天前被修改,则将状态设置为“FAILURE”。打印状态,默认为“成功”。 grep -q . 返回“成功”并在收到任何输入后立即退出。

您现有方法中的问题已经在其他地方突出显示 - 如果您在循环内输出,那么您最终将得到每个文件一行。

【讨论】:

  • 谢谢汤姆!!..简单而强大....因为我是初学者,通常在if语句中使用“then”和“else”..这里没有“else”,我要理解的新事物..它的打印默认“成功”如何?另外,如何在显示中获取 .txt 文件以显示失败的文件..?
  • @Manoj.V 参数扩展使用:-Success 提供默认值。如果您想查看找到的文件,可以删除管道到 grep。
  • 我正在使用 INFO、ERR 和 CRITICAL 函数...函数名称是 'log'.. 用法是“log info”、“log err”。在这里,如果成功返回,我应该使用“log info”和“log err”来表示失败。如何将功能集成到您建议的方法中?
  • 我猜你在if 分支中写log err "Pre-Check FAILURE",在else 分支中写log info "Pre-Check Success",但是这个要求与你原来的问题没有任何关系。跨度>
  • 对,我也是这样写的。。由于没有else分支,方法不同,我很困惑在这里调用函数“log”。。请你帮忙也? ☺...
【解决方案2】:

你需要存储之前的文件结果

#!/bin/bash
mdate="$(date | awk '{print $2$3}')";  
cd /var/tmp/precheck;  
found="$(ls -l *.txt | awk '{print $6$7}')"  
result="SUCCESS"
for txtdate in $found  
do  
if [ $mdate != $txtdate ]; then  
result="FAILURE"  
fi  
done
echo "Pre-Check " $result

【讨论】:

    【解决方案3】:

    在循环之前设置一个变量,如果发现失败则更改变量并退出循环。

    status=Success
    for txtdate in $found
    do
        if [ $mdate != $txtdate ]; then
            status=FAILURE
            break
        fi
    done
    echo Pre-Check $status
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多