• 【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"
    
  • 相关阅读:
    Jmeter(七)Jmeter脚本优化(数据与脚本分离)
    Jmeter(六)Jmeter脚本包含要素及书写习惯
    Redis的持久化之AOF方式
    Redis的持久化之RDB方式
    Redis持久化介绍
    Redis Keys的通用操作
    Redis的数据结构之sorted-set
    Redis的数据结构之哈希
    Redis的数据结构之字符串
    Jedis 连接池实例
  • 原文地址:https://www.cnblogs.com/kendoziyu/p/16371068.html
Copyright © 2020-2023  润新知