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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章