if判断文件或目录是否存在以及文件覆盖与备份

一、简介

          本文主要记录一波linux中shell脚本用if语句判断文件或目录是否存在,并且以jenkins自动发布覆盖项目和历史版本记录为例,让大家跟好的理解shell脚本的灵活。

二、基础知识

  1.脚本注意要点:

  • .sh结尾的开头要加下面这段代码
#!bin/sh
  • Bash脚本中的赋值符号“=”前后不能有空格   
  •  " [ " 与" ] " 前后要加上空格 
  • 每一行结尾换号智能是\n 不能是\r\n因为windows换行会有\r bash是解析不了的
  • 每个关键字后面面都要加上空格

下面框出来的红点部位就是空格

如果换行符多了就会报下面的错

可以用notepad++全部替换为空

   2.shell中if-else 、if-elseif-else的语法

(其中elif就是elseif)

如果不需要elseif 和else  可以删除 ,跟其他语言一样elseif可以有多个

#!bin/sh
flag=-1
if [ "$flag" == 0 ];
then 
 echo "if语句"
elif [ "$flag" -gt 0 ];
then 
 echo "elseif语句" 
else 
 echo "else语句执行"
fi 

   3.常见的if 条件判断

       1.通用判断
          -eq 或 ==      等于             
          -ne                不等于            
          -gt                 大于               
          -ge                大于等于        
          -lt                  小于                
          -le                 小于等于      

  
#!bin/sh
flag=0
if [ "$flag" -eq 0 ];
then 
 echo "if语句"
fi 
if [ "$flag" == 0 ];
then 
 echo "if语句"
fi 
if [ "$flag" -ne 0 ];
then 
 echo "if语句"
fi 

#或者用双括号

if (("$flag" == 0))
then 
 echo "if语句"
fi 

使用符号判断   注意:需要双括号如:(("$a" < 0))

<        小于
<=      小于等于
>        大于(需要双括号)
>=      大于等于(需要双括号)

#!bin/sh
a=-1

if (("$a" < 0))
then 
 echo "if语句2"
fi 

 如果要详细了解可以看菜鸟教程上面的介绍:

https://www.runoob.com/linux/linux-shell-process-control.html

 

 

三、文件和目录判断

    1. 判断文件和目录

-x 判断文件是否存在并且是否具有可执行权限 
-d  判断目录是否存在 
-f 判断文件是否存在 
-n  判断一个变量是否为空

#!bin/sh

path="/xxx/xxx"  
fileName="/xxx/xxx/xxx.txt/"  
  
#这里的-x 参数判断$path是否存在并且是否具有可执行权限  
if [  -x "$path"]; 
then  
 echo "$path"  
fi  
# 这里加! 就是否的意思在此处也就是没有可执行权
if [ ! -x "$path"]; 
then  
 echo "$path"  
fi  
#这里的-d 参数判断$path是否存在  
if [  -d "$path"]; 
then  
 echo "$path"  
fi  
  
#这里的-f参数判断$fileName是否存在  
if [  -f "$fileName" ]; 
then  
  echo "$fileName"  
fi  
  
#其他参数还有-n,-n是判断一个变量是否是否有值  
if [  -n "$myVar" ]; 
then  
  echo "$myVar is empty"  
  exit 0  
fi  
  

四、脚本示例

   1.判断指定文件是否存在,如果存在则备份并删除

 

#要备份且删除的文件
fileName="xxxx/xxx.xxx"
#将旧版本放到目录指定目录下 以当前日期作为文件夹名,以原文件名+当前时间名作为历史版本文件名
bacfilePath="xxxxx/bac/$(date '+%Y%m%d')"
#查看是否有重复的文件
if [  -f "$fileName" ]; then
 if [ ! -d "$bacfilePath" ]; then
    # mkdir "$bacfilePath"
	echo $bacfilePath 
 fi 
 mv -fb "$fileName" "$fileName.$(date '+%Y%m%d%H%M%S')"
fi 

    2.升级版,根据传入的参数备份文件

(本脚本用于jenkins 自动部署时脚本,后期会不全jenkins 远程部署等博文,可持续关注本人)

 运行命令:

[root@localhost shelltest]# bash backupJar.sh -f openapi-server.jar -p /wfq/springboot/run/


-f 文件名
-p 文件所在目录

  具体脚本

#!/bin/sh

#该脚本用于罗格朗测试环境jenkins自动发布  判断是上传的jar是否已存在某个目录 如果有则将该版本移动到指定历史版本文件夹中

#说明  传入参数 args: [-参数简称{,多个用逗号隔开}]\[--具体参数名{,多个用逗号隔开}] 详见 变量名
show_usage="args: [-f,-p]\[--fileName=,--filePath=]"


#变量名 fileName=将要发布的jar名称 filePath jar所在的目录 默认为下面该目录

fileName=""

filePath="/legrand/apps/legrand-cloud"

# getopts :s:h表示这个命令接受2个带参数选项,分别是-h和-s

GETOPT_ARGS=`getopt -o f:p: -al fileName:,filePath: -- "$@"`
eval set -- "$GETOPT_ARGS"
#获取参数
while [ -n "$1" ]
do
        case "$1" in
                -f|--fileName) fileName=$2; shift 2;;
                -p|--filePath) filePath=$2; shift 2;;
                --) break ;;
                *) echo $1,$2,$show_usage; break ;;
        esac
done



#要运行的目标jar
runjar="$filePath/$fileName"
#将旧版本放到目录$filePath/bac目录下 以当前日期作为文件夹名,以原文件名+当前时间名作为历史版本文件名
bacfilePath="$filePath/bac/$(date '+%Y%m%d')"
#查看是否有重复的文件
if [  -f "$runjar" ]; then
 if [ ! -d "$bacfilePath" ]; then
    mkdir "$bacfilePath"
 fi
 mv -fb "$runjar" "$bacfilePath/$fileName.$(date '+%Y%m%d%H%M%S')"
fi

 

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