Shell脚本简单示例

Shell编程100例:https://zhuanlan.zhihu.com/p/509956726?utm_source=wechat_session&utm_medium=social&utm_oi=988048367724900352

一、Shell概述

shell 是一种脚本语言

脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)

shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言)

shell命令解析器:

系统提供 shell命令解析器: sh ash bash

查看自己linux系统的默认解析:echo $SHELL

Shell脚本简单示例

写这篇文章的目的是,基于Shell,批量启动/停止Tomcat的教程。

二、使用Shell脚本自动安装JDK8

使用此脚本,你只需要将jdk-8u144-linux-x64.tar.gz这个压缩包放在/root目录下,并新建一个脚本文件,即可实现安装JDK,并自动配置环境变量。

脚本文件:install_jdk.sh

1、 在用户家目录(/root)下新建 install_jdk.sh 文件

2、 将JDK安装包放在/root目录下,这里注意一下要注意脚本中的jdk路径,要与存放的jdk目录一直,否则会找不到

3、 执行脚本:bash install_jdk.sh

#!/bin/bash

jdk存放目录(指定jdk放在/root目录下)
jdkTarget="/root/jdk-8u144-linux-x64.tar.gz"
jdkInstallCatalogue="/usr/local/java"

检查原先是否已配置java环境变量
checkExist(){
 jdk1=$(grep -n "export JAVA_HOME=.*" /etc/profile | cut -f1 -d':')
    if [ -n "$jdk1" ];then
        echo "JAVA_HOME已配置,删除内容"
        sed -i "${jdk1}d" /etc/profile
    fi

 jdk2=$(grep -n "export CLASSPATH=.*\$JAVA_HOME.*" /etc/profile | cut -f1 -d':')
    if [ -n "$jdk2" ];then
        echo "CLASSPATH路径已配置,删除内容"
        sed -i "${jdk2}d" /etc/profile
    fi

 jdk3=$(grep -n "export PATH=.*\$JAVA_HOME.*" /etc/profile | cut -f1 -d':')
    if [ -n "$jdk3" ];then
        echo "PATH-JAVA路径已配置,删除内容"
        sed -i "${jdk3}d" /etc/profile
    fi
}

