标签 shell 下的文章

shell编码规范手册(shellcheck错误汇总)

shell脚本提交以前必须用静态代码扫描工具 shellcheck 扫描,根据提示修改代码,需达到扫描后无报错即可通过。

安装

#安装shellcheck
yum install shellcheck

#扫描
shellcheck -x -s bash *.sh
# -s 指定使用bash
# -x 给予shellcheck跟踪文件的权限,例如一个文件中导入了其他文件

错误编号

shellcheck 扫描出的每一个错误,均有其编号,以 SC+4位数字 组成。分为两部分:

- 阅读剩余部分 -

系统部署相关shell脚本

批量复制程序脚本:

#!/bin/bash

#---------------------------------------
# 批量复制部署系统程序
# author: SenSen 1050575278
# date: 2021/10/16
#---------------------------------------

#确定版本号
read -p "Enter Version Code to continue : " code

if [ "$code" ]; then

  #待部署系统文件夹名称 todo 待通过dns文件获取
  sysDir=(t001 t002)

  #源文件 依据系统版本
  sourceDir="/web/source/${code}.zip";

  #判断文件是否存在
  if [ ! -f "${sourceDir}" ];then
    echo "Error: File not found"
    exit
  fi

  #安装目录
  baseDir='/web/oa/'

  for f in "${sysDir[@]}"
    do
      #获取当前时间
      curtime=`date +"%Y/%m/%d %H:%M:%S"`

      #复制
      cp -rf ${sourceDir} ${baseDir}${f}".zip"

      #解压 默认解压到当前
      unzip -oq ${baseDir}${f} -d ${baseDir}${f}

      #变更用户组
      chown -R www:www ${baseDir}${f}

      #删除压缩包
      rm -rf ${baseDir}${f}".zip"

      echo "${curtime} ${f} done"
    done
else
    echo "Error: param is empty"
fi

清理缓存:

#!/bin/bash

#---------------------------------------
# 清理系统临时文件
# author: SenSen 1050575278
# date: 2021/10/10
#---------------------------------------

read -p "Warning! Enter 'y' to continue : " input

#判断是否存在参数,不存在则取消
if [ "$input" == 'y' ] || [ "$input" == 'Y' ]; then
  #所在目录
  dir='/web/oa/'

  #自动获取系统目录文件 仅可包含oa系统文件
  sysDir=`ls /web/oa`

  #排除目录
  excluded=()

  for f in ${sysDir}
    do
      #获取当前时间
      curtime=`date +"%Y/%m/%d %H:%M:%S"`

      #排除指定目录
      if [[ ${excluded[@]/${f}/} != ${excluded[@]} ]]; then
        echo "jump"
        continue
      fi

      #进入目录
     cd ${dir}${f}
     #执行对应操作
     #清除runtime 不包含log session等 todo 支持删除缓存或所有
     rm -rf runtime/cache/*
     rm -rf runtime/index/temp/*
     #清除uploads
     rm -rf public/phpExcel/*

      echo "${curtime} ${f} done"
    done
else
  echo "Error: invalid input"
fi

批量修改网站配置:

#!/bin/bash

#---------------------------------------
# 批量生成网站配置文件
# author: SenSen 1050575278
# date: 2021/10/16
#---------------------------------------

#进入伪静态目录
cd /www/server/panel/vhost/nginx

baseDir='/web/oa/'

sysDir=`ls /web/oa`

#循环生成伪静态
for f in ${sysDir}
do
  #复制
  cp "thinkphp_conf.conf" "${f}.speaklaw.cn.conf"
  #替换
  find "${f}.speaklaw.cn.conf" | xargs sed -i "s/sensen/${f}/"

  echo "${f} done"
done

创建新的系统:

#!/bin/bash

#---------------------------------------
# 创建新的OA系统
# author: SenSen 1050575278
# date: 2021/11/29
#---------------------------------------

if [ "$1" ] && [ "$2" ]; then

  #获取当前时间
  curtime=`date +"%Y/%m/%d %H:%M:%S"`

  #所在目录
  cd /web/oa

  rsync -av --exclude-from="/web/shell/create.exclude" ${1}/ ${2}/

  #拷贝原env配置
  cd ${2}
  cp -r public/install/.env ./.env

  #todo 暂不考虑自动创建网站+配置
else
    echo "Error: param1 is source ('like a001') && param2 is target ('like a999')"
fi

系统升级脚本:

#!/bin/bash

#---------------------------------------
# 批量更新多文件夹内容 支持排除指定目录
# 注:多系统升级时,为避免文件冲突,建议
# 单次单压缩包更新
# author: SenSen 1050575278
# date: 2021/09/10
#---------------------------------------

#添加定时任务 10min
# */10 * * * * /www/upgrade/upgrade.sh

#记录日志
log="/web/upgrade/upgrade.log"

#进入升级包所在目录 升级包必须包含version.txt文件
cd /web/upgrade/fix

#判断目录中是否有文件 原则上一次只能存在一个文件,避免多个升级包导致混乱
count=`ls -l|grep '^-'|wc -l`

