【Shell技巧】清理文件内的所有文件以及 Use "${var:?}" to ensure this never expands to /* .
背景描述
在 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"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix