Linux平台Shell脚本编写

润信云 技术支持

1、shell简介

备注:以下文档内所编写的所有 shell 脚本,小编都会将脚本存放在百度网盘中,并做不定期的脚本更新,可长期提供给大家直接下载使用

Shell 是一个用 C 语言编写的程序,它是用户使用 linux" data-pretit="linux" style="font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; font-size: 16px; box-sizing: border-box; outline: 0px; margin: 0px 3px 0px 0px; padding: 0px 18px 0px 0px; overflow-wrap: break-word; cursor: pointer; background-image: url("../img/gitcode-key.png"); background-position: right center; background-size: 14px 14px; background-repeat: no-repeat; background-attachment: initial; background-origin: initial; background-clip: initial; box-shadow: none; color: #4EA1DB !important;">Linux 的桥梁,Shell 既是一种命令语言,又是一种程序设计语言;
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

# shell脚本格式

#!/bin/bash
    ······
    #for循环语句
    for
        do
        执行内容
    done
    #if语句
    if 条件
        then
        指令
    else
        指令
    fi

2、shell脚本编写

2.1.获取当前目录脚本

# 编写获取当前目录脚本:getDir.sh,并赋予脚本可执行权限

sudo vim getDir.sh
#脚本内容编写完成后赋可执行权限
sudo chmod +x getDir.sh
ls
#执行脚本并验证
sudo sh getDir.sh
sudo pwd
获取当前目录脚本内容如下所示:
#!/bin/bash
 
work_dir=$(cd $(dirname $0); pwd)
echo '当前工作目录:' $work_dir

image.png

2.2.文件中插入内容脚本

# 编写在当前目录下dockerConf文件夹下生成deamon.json文件的脚本:insertContent.sh,并赋予脚本可执行权限

sudo vim insertContent.sh
#脚本内容编写完成后赋可执行权限
sudo chmod +x insertContent.sh
ls
#执行脚本并验证
sudo sh insertContent.sh
ls dockerConf
脚本内容如下所示:
#!/bin/bash
 
mkdir dockerConf
tee ./dockerConf/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://rsk59qvc.mirror.aliyuncs.com/"],
  
  "insecure-registries": 
    ["http://harbor.example.com",
     "www.ss.skcom"
    ],
 
  "data-root": "/data/app/"
}
EOF

image.png

2.3.输入内容处理脚本

# 编写在当前目录下创建input文件夹的脚本:input.sh,并赋予脚本可执行权限

sudo vim input.sh
#脚本内容编写完成后赋可执行权限
sudo chmod +x input.sh
ls
#执行脚本并验证
sudo sh input.sh
ls

脚本内容如下所示:

备注:此脚本支持tab键补全命令,支持回退(删除)输入的内容。

#!/bin/bash
 
#使用readline实现Tab补充,定义一个Tab补充的函数
_readline_tab_complete() {
    # 检查是否按下了Tab键
    if [[ $KEY = $'\t' ]]; then
        # 使用readline的tab补充功能
        bash_completion
        return $?
    fi
    # 如果没有按Tab,正常处理
    read -r -k 1 KEY
} 
#启用Tab补充功能
stty -ixon
trap '_readline_tab_complete' INT
 
read -ep '请输入要创建的文件夹名称:' input_dir
mkdir $input_dir
 
#恢复终端设置
stty sane
trap - INT

image.png

2.4.停止服务脚本

# 编写在服务器上停止指定名称服务脚本:stopService*.sh,并赋予脚本可执行权限

sudo vim stopService-x86_64_v1.1.0.sh
#脚本内容编写完成后赋可执行权限
sudo chmod +x stopService-x86_64_v1.1.0.sh
ls
ps -ef |grep java
ps -ef |grep apiprocess
#执行脚本并验证
sudo sh stopService-x86_64_v1.1.0.sh
ps -ef |grep java
ps -ef |grep apiprocess

脚本内容如下所示:

备注:仅需要更改 javaprocess=(服务启动程序) 和 cprocess=(服务部署路径) 即可。

#!/bin/bash
 
javaprocess=service-starter-app   #指定运行java程序jar包名称
cprocess=apiservice   #指定服务部署路径
 
#查询并关闭java进程
javapid=$(ps -ef |grep -v 'grep'|grep $javaprocess|awk '{print $2}')
for pid in $javapid
do
kill -9 $pid
echo "kill $pid"
echo "停止转换服务成功!"
done
 
#查询并关闭底层进程
cpid=$(ps -ef |grep -v 'grep'|grep $cprocess|awk '{print $2}')
for pid in $cpid
do
kill -9 $pid
echo "kill $pid"
echo "服务底层进程停止成功!"
done

image.png

2.5.文件压缩/解压处理


2.5.1.大文件拆分压缩

# 编写Linux平台将package/apiservice-24.0726.1929.tar.gz大文件压缩为50M的多个小压缩包并包压缩文件指定存放目录的脚本:splitCompressflie.sh,并赋予脚本可执行权限

