Shell脚本if判断文件或目录是否存在以及文件覆盖与备份
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
更多推荐
所有评论(0)