文章目录
创作不易,各位看官,点个赞收藏、关注必回关、QAQ、您的点赞是我更新的最大动力!
一. shell 编程
Shell 编程是 Unix/Linux 操作系统中的一大杀器,系统操作的一个核心元素。Unix要使用的非常精通,对于终端 Shell 脚本编写非常熟练。
- 常见操作命令
- VIM 编辑器的使用
- SHELL 脚本
SHELL 编程就是通过终端编写脚本程序,辅助开发人员完成命令的工程自动 化操作。
- 基础配置:系统初始化操作、系统更新、内核调整等等
- 安装程序:自动部署 LNMP 、 LAMP 、 MySQL 等等
- 配置变更: Nginx 配置 、 MySQL 配置 、 Redis 配置 等等
- 业务部署:配合 git 、 jenkins 等实现自动化持续交付
- 日常备份:脚本对项目或者软件实现全备份或者增量备份等
- 信息采集:硬件、系统、服务、网络等各种数据的自动采集
- 日志分析:获取日志、排序、去重、统计、分析
- 服务扩容:监控服务器就请你信息,脚本程序自动化扩容部署
减少重复工作,周期性工作,降低工作量
二.基本语法结构及使用
脚本程序在编写时,通常会有一些基本的编码规范,这些规范是约定俗成的
1 脚本编写规范要求
脚本存放在 scripts/目录中
开头添加#!/bin/bash,确定 bash 执行命令
附带作者及版权信息 , 脚本扩展名为*.sh
脚本中尽量不用中文
成对的符号一次书写完成
2 注释和输入输出
注释:
除第一行外,以#行注释
输入:
read 读取用户输入的信息
-p 打印提示信息
-s 用户输入信息不明文显示
输出:
echo 打印信息,类似于Python中的print()函数
echo -n 打印信息不换行
3 执行shell脚本
mkdir scripts 根据约定创建scripts文件夹
vim test.sh 创建一个sh脚本并且进入编辑
#!/bin/bash
echo "hello Shell"
执行上述脚本三种方式
1. bash test.sh
2. sh test.sh
3. chmod u+x test.sh 先修改权限再执行
./test.sh
创建文件夹 mkdir scripts
编写一个sh脚本 vim test.sh
保存并且退出
三种执行方式
三. Shell中的变量
1 变量概述
什么是变量:变量时 shell 传递数据的一种方式,作为一个临时存储数据的容器,可以存放 数据并在其他需要的地方直接通过变量名称使用对应的数据。
命令规则:
- 变量定义时要求字母、数字或者下划线组成,数字不能开头。
- 大小写敏感 项目规范:见名知意、下划线命名法
2 变量赋值
变量赋值,就是向变量中存储数据的过程,需要注意
- 变量赋值,使用=符号,将符号右边的计算结果赋值给左边的变量
- 等号两边不能由空格
- 定义的变量不要与系统命令冲突
3 脚本位置参数
shell 脚本可以接受多个参数,在脚本程序中可以通过特定的方式访问这些参数数据
$* 和 ¥@
这两个符号上不添加引号时,都是将接受的多个参数依次获取
$* 上添加双引号,将接受的多个参数当成单字符串获取
$@上添加双引号,将接受的多个参数依次获取
4 变量运算
变量的直接运算,主要体现在命令替换,使用$()
和$(())
[root@localhost scripts]# echo "this is $(date +%Y) year"
this is 2019 year
[root@localhost scripts]# echo "this is $(($(date +%Y)+1)) year"
this is 2020 year
[root@localhost scripts]# echo "this is $((`date +%Y`+1)) year"
this is 2020 year
命令嵌套使用,可以通过符号$( $( ) )的嵌套方式进行操作
需求:将当前目录中的所有 log 日志进行打包压缩
5 读入变量
通过 read 命令,可以完成交互脚本,通过用户输入变量读取到程序中
基本语法:
将用户输入的信息存储到 var 变量中
read -p "提示信息" var
6 变量替换
变量 描述
${变量#匹配规则} 从头部匹配变量,最短删除
${变量##匹配规则} 从头部匹配变量,最长删除
${变量%匹配规则} 从尾部匹配变量,最短删除
${变量%%匹配规则} 从尾部匹配变量,最长删除
${变量/旧字符串/新字符串} 使用新字符串替换旧字符串,替换一次
${变量//旧字符串/新字符串} 使用新字符串替换旧字符串,全部替换
从前向后删除,分别获取指定网站域名、后缀
[root@localhost project]# url=https://www.sohu.com.cn
[root@localhost project]# echo ${url}
https://www.sohu.com.cn
[root@localhost project]# echo ${url#*.}
sohu.com.cn [root@localhost project]
#echo ${url#*hu.} com.cn
从后向前删除,分别获取协议、域名前缀
[root@localhost project]#
url=https://www.sohu.com.cn
[root@localhost project]# echo ${url}
https://www.sohu.com.cn
[root@localhost project]# echo ${url%:*}
https
[root@localhost project]# echo ${url%.sohu*}
https://www
变量替换
[root@damu project]# url="https://www.sohu.com.cn"
[root@damu project]# echo $url
https://www.sohu.com.cn
[root@damu project]# echo ${url/com.cn/COM.CN}
https://www.sohu.COM.CN
[root@damu project]# echo ${url/c/C}
https://www.sohu.Com.cn
7、常用使用案例说明
1、第一个程序
#!/bin/sh
# 我的第一个基本程序
echo 我的第一个脚本
echo -n 作者:稳稳
echo -n 版本:V1.0
echo 学习了第一个语法-标准输出
结果图如下,也可以用 ssh demo01.sh
执行
2、输入输出+使用变量+【-p -s -n】案例
#!/bin/sh
echo 管理系统
echo -------------------------
echo 你好,请先登录,然后才能继续操作
# 用户输入账号
read -p "请输入您的账号:" username # -p 提示用户输入信息 username为获取输入变量
# 用户输入密码
read -s -p "请输入您的密码:" password # -s 输入密码不显示
# 拓展:程序休眠1秒
echo -n "Loading"
sleep 1
echo -n "."
sleep 1
echo -n "."
sleep 1
echo "."
# 打印用户输入的信息
echo 您输入了账号:$username
echo 您输入了密码:$password
3、变量如何使用
#!/bin/sh
echo 变量的使用介绍
echo 变量先声明赋值,后使用数据
echo shell中的变量赋值的时候可以添加双引号,也可以不加双引号
echo shell中的变量赋值使用=符号赋值,符号两侧不能有空格
name="tom"
gender=male
age=18
echo 使用变量时,在变量前面添加$符号
echo $name
echo $gender
echo $age
echo 使用变量时,如果同时和其他字符拼接,按照如下语法操作
echo name:${name}
echo gender:${gender}
echo age:${age}
echo 使用变量时,双引号-强引用 和 单引号-弱引用有区别
echo "name: $name "
echo 'name: $name '
四、数据运算
整数运算 expr、[],整数运算不支持小数运算
操作符 描述
num1 + num2 求和
num1 - num2 求差
num1 * num2 求积
num1 / num2 求商
num1 % num2 取余
五、程序控制结构
[ ] 括号里面的空格严格 左右各自空一格,然后中间输入条件
1 if 选择结构
单分支,基本语法
if 条件;then
条件为True要执行的代码
fi
双分支,基本语法
if 条件;then
条件为True要执行的代码
else
其他情况
fi
多分支,基本语法
if [ 条件1 ];then
执行代码1
elif [ 条件2 ];then
执行代码2
elif [ 条件3 ];then
执行代码3
else
其他情况
fi
2 案例说明
符号左右要有空格 比如 =号 左右要空格
2.1 字符串判断
= | 判断两个字符是否相等 |
!= | 判断两个字符串不相等 |
-z | 判断字符串长度为0 zero |
-n | 判断字符串是否为空 null |
#!/bin/sh
# 项目执行中
read -p "是否退出系统(Q退出/C继续)?" res
# 判断用户输入的数据
if [ $res = "Q" ];then
echo "即将退出系统,请保存好个人数据"
exit
elif [ $res = "C" ];then
echo "项目继续进行中...."
fi
echo "项目正常运行....."
注意了,有区分大小写这一说法
2.2 整数输入判断
-eq | 判断两个整数是否相等 |
-gt | > |
-lt | < |
-ge | >= |
-le | <= |
-ne | != |
#!/bin/bash
read -p "请输入功能选项": choice
if [ $choice -eq 1 ];then
echo "选项1"
elif [ $choice -eq 2 ];then
echo "选项2"
elif [ $choice -eq 3 ];then
echo "选项3"
else
echo "没有此选项"
fi
2.3 逻辑判断
&& | 判断并且关系 |
-a | 判断并且关系 |
|| |
判断或者关系 |
-o | 判断或者关系 |
! | 判断取反 |
#!/bin/sh
echo 中公-游戏商城用户登录
# 提示用户输入账号
read -p "请输入您的账号:" username
read -p "请输入您的密码:" password
# 判断账号密码是否正确
echo $username
echo $password
# 如果直接按照下面的方式编写if判断语句,会出现运算符号优先级问题
# 需要使用不同的运算符号完成优先级的转换
if [ $username = "admin" -a $password = "123" ]; then
echo 用户登录成功
else
echo 账号或者密码有误,请重新登录
fi
2.4 文件判断
-e | 判断文件是否存在 | if [ -e 文件存放路径 ] |
-d | 判断是否是文件夹 | if [ -d 文件存放路径 ] |
-f | 判断是否是文件 | if [ -f 文件存放路径 ] |
-r | 判断指定的文件是否可读 | 格式跟上面一样 后面不写了 |
-w | 判断指定的文件是否可写 | |
-x | 判断指定的文件是否可执行 |
#!/bin/sh
# 脚本要完成自动备份文件的操作
# 需要判断当前目录中是否由back/文件夹
# 如果有直接执行备份,如果没有需要创建
echo -------- 开始准备备份,检查环境 --------
# 判断备份文件夹是否存在
if [ -e back ];then
echo back文件已经存在
if [ -d back ]; then
echo back是一个文件夹,可以执行备份
fi
else
echo back文件不存在,创建文件夹
mkdir back
fi
echo -------- 开始备份 --------
sleep 2
echo ------- 备份完成 --------
这里跟我编写的shell脚本存放在一个文件夹下,所有上面程序判断没有加路径
2 case 选择结构
基本语法:
case 变量 in
变量 1)
命令序列 1
;;
变量 2)
命令序列 2
;;
*)
无匹配后命令序列
esac
#!/bin/sh
echo 管理系统
echo -------------------------
echo 1.login
echo 2.register
echo 3.quit
echo -------------------------
# 提示用户输入选项
read -p "亲输入您的选项/操作:" oper
# 根据用户的输入执行不同的操作
case $oper in
1|login)
echo "用户要登录了...."
;;
2|register)
echo "用户要注册了...."
;;
3|quit)
echo "用户准备退出系统"
;;
*)
echo "没有这个选项"
esac
3 for 循环
for 循环结构,和 Python 中的 for 循环结构语法基本一致
for 变量名 in [取值列表]
do
循环中重复执行的代码
done
#!/bin/sh
echo 检测集群主机心跳
echo 检查集群中的所有主机是否通信良好
# 列出集群中所有的主机
hosts="192.168.0.100 192.168.0.101 192.168.0.102"
# 检查所有主机通信
for h in $hosts
do
echo 开始检查$h主机通信
sleep 1
echo $h 检查通过
done
echo ----所有主机检查完毕----
4 while 循环
while 循环结构,同样和 python 中的 while 循环基本一致
while 条件
do
循环要执行的代码
done
#!/bin/sh
echo 1~100的整数的和到底是多少?
num=1
sum=0
while [ $num -lt 100 ]
do
# expr可以通过表达式直接进行整数的运算,但是赋值会出现问题
# sum=expr $sum + $num
# $[]运算符号,可以直接进行整数的运算,可以赋值
#sum=$[$sum+$num]
# $(())运算符号,可以直接进行整数的运算,可以赋值
sum=$(($sum+$num))
let num+=1
done
echo sum: $sum
要完成整数的运算,有三种操作方式 看自己喜欢那个
expr 运算表达式,如 expr 12 + 13
$(()) 运算符号,如 res=$((12 + 13))
$[]运算符号,如 res=$[12+13]
六、函数声明和调用
SHELL 中的函数,类似 python 中的函数,声明方式和调用方式几乎一致
注意事项:函数执行如果需要参数,不要在函数后面的括号中添加形式参数,shell 中函
数的参数有自己的传递方式。
#!/bin/sh
echo 函数的声明和调用方式
# 标准语法声明函数
function test1(){
echo 这是一个标准的定义函数
}
# 快捷语法声明函数
test2() {
echo 这是一个快捷方式定义的函数
}
# 调用函数
test1
test2