惨痛教训 因Shell脚本变量未赋默认值,删除77TB数据

背景:2021年12月中旬,由于HPE发布的软件更新版有缺陷,结果无意中删除了备份内容,日本京都大学丢失了多达77TB的研究资料。HPE发表了一份日文声明,声称对文件丢失“承担100%的责任”。详情请见文中内容:bug 导致 77 TB数据被删光,HPE 称 100% 负责:在执行过程中重新加载修改后的shell脚本,从而导致未定义的变量 (qq.com)https://mp.weixin.qq.com/s/Otb6VImrsqT1FDFuAqW0rg事件已阐述,京都大学超级计算机系统的脚本更新最初旨在“提高可见性和可读性”,因执行的SHELL脚本,其中包括一个find命令,用于删除超过10天的日志文件。

掐指一算,就是这行命令了
编写代码:#find /data/${logDir} -mtime +10 -exec rm {} \;
logDir变量为空,最终变成删除整个/data目录
实际执行:#find /data/ -mtime +10 -exec rm {} \;

解决方法:使用shell变量赋默认值

语句一:a如果没有定义,则表达式返回默认值,否则返回a的值;
${a-defaultValue} 

语句二:a没有定义或者为空字符串,则表达式返回默认值,否则返回a的值;
${a:-defaultValue}

测试效果如下:

语句一:

表达式:${a-defaultvalue} 
#a如果没有定义,则表达式返回默认值,否则返回a的值;

#对a进行赋值,且a为空值;因已对a赋值,则${a-defaultvalue} 输出为赋值内容,此处为空格
a=""

ret1=${a-"/usr/local"}
echo "ret1:" $ret1

> ret1:

------------------------------------
#未对a赋值
ret1=${a-"/usr/local"}
echo "ret1:" $ret1

> ret1:/usr/local

语句二: 

表达式:${a:-defaultValue}
语句二:a没有定义或者为空字符串,则表达式返回默认值,否则返回a的值;

#对a进行赋值,且a为空值;因已a为空值,则${a-defaultvalue} 输出为默认值,此处为默认值
a=""

ret1=${a:-"/usr/local"}
echo "ret1:" $ret1

> ret1:/usr/local

------------------------------------
#未对a赋值
ret1=${a:-"/usr/local"}
echo "ret1:" $ret1

> ret1:/usr/local

回顾:

其实仅需稍作修改,指向一个默认目录,即可避免此故障。
#find /data/${logDir:-"none"} -mtime +10 -exec rm {} \;

这条代码值77TB数据

Thanks all

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只晨兴夜不得寐的运维人

你的打赏,是我今晚餐桌上的鸡腿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值