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