Linux_Shell编程详细解读,从入门到入门(滑稽)你值得拥有(5)

创作不易,各位看官,点个赞收藏、关注必回关、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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章