背景描述
在 Linux 上部署 mongodb 的数据库时,我遇到一个需求,就是删除 data 文件夹下的所有文件,达到清理库的作用,因此,一开始写了一段代码来清空文件夹:
#!/bin/bash
## 不推荐的版本1
function clean() {
local dir=$1
du -sh $dir
rm -rf $dir/*
}
clean $1
ShellCheck 提示了一个警告
Use "${var:?}" to ensure this never expands to /* .
这个操作很危险,因为如果你没有传入参数,就像这样./clean.sh
,那么就可能删除系统中的一切。
详见 Wiki SC2115
${var:?} 效果演示
修复 SC2115 后的代码修改为
#!/bin/bash
## 非最终版本
function clean() {
local dir=$1
du -sh "${dir:?}/"
rm -rf "${dir:?}/"*
}
clean "$1"
此时,执行 ./clean.sh
就会安全许多:
[root@mongodb10 shell]# ./clean.sh
./clean.sh:行6: dir: 参数为空或未设置
[root@mongodb10 shell]#
如果变量是 null 或者未设置,使用
:?
可以终止命令继续执行,并且直接返回失败!
本例中,变量dir为 null 或者未设置,因此 clean 命令在 第6行du -sh "${dir:?}/"
处中止了。
加上校验
下面是完善后的脚本:
#!/bin/bash
function clean() {
local dir=$1
if [[ -z $dir ]]; then
echo "请输入要清空的文件夹"
exit 1
fi
if [ ! -d "$dir" ]; then
echo "不存在文件夹$dir"
exit 1
fi
local fileCount
fileCount=$(find "$dir" | wc -l)
if [ 1 -ge "$fileCount" ]; then
echo "文件夹${dir}已清空"
exit 1
fi
du -sh "${dir:?}/"
rm -rf "${dir:?}/"*
}
clean "$1"