sudo vim splitCompressflie.sh
#脚本内容编写完成后赋可执行权限
sudo chmod +x splitCompressflie.sh
ls
#执行脚本并验证
sudo du -sh package/*
sudo sh splitCompressflie.sh

脚本内容如下所示:

备注:此脚本支持tab键补全命令,支持回退(删除)输入的内容。

#!/bin/bash
 
#使用readline实现Tab补充,定义一个Tab补充的函数
_readline_tab_complete() {
    # 检查是否按下了Tab键
    if [[ $KEY = $'\t' ]]; then
        # 使用readline的tab补充功能
        bash_completion
        return $?
    fi
    # 如果没有按Tab,正常处理
    read -r -k 1 KEY
} 
#启用Tab补充功能
stty -ixon
trap '_readline_tab_complete' INT
 
ntime=$(date +"%Y%m%d%H%M%S")
read -ep '请输入要压缩的文件(格式为:tar,gz,zip):' filename
read -ep '请输入解压后文件存放目录:' dir
mkdir -p ./$ntime/$dir
read -ep '请输入重新压缩文件存放目录:' npakedir
mkdir -p ./$ntime/$npakedir
read -ep '请输入重新压缩的文件名称:' nfilename
read -ep '请输入拆分后每个文件大小(eg:10M):' filesize
read -ep '请输入拆分后文件名称:' cfilename
work_dir=$(cd $(dirname $0); pwd)
 
#恢复终端设置
stty sane
trap - INT
 
#提取原始文件
echo "将 $filename 解压至:${ntime}/${dir} 目录下"
if [[ ${filename} =~ \.tar\.gz$ ]]; then
  tar -xzf ${filename} -C ${ntime}/${dir}
elif [[ ${filename} =~ \.zip$ ]]; then
  unzip ${filename} -d ${ntime}/${dir}
else
  echo "不支持的文件格式!!!"
  exit 1
fi
echo " $filename 解压文件完成!"
 
#将提取的文件合并为一个文件
echo "将 $ntime/$dir 目录下的文件合并为一个新的文件 $nfilename.tar.gz"
tar -zcf $ntime/$npakedir/$nfilename.tar.gz -C $ntime/$dir/* .
echo "$nfilename.tar.gz 合并成功新文件存放在:$ntime/$npakedir/ 目录下!"
echo "将 $filename 解压至${ntime}/${dir}目录下的文件删除 "
rm -rf $ntime/$dir/*
 
#使用split命令拆分文件
echo "按照 $filesize 大小将 $nfilename.tar.gz  拆分为:$cfilename "
split -b $filesize $ntime/$npakedir/$nfilename.tar.gz $ntime/$dir/$cfilename
 
#压缩拆分后的文件
echo "将拆分后的文件按照 $cfilename*.gz 压缩压缩文件存放目录:$ntime/$dir/"
for file in $ntime/$dir/$cfilename*; do
  gzip "$file"
done
echo "拆分并压缩完成,文件位于:$work_dir/$ntime/$dir/$cfilename*.gz "

image.png

2.5.2.小压缩包合并

# 编写Linux平台将apiserver-24.0726.2129*.gz多个小压缩包,合并为一个新的压缩文件并可以解压使用的脚本:mergeCompressfile.sh,并赋予脚本可执行权限

sudo vim mergeCompressfile.sh
#脚本内容编写完成后赋可执行权限
sudo chmod +x mergeCompressfile.sh
ls
#执行脚本并验证
sudo sh mergeCompressfile.sh

脚本内容如下所示:

备注:此脚本支持tab键补全命令,支持回退(删除)输入的内容。

#!/bin/bash
 
#使用readline实现Tab补充,定义一个Tab补充的函数
_readline_tab_complete() {
    # 检查是否按下了Tab键
    if [[ $KEY = $'\t' ]]; then
        # 使用readline的tab补充功能
        bash_completion
        return $?
    fi
    # 如果没有按Tab,正常处理
    read -r -k 1 KEY
} 
#启用Tab补充功能
stty -ixon
trap '_readline_tab_complete' INT
 
read -ep '请输入要合并的压缩文件路径:' indir
read -ep '请输入要合并后压缩文件名称:' nfilename
mkdir -p $nfilename
work_dir=$(cd $(dirname $0); pwd)
 
#恢复终端设置
stty sane
trap - INT
 
#多个压缩包文件合并
echo "将 $indir 目录下拆分后的压缩包合并为一个新的压缩文件 $nfilename.tar.gz"
cat $indir/*.gz > $nfilename.tar.gz
echo "$nfilename.tar.gz 文件合并完成!!!"
 
#解压合并后的压缩文件
echo "先使用gunzip命令将 $nfilename.tar.gz 解压在 $nfilename 目录下"
gunzip -c $nfilename.tar.gz > $nfilename/$nfilename.tar
echo "$nfilename.tar.gz 文件解压完成!!!"
echo "删除 $nfilename.tar.gz 文件"
rm -rf $nfilename.tar.gz
 
echo "最后使用tar命令将 $nfilename.tar 解压在 $nfilename 目录下"
tar -xzf $nfilename/$nfilename.tar -C $nfilename
echo "$nfilename.tar 文件解压完成!!!"
echo "删除 $nfilename.tar 文件"
 
rm -rf $nfilename/$nfilename.tar
echo "$nfilename.tar 文件删除完成,最终解压文件路径为:$work_dir/$nfilename"

image.png

2.6.docker镜像压缩/解压处理


2.6.1.docker镜像拆分压缩


# 编写Linux平台将package/plss-web-x86-20240520-487-NM.tar.gz大文件拆分为20M的多个小压缩包并包压缩文件指定存放目录的脚本:splitCompressDockertar.sh,并赋予脚本可执行权限

sudo vim splitCompressDockertar.sh
#脚本内容编写完成后赋可执行权限
sudo chmod +x splitCompressDockertar.sh
ls
#执行脚本并验证
sudo du -sh package/*
sudo sh splitCompressDockertar.sh

脚本内容如下所示:

备注:此脚本支持tab键补全命令,支持回退(删除)输入的内容。

#!/bin/bash
 
#使用readline实现Tab补充,定义一个Tab补充的函数
_readline_tab_complete() {
    # 检查是否按下了Tab键
    if [[ $KEY = $'\t' ]]; then
        # 使用readline的tab补充功能
        bash_completion
        return $?
    fi
    # 如果没有按Tab,正常处理
    read -r -k 1 KEY
} 
#启用Tab补充功能
stty -ixon
trap '_readline_tab_complete' INT
 
ntime=$(date +"%Y%m%d%H%M%S")
read -ep '请输入需要拆分的镜像文件:' filename
read -ep '请输入拆分后镜像存放目录:' dir
read -ep '请输入拆分后镜像文件名称:' cfilename
read -ep '请输入拆分后单个镜像文件大小(eg:10M):' filesize
mkdir -p ./$ntime/$dir
work_dir=$(cd $(dirname $0); pwd)
 
#恢复终端设置
stty sane
trap - INT
 
#使用split命令拆分镜像文件
echo "按照 $filesize 大小将 $filename 拆分为:$cfilename 命名的多个镜像文件"
split -b $filesize $filename $ntime/$dir/$cfilename
 
#压缩拆分后的文件
echo "将拆分后的文件按照 $cfilename*.gz 压缩压缩文件存放目录:$ntime/$dir/"
for file in $ntime/$dir/$cfilename*; do
  gzip "$file"
done
echo "拆分并完成压缩,镜像文件位于:$work_dir/$ntime/$dir/$cfilename*.gz "

image.png

2.6.2.docker镜像合并压缩


# 编写Linux平台将plss-web-x86-24.0730.1716*.gz多个小镜像包,合并为一个新的镜像文件并可以load镜像使用的脚本:mergeCompressDockertar.sh,并赋予脚本可执行权限

sudo vim mergeCompressDockertar.sh
#脚本内容编写完成后赋可执行权限
sudo chmod +x mergeCompressDockertar.sh
ls
#执行脚本并验证
sudo sh mergeCompressDockertar.sh

脚本内容如下所示:

备注:此脚本支持tab键补全命令,支持回退(删除)输入的内容。

#!/bin/bash
 
#使用readline实现Tab补充,定义一个Tab补充的函数
_readline_tab_complete() {
    # 检查是否按下了Tab键
    if [[ $KEY = $'\t' ]]; then
        # 使用readline的tab补充功能
        bash_completion
        return $?
    fi
    # 如果没有按Tab,正常处理
    read -r -k 1 KEY
} 
#启用Tab补充功能
stty -ixon
trap '_readline_tab_complete' INT
 
read -ep '请输入要合并的压缩文件路径:' indir
read -ep '请输入要合并后压缩文件名称:' nfilename
mkdir -p $nfilename
work_dir=$(cd $(dirname $0); pwd)
 
#恢复终端设置
stty sane
trap - INT
 
#多个压缩包文件合并
echo "将 $indir 的多个压缩包合并为一个新的压缩文件 $nfilename.tar.gz"
cat $indir/*.gz > $nfilename.tar.gz
echo "$nfilename.tar.gz 文件合并完成!!!"
 
#解压合并后的压缩文件
echo "使用gunzip命令将 $nfilename.tar.gz 解压处理为docker镜像包放在 $nfilename 目录下"
gunzip -c $nfilename.tar.gz > $nfilename/$nfilename.tar.gz
echo "$nfilename.tar.gz 镜像文件合并完成!!!"
echo "删除 $nfilename.tar.gz 文件"
rm -rf $nfilename.tar.gz
echo "合并后 docker 镜像文件路径为:$work_dir/$nfilename"

image.png

本文链接:https://blog.runxinyun.com/post/195.html 转载需授权!

分享到:
版权声明
网站名称: 润信云资讯网
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!邮件:7104314@qq.com
网站部分内容来源于网络,版权争议与本站无关。请在下载后的24小时内从您的设备中彻底删除上述内容。
如无特别声明本文即为原创文章仅代表个人观点,版权归《润信云资讯网》所有,欢迎转载,转载请保留原文链接。
0 86

留言0

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。