查询是否有jdk.tar.gz
if [ -e $jdkTarget ];then

  #查询jdk安装目录是否存在
    if [ -d $jdkInstallCatalogue ]; then
        echo "— — 删除原jdk安装目录内的所有内容 — —"
        rm -rf /usr/local/java/*
    else
        echo "— — 创建JDK安装目录 — —"
        mkdir -p /usr/local/java &> /dev/null
    fi

  echo "— — 存在jdk压缩包 — —"
  echo "正在解压jdk压缩包..."
  tar -zxvf /root/jdk-8u144-linux-x64.tar.gz -C /usr/local/java/ &> /dev/null

检查配置信息
 checkExist

  echo "---------------------------------"
  echo "正在配置jdk环境..."
  sed -i '$a export JAVA_HOME=/usr/local/java/jdk1.8.0_144' /etc/profile
  sed -i '$a export PATH=.:$JAVA_HOME/bin:$PATH' /etc/profile
  sed -i '$a export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' /etc/profile
  echo "---------------------------------"
  echo "JAVA环境配置已完成..."
  echo "---------------------------------"
  echo "正在重新加载配置文件..."
  echo "---------------------------------"
  source /etc/profile
  echo "配置版本信息如下:"
  java -version
else
  echo "未检测到安装包,请将安装包放到/root目录下"
fi

三、使用Shell脚本自动安装Tomcat

使用此脚本,你无需再额外的下载Tomcat的压缩包,该脚本会自动从Apache官网上面下载指定的Tomcat版本。

当然你如果已经有了安装包放在了/root下,脚本也会自动检测到压缩包,并自动安装并启动Tomcat。

脚本文件:install_tomcat.sh

#!/bin/bash
#定义函数check
function check(){
  if [ $? == 0 ]; then
          echo -e "\033[32m success \033[0m"
  else
          echo -e "\033[31m fail \033[0m"
          exit 0
  fi
}

#创建tomcat目录
if [ -d /usr/local/tomcat ];then
        echo "— — 删除原tomcat安装目录内的所有内容 — —"
        rm -rf /usr/local/tomcat/* &> /dev/null
        cd /usr/local/tomcat &> /dev/null
else
        echo "正在创建tomcat目录"
        mkdir -p /usr/local/tomcat &> /dev/null
        cd /usr/local/tomcat &> /dev/null
fi
check
#下载tomcat8
if [ -e apache-tomcat-8.0.23.tar.gz ];then
        tar -zxvf apache-tomcat-8.0.23.tar.gz &> /dev/null
        echo "正在安装tomcat8"
else
        echo "正在下载tomcat8"
        wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.23/bin/apache-tomcat-8.0.23.tar.gz && tar -zxvf apache-tomcat-8.0.23.tar.gz &> /dev/null
        echo "正在解压tomcat8"
fi
check
#启动tomcat服务
echo "正在启动tomcat服务"
cd apache-tomcat-8.0.23/bin && ./startup.sh &> /dev/null
check
echo -e "\033[32m 安装成功并启动tomcat服务 \033[0m"

Shell脚本简单示例

Shell脚本简单示例

四、使用Shell脚本批量关闭Tomcat,并清理Tomcat日志

在日常的工作中,难免有需要关闭tomcat的功能,如果一个服务器上面有好几个tomcat,一个个手动关闭进程实在是太繁琐,所以本案例演示一下如何使用shell批量关闭tomcat进程,并清理log文件释放磁盘空间。

脚本文件:shutdown_all_tomcat.sh

#!/bin/bash
echo -e "\e[34m ==================start【date +"%Y-%m-%d %H:%M:%S"】================== \e[0m"
echo -e "\e[33m ==================【批量关闭tomcat,并清理log文件夹】site:================== \e[0m"

定义全局变量(有几个tomcat,写几个tomcat的路径)
tomcat_dir=(
  /usr/local/tomcat/apache-tomcat-8.0.23
  /usr/local/tomcat/apache-tomcat-8.0.23-01
)

echo "开始清理日志,释放磁盘空间"
for(( i=0;i#tomcat_dir[@]};i++))
do
    if [ -d  ${tomcat_dir[i]} ]; then
        rm -f ${tomcat_dir[i]}/logs/*;
        echo "${tomcat_dir[i]}日志文件清理完成"
      else
        echo -e "\033[31m目录:${tomcat_dir[i]}不存在,无法指定清理日志工作! \033[0m"
      fi
done;
echo "日志文件清理结束"

echo "停止tomcat服务"
echo -e "\e[34m ==================end【date +"%Y-%m-%d %H:%M:%S"】================== \e[0m"
ps -ef | grep tomcat | grep -v grep | cut -c 9-15 | xargs kill -9 &> /dev/null

Shell脚本简单示例

关闭指定Tomcat进程

chmod +x kill_tomcat.sh
./kill_tomcat.sh

csharp;gutter:true;</p> <h1>!/bin/bash</h1> <p>Get the PID of the tomcat-rfwm process pid=$(ps -ef | grep tomcat-rfwm | awk '{print $2}')</p> <p>Kill the process kill -9 $pid</p> <p>Check if the process was successfully killed if [ $? -eq 0 ] then echo "tomcat-rfwm process was successfully killed with PID: $pid" else echo "Failed to kill tomcat-rfwm process with PID: $pid" fi</p> <pre><code> ## 无、使用Shell脚本批量启动tomcat **脚本文件:start_all_tomcat.sh** </code></pre> <h1>!/bin/bash</h1> <p>echo -e "\e[34m ==================start【<code>date +"%Y-%m-%d %H:%M:%S"</code>】================== \e[0m" echo -e "\e[33m ==================【批量启动Tomcat服务器】site:================== \e[0m"</p> <p>定义全局变量(有几个tomcat,写几个tomcat的路径) tomcat_dir=( /usr/local/tomcat/tomcat-web1 /usr/local/tomcat/tomcat-web2 )</p> <p>for(( i=0;i#tomcat_dir[@]};i++)) do if [ -d ${tomcat_dir[i]} ]; then echo "正在启动:${tomcat_dir[i]}服务" cd ${tomcat_dir[i]}/bin && ./startup.sh tail -f ../logs/catalina.out &> /dev/null else echo -e "\033[31m目录:${tomcat_dir[i]}不存在,无法启动服务! \033[0m" fi done; echo -e "\e[34m ==================end【<code>date +"%Y-%m-%d %H:%M:%S"</code>】================== \e[0m"</p> <pre><code> 1、 在用户家目录(/root)下新建 **start_all_tomcat.sh** **文件** 2、 在脚本文件中修改自己的tomcat路径 3、 启动脚本 模拟两个Tomcat: ![Shell脚本简单示例](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/2126720-20220607161708755-1460448829.png) 执行脚本: ![Shell脚本简单示例](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/2126720-20220607161736448-953265302.png) 两台Tomcat已成功启动: ![Shell脚本简单示例](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/2126720-20220607161800339-66437064.png) ## 六、Tomcat重启脚本,可添加多个Tomcat ;gutter:true;
#!/bin/bash
export JAVA_HOME=/usr/local/java/jdk1.8.0_144
tomcat的位置
tomcat_home=/usr/local/tomcat8/apache-tomcat-8.5.51
#【1】 停止tomcat变量
SHUTDOWN=$tomcat_home/bin/shutdown.sh
#【2】 启动tomcat变量
STARTTOMCAT=$tomcat_home/bin/startup.sh

#【3】 获取进程ID
PID=ps -ef |grep $tomcat_home/conf |grep -v grep | awk '{print $2}'
if [ ! "$PID" ];then # 这里判断TOMCAT进程是否存在
echo "进程不存在"
else
echo "进程存在,关闭Tomcat"
kill -9 $PID
fi

#【4】启动项目
$STARTTOMCAT
echo "启动项目"

七、使用Shell脚本实现自动拉取、编译、打包、发布项目

1、环境

1.1:需要准备的环境是,Java、Maven、Git:

均可以参考我的这篇文章进行安装:https://www.cnblogs.com/zhangzhixi/p/14399602.html

1.2:进行测试的项目(代码已经写好了,不用配置其他东西):

git地址:https://gitee.com/zhang-zhixi/ruiji-takeout.git

2、编写shell脚本

什么也不用配置,你只管执行,剩下的交给我~

csharp;gutter:true;</p> <h1>!/bin/sh</h1> <p>echo ================================= echo 自动化部署脚本启动 echo =================================</p> <p>echo 停止原来运行中的工程 APP_NAME=ruiji-takeout</p> <p>tpid=<code>ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'</code> if [ ${tpid} ]; then echo 'Stop Process...' kill -15 $tpid fi sleep 2 tpid=<code>ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'</code> if [ ${tpid} ]; then echo 'Kill Process!' kill -9 $tpid else echo 'Stop Success!' fi</p> <h1>创建项目目录</h1> <p>if [ -d /usr/local/project/ ];then cd /usr/local/project/ else echo "项目目录不存在,正在努力创建中......" mkdir -p /usr/local/project cd /usr/local/project/ fi</p> <p>echo 准备从Git仓库拉取/下载最新代码 if [ -d /usr/local/project/ruiji-takeout ];then echo 开始从Git仓库拉取最新代码 cd ruiji-takeout git pull https://gitee.com/zhang-zhixi/ruiji-takeout.git else echo "正在创建文件夹,并克隆项目" git clone https://gitee.com/zhang-zhixi/ruiji-takeout.git cd ruiji-takeout/ fi</p> <p>echo 代码拉取完成</p> <p>echo 开始打包 output=<code>mvn clean package -Dmaven.test.skip=true</code></p> <p>cd target</p> <p>echo 启动项目 nohup java -jar reggie-takeout-0.0.1-SNAPSHOT.jar &> helloworld.log & echo 项目启动完成</p> <pre><code> ![Shell脚本简单示例](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/2126720-20220716195436353-1828796990.png) 成功访问: ![Shell脚本简单示例](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/2126720-20220716195732619-1833483995.png) ## 八、服务器之间传输文件:scp 通常我们在服务器之间传输文件,使用的命令是scp,命令格式为: ;gutter:true;
scp 文件/目录 用户@主机名:远端目录

scp -r test.txt root@Ip:/root

如果我们使用Shell脚本传输文件应该如何操作呢?

直接使用scp命令是不可以的,因为在通过SCP命令进行文件传输时,如果目标服务器上的帐户没有免密码登录的公钥,则必须在脚本中输入密码。

假设我们有个需求,A服务器向B服务器发送文件(首先A能ping通B)

A服务器:182.92.209.212

B服务器:43.143.195.160

1、在服务器A上生成公钥/私钥对

csharp;gutter:true; ssh-keygen -t rsa</p> <pre><code> ![Shell脚本简单示例](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230605/2126720-20230213114741975-1661291301.png) > 2、将公钥复制到服务器B ;gutter:true;
ssh-copy-id root@43.143.195.160

Shell脚本简单示例

3、编写shell脚本,执行测试

csharp;gutter:true; 创建脚本 touch scp.sh 添加权限 chmod 777 scp.sh 执行脚本 bash scp.shj</p> <pre><code> 脚本: 选项 -r用于递归传输,意味着整个目录都会被复制到目标主机上。 选项 -q用于安静模式,意味着不显示任何状态或进度信息 ;gutter:true;
#!/bin/bash

Define the source and destination file paths
source_file=’/111.txt’
destination_file=’/root/111.txt’

Use the scp command to transfer the file from Server A to Server B
scp -rq $source_file root@43.143.195.160:$destination_file

九、凌晨跑定时任务:关闭进程、创建文件夹、访问任务链接等

博客地址:https://www.cnblogs.com/zhangzhixi/p/15784721.html#_label1_3

十、一个方便功能完善的Linux管理脚本工具

csharp;gutter:true;</p> <h1>!/bin/bash</h1> <p>判断系统类型,选择合适的包管理器 if [ -n "$(command -v yum)" ]; then PKGMGR="yum" elif [ -n "$(command -v apt-get)" ]; then PKGMGR="apt-get" else echo "无法确认系统类型,请手动安装软件包。" exit 1 fi</p> <p>安装必需的工具和软件包 for TOOL in curl tar zstd unzip; do if ! command -v $TOOL > /dev/null; then sudo $PKGMGR install -y $TOOL fi done</p> <p>菜单文字提示 function menu() { cat << EOF ========================================= Linux 系统管理工具 ========================================= 1. 进程管理 2. 磁盘管理 3. 网络管理 4. 日志分析 5. 用户管理 6. 安全管理 7. 系统信息 8. 定时任务 0. 退出 ========================================= EOF read -p "请输入数字选择相应的菜单:" CHOICE }</p> <p>进程管理 function process_mgmt() { while true do cat << EOF 1. 列出所有进程 2. 杀死指定进程 3. 按照端口杀死进程 0. 返回上一级菜单 磁盘管理 EOF read -p "请输入数字选择相应的菜单:" CHOICE case $CHOICE in 1) df -h ;; 2) read -p "请输入要清理的文件路径:" PATH sudo find $PATH -type f -mtime +30 -delete ;; 0) break ;; *) echo "错误的选择。" ;; esac done }</p> <p>网络管理 function network_mgmt() { while true do cat << EOF 1. 查看网络连接 2. 配置网络接口 3. 查询端口信息 4. 扫描局域网设备 0. 返回上一级菜单 日志分析 EOF read -p "请输入数字选择相应的菜单:" CHOICE case $CHOICE in 1) cat /var/log/syslog ;; 2) read -p "请输入要筛选的关键字:" KEYWORD cat /var/log/syslog | grep $KEYWORD ;; 3) read -p "请输入要保存的文件路径:" FILEPATH cat /var/log/syslog > $FILEPATH ;; 0) break ;; *) echo "错误的选择。" ;; esac done }</p> <p>用户管理 function user_mgmt() { while true do cat << EOF 1. 查看用户列表 2. 添加用户 3. 删除用户 4. 修改用户密码 0. 返回上一级菜单 安全管理 EOF read -p "请输入数字选择相应的菜单:" CHOICE case $CHOICE in 1) read -p "请输入新的 SSH 端口号:" PORT sudo sed -i "s/Port .<em>/Port $PORT/g" /etc/ssh/sshd_config sudo service sshd restart ;; 2) sudo sed -i "s/PermitRootLogin yes/PermitRootLogin no/g" /etc/ssh/sshd_config sudo service sshd restart ;; 0) break ;; </em>) echo "错误的选择。" ;; esac done }</p> <p>系统信息 function system_info() { cat << EOF ========================================= 系统信息 ========================================= 操作系统:$(lsb_release -d | cut -f2-) 内核版本:$(uname -r) CPU 信息:$(grep "model name" /proc/cpuinfo | head -n1 | cut -d: -f2-) 内存信息:$(free -h | awk 'NR==2 {print $2}') 磁盘信息:$(df -h | awk '$NF=="/" {print "总容量:" $2 ", 剩余容量:" $4}') ========================================= EOF }</p> <p>定时任务 function cron_job() { crontab -l }</p> <p>主循环 while true do menu case $CHOICE in 1) process_mgmt ;; 2) disk_mgmt ;; 3) network_mgmt ;; 4) log_analysis ;; 5) user_mgmt ;; 6) security_mgmt ;; 7) system_info ;; 8) cron_job ;; 0) echo "谢谢使用,再见!" exit 0 ;; *) echo "错误的选择。" ;; esac done

Original: https://www.cnblogs.com/zhangzhixi/p/16352319.html
Author: Java小白的搬砖路
Title: Shell脚本简单示例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612264/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring中常见的注解

    1.组件注解 @Controller @Service @Repository @Component —标注一个类为Spring容器的Bean @Configratio…

    数据库 2023年6月11日
    087
  • 从零开始的常用MySQL语句练习大全

    很多时候深入学习固然很重要,但是想要写下一篇给新手都能看得懂看的很香,并且老鸟可以查漏补缺的的练习博客,还是挺有难度,所以今天尝试写一些关于MySQL的语句练习大全,供想要从零开始…

    数据库 2023年6月11日
    088
  • 【黄啊码】MySQL入门—1、SQL 的执行流程

    大家好!我是黄啊码,鉴于大家对于学习的热情,从今天起,将连载mysql的相关知识,需要学习的可以注意我的更新学习,后期估计会开启付费专栏,但当前完全可以白嫖,希望大家珍惜! 首先我…

    数据库 2023年6月16日
    083
  • MariaDB主从备份

    MariaDB主从备份 修改my.ini的参数 注释第30行左右的bind-address bind-address=127.0.0.1 注释61行左右的log-bin=mysql…

    数据库 2023年6月9日
    068
  • MySQL 8.0 新特性梳理汇总

    一 历史版本发布回顾 从上图可以看出,基本遵循 5+3+3 模式 5—GA发布后,5年 就停止通用常规的更新了(功能不再更新了); 3—企业版的,+3年功能…

    数据库 2023年6月16日
    081
  • 有趣的网络知识

    简单的网络入侵方法 命令 描述 attrib +s +a +h +r &#x78C1;&#x76D8;:&#x6587;&#x4EF6;&#…

    数据库 2023年6月11日
    099
  • 线程池系列二:一张动图,彻底懂了execute和submit

    ​我们知道线程池通过execute方法执行提交的Runnable任务,但Runnable只是执行任务,没有返回任何信息。 【线程池原理:线程池原来是个外包公司,打工人我悟了】 若是…

    数据库 2023年6月6日
    0111
  • Python日志模块封装

    一、先上结论 对 Python logging模块进行二次封装 -*- coding:utf-8 -*- 作者:IT小学生蔡坨坨 博客:caituotuo.top 时间:2022/…

    数据库 2023年6月11日
    093
  • 8 int和Integer的区别

    数据类型 int是基本数据类型,Integer是int的包装类,属于引用类型 初始值 int的初始值为0,Integer的初始值为null 存储位置 int是直接存储在栈中的,In…

    数据库 2023年6月6日
    096
  • AJAX(Web数据交互方式)

    使用 Ajax 技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。 AJAX 一. 什么是 AJAX? AJAX …

    数据库 2023年6月11日
    0106
  • 常见的位操作及其应用

    概述 与、或、异或、取反或者移位运算这几种基本的位操作想必诸位读者并不陌生,如果我们能在某些合适场景下使用位运算,有些时候可以大大提高算法的效率。但由于本身位运算太过灵活,甚至某些…

    数据库 2023年6月11日
    078
  • 手把手教你定位线上MySQL锁超时问题,包教包会

    昨晚我在床上睡着了,突然来了一条短信。 [En] I was asleep in bed last night when suddenly a text message came….

    数据库 2023年5月24日
    080
  • jmeter-操作mysql

    1. 环境:jmeter5.3,mysql5.7。 提取码:ZHEN 3. 操作 ①. 测试计划内导入jdbcjar包 ②. jmeter内添加👉线程组,点击”添加→配…

    数据库 2023年6月14日
    085
  • mysql安装及主从复制配置

    一、安装 mysql8.0 下载mysql 安装包http://mirrors.sohu.com/mysql/MySQL-8.0/ wget http://mirrors.sohu…

    数据库 2023年5月24日
    064
  • 学习笔记——Django项目中请求与响应(json数据)

    2022-10-04 测试json数据与Django项目与pycharm连接,在”postman”软件中。”postman”是一个接…

    数据库 2023年6月14日
    0148
  • 4. 事务和锁

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    0102
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球