【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"
posted @   极客子羽  阅读(455)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示