背景: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