#获取所有系统 废弃
# source ./wlt_dir.sh

#所在目录
baseDir='/web/oa/'

#自动获取系统目录文件 仅可包含oa系统文件
sysDir=`ls /web/oa`

#排除目录
excluded=()

#测试示例
#sysDir=('wlt_3163')

#获取当前目录下的升级包
fixFile=`ls`

if [ $count -ne 0 ]; then
  for i in ${fixFile}
    do
      #获取当前时间
      curtime=`date +"%Y/%m/%d %H:%M:%S"`

      for f in ${sysDir}
        do
          #排除指定目录
          if [[ ${excluded[@]/${f}/} != ${excluded[@]} ]]; then
            continue
          fi
          echo "系统:${f} 升级文件:${i}">>${log}
          #解压到对应系统目录
          unzip -oq ${i} -d ${baseDir}${f}
          echo "${curtime} ${i} done">>${log}
        done
    done
    #移动升级包
    mv ${i} /web/upgrade/bak;
    echo "${i} upgrade successfully">>$log
else
    echo "upgrade_fix is empty"
fi

linux下批量更新升级多个系统文件

工作中需要部署上千套相同系统,为方便系统更新升级,除常规的系统内置升级程序外,必要的时候还需要手动批量覆盖(如系统存在严重bug时),shell脚本代码如下:

注:

  1. 支持排除指定目录升级(原则上建议将定制系统放于不同目录);
  2. 系统内置升级程序方便查看各系统使用情况(当前为登录系统后即可与中心服务器检测版本,如存在新版本则自动拉取升级);
  3. 如使用系统内置升级模式,则有重大bug时使用shell更新可能因各系统版本不一致导致系统异常;
  4. 建议仅使用一种升级模式;
#!/bin/bash

#---------------------------------------
# 批量更新多文件夹内容 支持排除指定目录
# 注:多系统升级时,为避免文件冲突,建议
# 单次单压缩包更新
# author: SenSen 1050575278
# date: 2021/09/10
#---------------------------------------

#添加定时任务 10min
# */10 * * * * /www/upgrade/upgrade.sh

#记录日志
log="/www/upgrade/upgrade.log"

#获取当前时间
curtime=`date +"%Y/%m/%d %H:%M:%S"`

#进入升级包所在目录 升级包必须包含version.txt文件
cd /www/upgrade/fix

#判断目录中是否有文件 原则上一次只能存在一个文件,避免多个升级包导致混乱
count=`ls -l|grep '^-'|wc -l`

#获取所有系统 废弃
# source ./wlt_dir.sh

#所在目录
dir='/diskb/www/'

#自动获取系统目录文件 仅可包含oa系统文件
sysDir=`ls /diskb/www`

#排除目录
excluded=()

#测试示例
#sysDir=('wlt_3163')

if [ $count -ne 0 ];then
    for i in `ls`
        do
            for f in ${sysDir}
                do
                    #排除指定目录
                    if [[ ${excluded[@]/${f}/} != ${excluded[@]} ]]; then
                        continue
                    fi
                    echo "系统:${f} 升级文件:${i}">>${log}
                    #解压到对应系统目录
                    unzip -oq /www/upgrade/fix/${i} -d ${dir}${f}
                    echo "${curtime} ${i} done">>${log}
                done
        #移动升级包
        mv /www/upgrade/fix/${i} /www/upgrade/bak;
        done
    echo "upgrade successfully">>$log
else
    #echo "${curtime} upgrade_fix is empty">>$log
fi

shell判断文件、文件夹是否存在

dir="/folder"
file="/test/test.txt"
file2="/test/test.php"

判断文件夹是否存在,不存在则创建
if [ ! -d "${dir}" ]; then
    mkdir -p ${dir}
fi

判断文件是否存在且可执行
if [ ! -x "${dir}"]; then
    mkdir "${dir}"
fi

判断文件是否存在
if [ ! -f "$file" ]; then
    touch "$file"
fi

判断变量是否有值
if [ ! -n "$file" ]; then
 echo "$file 变量为空!"
 exit 0
fi

判断两个变量的字符串内容是否相同
if [ "$file" = "$file2" ]; then
    echo "$file equal $file2"
else
    echo "$file not equal $file2"
fi

shell脚本批量检测mysql表中是否存在指定字段

批量查询数据库中表是否存在指定字段,批量添加表字段:

#!/bin/bash
#exit
db_con="/usr/local/mysql/bin/mysql -uroot -p123456"
arr=(db1 db2 db3)
for db in ${arr[*]}
do
    ${db_con} -e "select count(*) from information_schema.columns where table_schema = '${db}' and table_name = 'table_name' and column_name = 'column_name';"  >> /data/shell/test.txt
    echo ${db} >> /data/shell/test.txt 
    #${db_con} -e "ALTER TABLE ${db}.gy_com_customer ADD new_column varchar(100) NOT NULL default '';" 2>/dev/null
    echo ${db} " --- done"
done