文章目录
- 一. shell 编程
- 二.基本语法结构及使用
- 1 脚本编写规范要求
- 2 注释和输入输出
- 3 执行shell脚本
- 1 变量概述
- 2 变量赋值
- 3 脚本位置参数
- 4 变量运算
- 5 读入变量
- 6 变量替换
- 7、常用使用案例说明
- 1 if 选择结构
- 2 案例说明
- 2.1 字符串判断
- 2.2 整数输入判断
- 2.3 逻辑判断
- 2.4 文件判断
创作不易,各位看官,点个赞收藏、关注必回关、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/bashecho \"hello Shell\"执行上述脚本三种方式1. bash test.sh2. sh test.sh3. 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 $urlhttps://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.0echo 学习了第一个语法-标准输出
结果图如下,也可以用
ssh demo01.sh
执行
2、输入输出+使用变量+【-p -s -n】案例
#!/bin/shecho 管理系统echo -------------------------echo 你好,请先登录,然后才能继续操作# 用户输入账号read -p \"请输入您的账号:\" username # -p 提示用户输入信息 username为获取输入变量# 用户输入密码read -s -p \"请输入您的密码:\" password # -s 输入密码不显示# 拓展:程序休眠1秒echo -n \"Loading\"sleep 1echo -n \".\"sleep 1echo -n \".\"sleep 1echo \".\"# 打印用户输入的信息echo 您输入了账号:$usernameecho 您输入了密码:$password
3、变量如何使用
#!/bin/shecho 变量的使用介绍echo 变量先声明赋值,后使用数据echo shell中的变量赋值的时候可以添加双引号,也可以不加双引号echo shell中的变量赋值使用=符号赋值,符号两侧不能有空格name=\"tom\"gender=maleage=18echo 使用变量时,在变量前面添加$符号echo $nameecho $genderecho $ageecho 使用变量时,如果同时和其他字符拼接,按照如下语法操作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执行代码1elif [ 条件2 ];then执行代码2elif [ 条件3 ];then执行代码3else其他情况fi
2 案例说明
符号左右要有空格 比如 =号 左右要空格
2.1 字符串判断
= | 判断两个字符是否相等 |
!= | 判断两个字符串不相等 |
-z | 判断字符串长度为0 zero |
-n | 判断字符串是否为空 null |
#!/bin/sh# 项目执行中read -p \"是否退出系统(Q退出/C继续)?\" res# 判断用户输入的数据if [ $res = \"Q\" ];thenecho \"即将退出系统,请保存好个人数据\"exitelif [ $res = \"C\" ];thenecho \"项目继续进行中....\"fiecho \"项目正常运行.....\"
注意了,有区分大小写这一说法
2.2 整数输入判断
-eq | 判断两个整数是否相等 |
-gt | > |
-lt | < |
-ge | >= |
-le | <= |
-ne | != |
#!/bin/bashread -p \"请输入功能选项\": choiceif [ $choice -eq 1 ];thenecho \"选项1\"elif [ $choice -eq 2 ];thenecho \"选项2\"elif [ $choice -eq 3 ];thenecho \"选项3\"elseecho \"没有此选项\"fi
2.3 逻辑判断
&& | 判断并且关系 |
-a | 判断并且关系 |
|| |
判断或者关系 |
-o | 判断或者关系 |
! | 判断取反 |
#!/bin/shecho 中公-游戏商城用户登录# 提示用户输入账号read -p \"请输入您的账号:\" usernameread -p \"请输入您的密码:\" password# 判断账号密码是否正确echo $usernameecho $password# 如果直接按照下面的方式编写if判断语句,会出现运算符号优先级问题# 需要使用不同的运算符号完成优先级的转换if [ $username = \"admin\" -a $password = \"123\" ]; thenecho 用户登录成功elseecho 账号或者密码有误,请重新登录fi
2.4 文件判断
-e | 判断文件是否存在 | if [ -e 文件存放路径 ] |
-d | 判断是否是文件夹 | if [ -d 文件存放路径 ] |
-f | 判断是否是文件 | if [ -f 文件存放路径 ] |
-r | 判断指定的文件是否可读 | 格式跟上面一样 后面不写了 |
-w | 判断指定的文件是否可写 | |
-x | 判断指定的文件是否可执行 |
#!/bin/sh# 脚本要完成自动备份文件的操作# 需要判断当前目录中是否由back/文件夹# 如果有直接执行备份,如果没有需要创建echo -------- 开始准备备份,检查环境 --------# 判断备份文件夹是否存在if [ -e back ];thenecho back文件已经存在if [ -d back ]; thenecho back是一个文件夹,可以执行备份fielseecho back文件不存在,创建文件夹mkdir backfiecho -------- 开始备份 --------sleep 2echo ------- 备份完成 --------
这里跟我编写的shell脚本存放在一个文件夹下,所有上面程序判断没有加路径
2 case 选择结构
基本语法:
case 变量 in变量 1)命令序列 1;;变量 2)命令序列 2;;*)无匹配后命令序列esac
#!/bin/shecho 管理系统echo -------------------------echo 1.loginecho 2.registerecho 3.quitecho -------------------------# 提示用户输入选项read -p \"亲输入您的选项/操作:\" oper# 根据用户的输入执行不同的操作case $oper in1|login)echo \"用户要登录了....\";;2|register)echo \"用户要注册了....\";;3|quit)echo \"用户准备退出系统\";;*)echo \"没有这个选项\"esac
3 for 循环
for 循环结构,和 Python 中的 for 循环结构语法基本一致
for 变量名 in [取值列表]do循环中重复执行的代码done
#!/bin/shecho 检测集群主机心跳echo 检查集群中的所有主机是否通信良好# 列出集群中所有的主机hosts=\"192.168.0.100 192.168.0.101 192.168.0.102\"# 检查所有主机通信for h in $hostsdoecho 开始检查$h主机通信sleep 1echo $h 检查通过doneecho ----所有主机检查完毕----
4 while 循环
while 循环结构,同样和 python 中的 while 循环基本一致
while 条件do循环要执行的代码done
#!/bin/shecho 1~100的整数的和到底是多少?num=1sum=0while [ $num -lt 100 ]do# expr可以通过表达式直接进行整数的运算,但是赋值会出现问题# sum=expr $sum + $num# $[]运算符号,可以直接进行整数的运算,可以赋值#sum=$[$sum+$num]# $(())运算符号,可以直接进行整数的运算,可以赋值sum=$(($sum+$num))let num+=1doneecho sum: $sum
要完成整数的运算,有三种操作方式 看自己喜欢那个
expr 运算表达式,如 expr 12 + 13$(()) 运算符号,如 res=$((12 + 13))$[]运算符号,如 res=$[12+13]
六、函数声明和调用
SHELL 中的函数,类似 python 中的函数,声明方式和调用方式几乎一致
注意事项:函数执行如果需要参数,不要在函数后面的括号中添加形式参数,shell 中函
数的参数有自己的传递方式。
#!/bin/shecho 函数的声明和调用方式# 标准语法声明函数function test1(){echo 这是一个标准的定义函数}# 快捷语法声明函数test2() {echo 这是一个快捷方式定义的函数}# 调用函数test1test2