代码之家  ›  专栏  ›  技术社区  ›  Davin Dirgantara

压缩目录的Shell脚本[重复]

  •  0
  • Davin Dirgantara  · 技术社区  · 7 年前
    • $1是要压缩的文件/文件夹
    • 输出文件名是相同的名称,加上当前日期和ext
    • 如果存在输出名称,则只需发出警告

    示例:

    /立方厘米。sh/主页/用户

    它将是2018年3月11日/home/user to/home/user\U。焦油bz2型

    我已经有线索了,但我被困住了

    #!/bin/bash
    
    if ["$1" == ""]; then
    echo "Help : To compress file use argument with directory"
    exit 0
    fi
    
    
    if [[ -f "$1" || -d "$1" ]]; then
    tar -cvjSf $1"_"$(date '+%d-%m-%y').tar.bz2 $1
    fi
    

    但产量为2018年4月22日。焦油bz2型

    2 回复  |  直到 7 年前
        1
  •  3
  •   ghoti    7 年前

    我看到您使用引号来避免下划线被用作变量名的一部分的问题。所以当 $1 是位置参数, $1_ 是尚未在脚本中设置的变量。可以通过使用大括号来避免此问题,如 ${1} 。大括号内的任何内容都是变量名的一部分,因此 ${1}_ 作品此符号比 $1"_" 将用户提供的变量保留在引号之外。(当然, "$1"_ 也会做这项工作。)

    此外,在变量中设置文件名可能更安全,然后根据需要使用该文件名:

    #!/bin/bash
    
    if [ -z "$1" ]; then
      echo "Help : To compress file use argument with directory"
      exit 0
    fi
    
    filename="${1}_$(date '+%F').tar.bz2"
    
    if [ -e "$filename" ]; then
      echo "WARNING: file exists: $filename" >&2
    else
      tar -cvjSf "$filename" "$@"
    fi
    

    更改:

    • if 条件
    • 而你 可以 测试是否等效于空字符串, -z 更干净,但您也可以测试 [ $# -eq 0 ] ,计算提供的参数,
    • 使用 $filename 确保您的测试和 tar 将始终使用相同的名称,即使脚本在午夜运行,并且可读性更好,
    • 应始终引用变量。

    还有,你确定 -S 焦油的选择?在我的系统上,该选项提取稀疏文件,并且仅在与 -x

    另外,我应该注意到,在我重写它时,这个脚本中没有特定于 猛击 ,并且它还应可移植到POSIX外壳上(灰/破折号/等)。Bash很棒,但它不是通用的,如果在学习过程中您可以同时学习这两种语言,它将为您提供跨多个操作系统和环境的有用技能。

        2
  •  1
  •   Mesar ali    7 年前

    使用-z开关检查是否为空

    #!/bin/bash 
    if [[ -z "$1" ]]; then 
      echo "Help : To compress file use argument with directory" 
      exit 0 
    fi 
    if [[ -f "$1" || -d "$1" ]]; then 
      tar -cvjSf $1"_"$(date '+%d-%m-%y').tar.bz2 $1 
    fi