Bootstrap

2024.7.26(shell脚本)

一、shell基础

1、shell 概念

shell英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是操作系统的外壳。可以通过shell命令来操作和控制操作系统,比如Linux中的shell命令就包括Is、cd、pwd等等。

shell 在内核的基础上编写的一个应用程序,它连接了用户和Linux内核,从而让用户能够更加便捷、高效、安全的使用linux内核,这其实就是shell的本质。

使用专业术语的说法来解释,Shell其实是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。

2、shell脚本

■ shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻
辑,脚本不用编译即可运行,它从一定程度上减轻了工作量,提高了工作效率,还可以批
量、定时处理主机,方便管理员进行设置或者管理。

3、shell脚本编写注意事项

■ shell命名:shell脚本名称命名一般为英文、大写、小写、后缀以.sh结尾不能使用特殊符号、空格

■名称要写的一眼可以看出功能,也就是顾名思义

■ shell脚本首行需要#!/bin/bash开头

■ shell脚本变量不能以数字、特殊符号开头,可以使用下划线_,但不能用破折号

二、shell脚本的构成

■ 脚本声明

■ 注释信息
■ 可执行语句

三、编写shell脚本

1、编写简单的脚本并运行

[root@slv ~]# vim helloworld.sh


[root@slv ~]# bash helloworld.sh

[root@slv ~]# source helloworld.sh
[root@slv ~]# chmod +x helloworld.sh
[root@slv ~]# ./helloworld.sh

2、编写nginx脚本

# 逻辑顺序:先交装依赖关系,再进入到系统默认的安装包目录src,使用wget命令到网上下载nginx1.26.1版本的交装包,然后解压,再移动到nginx 安装目录,执行编译安装并配置,编译,编译安装)

[root@slv ~]# vim install_nginx.sh


[root@slv ~]# chmod +x install_nginx.sh
[root@slv ~]# ./install_nginx.sh

四、变量

1、自定义变量

■ 变量名=值中,等于号=之前和之后不能有空格,比如:name=yang,这样是错的,
name=yang 才对

■ 变量名=值中,值内如果输入数学算式,是没办法算出结果的,只会输出字符串。

[root@slv ~]# b=4
[root@slv ~]# echo $b
4

2、环境变量

■ 由系统维护,用于设置工作环境

- $PWD

. $SHELL

· $USER

[root@slv ~]# echo $PWD
/root
[root@slv ~]# echo $SHELL
/bin/bash

3、在脚本中读取参数

[root@slv ~]# vim test001.sh

[root@slv ~]# bash test001.sh 1 2 3 4 5
1
2
3
4
5

[root@slv ~]# bash test001.sh a b d f e
a
b
d
f
e

3、位置变量

$0:第一个字段表示命令名或脚本名称

$1:脚本要处理的第一个参数

$2:脚本要处理的第二个参数

Shell脚本最多可以直接处理9个参数

[root@slv ~]# vim createacc.sh


[root@slv ~]# bash createacc.sh zhangsan 1

4、预定义变量

Bash中内置的一类变量,不能直接修改

预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创
建新的预定义变量,也不能直接为预定义变量赋值。

$ *: 将所有参数作为整体

$@:单个数的组合,每个参数占一行
$0:保存了脚本名称

$ ?: 保存命令或脚本的执行状态码

$#:保存脚本要处理的参数的个数

[root@slv ~]# vim test002.sh

[root@slv ~]# bash test002.sh 1 2 3 a b c
1 2 3 a b c

[root@slv ~]# vim test002.sh


[root@slv ~]# bash test002.sh 1 2 3 a b c
1 2 3 a b c
0
6
test002.sh

5、变量的定义与输出
5.1 定义一个新的变量

格式:变量名=变量值
注意:变量名必须以字母或下划线开头,严格区分大小写

5.2 变量符号运用

双引号:允许通过$符号引用其他变量值

单引号:禁止引用其他变量值,$视为普通字符

反撇号:或$():命令替换,提取命令的执行结果

6、变量的作用范围

默认情况下,新定义的变量只在当前Shell环境中有效,因此称为局部变量。当进入子程序或新的子shell 时,局部变量将无法再使用。

为了使用户定义的变量在所有子Shell环境中能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量导出为“全局变量”。

格式 1:export 变量名

格式 2:export 变量名=值 

五、判断语法

1、条件判断

[root@slv ~]# vim if.sh


[root@slv ~]# bash if.sh
两个数字不相等

2、数字判断

[root@slv ~]# vim if.sh


[root@slv ~]# bash if.sh
请输入一个数
2
请输入第二个数字
4
两个数字不相等

3、创建检测网络是否畅通脚本

[root@slv ~]# vim netping.sh


[root@slv ~]# bash netping.sh www.baidu.com
输入网址:www.baidu.com
PING www.a.shifen.com (180.101.50.188) 56(84) bytes of data.
64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=1 ttl=128 time=29.6 ms
64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=2 ttl=128 time=99.5 ms
64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=3 ttl=128 time=35.6 ms

[root@slv ~]# vim netping.sh


[root@slv ~]# bash netping.sh 
输入网址:www.baidu.com
0

[root@slv ~]# vim netping.sh


[root@slv ~]# bash netping.sh 
输入网址:www.baidu.com
网络通畅

六、字符串判断

1、格式

[ 字符串1 == 字符串2]       字符串内容相同

[字符串1 != 字符串2]         字符串内容不同
[ -z 字符串 ]                       字符串内容为空

[-n字符串]                          字符串内容不为空

[root@slv ~]# aaa="abc"
[root@slv ~]# echo $aaa
abc
[root@slv ~]# test $aaa == "abc"
[root@slv ~]# echo $?
0                            //真
[root@slv ~]# test $aaa == "aaa"
[root@slv ~]# echo $?
1                            //假

2、案例
2.1 用户登录

[root@slv ~]# vim zifu.sh


[root@slv ~]# bash zifu.sh
请输入账号admin
欢迎登陆:admin

[root@slv ~]# bash zifu.sh
请输入账号abc
账号或密码错误

 2.2 rpm检查是否安装软件

[root@slv ~]# vim rpm.sh


[root@slv ~]# bash rpm.sh
1

[root@slv ~]# vim rpm.sh

七、文件、目录、权限判断

1、格式

[操作符 文件或目录]

常用的测试操作符:

-e“文件目录或自定变量”        判断文件或目录是否存在exists 

-f“文件目录或自定变量”        判断是否为文件 isfile
-d"文件目录或自定变量”        判断是否为目录
-w“文件目录或自定变量”        判断是否可写
-r"文件目录或自定变量”        判断是否可读
-x“文件目录或自定变量”        判断是否可执行

-s“文件目录或自定变量”        判断文件大小,非0时为真(若为非空文件,则为真)
-z"文件目录或自定变量”        判断变量参数值是否为空,为空为真,非空为假

2、示例

[root@slv ~]# touch abc
[root@slv ~]# ls -lh abc
-rw-r--r-- 1 root root 0 7月  26 11:26 abc

[root@slv ~]# [ -e "abc" ]
[root@slv ~]# echo $?
0
[root@slv ~]# [ -e "zzz" ]
[root@slv ~]# echo $?
1
[root@slv ~]# [ -w "zzz" ]
[root@slv ~]# echo $?
1
[root@slv ~]# [ -w "abc" ]
[root@slv ~]# echo $?
0
[root@slv ~]# [ -x "abc" ]
[root@slv ~]# echo $?
1

[root@slv ~]# chmod +x abc

[root@slv ~]# ls -lh abc
-rwxr-xr-x 1 root root 0 7月  26 11:26 abc
[root@slv ~]# [ -x "abc" ]
[root@slv ~]# echo $?
0

八、与或判断

判断多个条件

多个条件其中一个成立,或

多个条件都要成立,与

或运算判断:||           或,两个条件满足其一即可,还有-o

与运算判断:&&        与,两个条件都得满足才行,还有-a

1、与判断

[root@slv ~]# vim test2.sh


[root@slv ~]# bash test2.sh
请输入名称hs^H
不行
[root@slv ~]# bash test2.sh
请输入名称hehe
友好

2、或判断

[root@slv ~]# vim test3.sh


[root@slv ~]# bash test3.sh
nl30
xb女
加钱

3、多重判断

[root@slv ~]# vim elif.sh


[root@slv ~]# bash elif.sh
1新增文件 2删除文件 3修改文件 4查找文件
请选择序号1
[root@slv ~]# ls

[root@slv ~]# bash elif.sh
1新增文件 2删除文件 3修改文件 4查找文件
请选择序号2
[root@slv ~]# ls

九、shell脚本读取用户输入和计算

1、shell读取用户输入 
1. read命令

read:用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘
读取用户输下的数据;如果进行了重定向,那么可以从文件中读取数据。

1.1 格式

read[-选项][变量赋值]

1.2 选项

变量赋值:可以有一个,也可以有多个

-p: 显示提示信息

-s:静默模式,不会在屏幕上显示输入的字符。可用于输入密码或其他需要保密的信息

2. 示例
2.1 一个变量赋值

[root@slv ~]# read -p "输入一个数据" s
输入一个数据jdwdh
[root@slv ~]# echo $s
jdwdh
[root@slv ~]# read -p "输入一个数据" -s s
输入一个数据[root@slv ~]# echo $s
hdsuwgd

2.2 多个变量赋值

[root@slv ~]# read -p "三个变量" a b c
三个变量12 18 20
[root@slv ~]# echo $a
12
[root@slv ~]# echo $b
18
[root@slv ~]# echo $c
20

3. 案例

[root@slv ~]# vim register.sh


[root@slv ~]# bash register.sh 
usrname:abc
passwd:1
更改用户 abc 的密码 。
passwd:所有的身份验证令牌已经成功更新。
账户abc注册成功
[root@slv ~]# su abc
[abc@slv root]$ su
密码:

十、循环语法

1、for循环
1. 语法

for 变量名 in 取值列表(范围)

do  

命令序列

done

取值列表:数字范围、字符串、多个字符串、提前设定好的变量等

for默认以所有的空白字符进行分隔: tab、空格、回车,去循环处理

分隔成几段就循环几次

2.案例

[root@slv ~]# yum -y install inotify-tools
[root@slv ~]# mkdir /abc
[root@slv ~]# nohup inotifywait -mr /abc/
[root@slv ~]# cat nohup.out
[root@slv ~]# vim wait.sh


[root@slv ~]# bash wait.sh

[root@slv ~]# vim loop.sh


[root@slv ~]# bash loop.sh

[root@slv ~]# vim l.sh


[root@slv ~]# bash l.sh
青岛是个好地方
长沙是个好地方
庆阳是个好地方

2、while 循环
1. 作用

重复测试某个条件,只要条件成立则反复执行

2. 结构

while 条件测试操作

do

命令序列

done

3. while 和 for区别

while循环也有条件判断,当条件成立的时候,会循环执行。当条件不成立退出 if判断当条件成立时,会执行一次,然后退出。当条件不成立时直接退出

十一、sed

1、概述

sed 是文本处理工具,读取文本内容,根据指定条件进行处理,可实现 增删改查的功能。sed 依赖于正则表达式。

2、格式

sed '过滤+动作' 文件路径

3、选项

-e 指定要执行的命令 (操作) ,只有一个编辑命令 (操作) 时可省略

-n 只输出处理后的行,读入时不显示,不对原文件进行修改

-i 直接修改源文件,不输出结果

十二、编辑命令格式

1、格式

'/地址 1,地址 2/操作(参数)'

地址 可为行数、正则表达式、$,没有地址代表全文

2、操作

p 打印(输出)

d 删除(整行)

s 替换(字符串匹配)

c 替换(整行)

r 读取指定文件(追加到行后)

a (append)追加到指定内容到行后

i (insert)追加指定内容到行前

w 另存为

n 表示读入下一行内容

H 复制到剪贴板

g 将剪贴板中的内容覆盖到指定行

G 将剪贴板中的内容追加到指定行后

3、示例 

1. 配置一个自动设置静态ip以及关闭selinux服务 关闭防火墙服务 关闭NetWOrkManager,修改
主机名称的脚本,ip和主机名称使用read输入

#!/bin/bash
#备份
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak

#修改dhcp为none
sed -i '/dhcp/s/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33
read -p "请输入指定的ip地址" ip
#在文档最后添加5行
#IPADDR
sed -i '$aIPADDR='"$ip"'' /etc/sysconfig/network-scripts/ifcfg-ens33
#NETMAST
sed -i '$aNETMASK=255.255.255.0' /etc/sysconfig/network-scripts/ifcfg-ens33
#GATEWAY
sed -i '$aGATEWAY=192.168.8.2' /etc/sysconfig/network-scripts/ifcfg-ens33
#DNS1
sed -i '$aDNS1=8.8.8.8' /etc/sysconfig/network-scripts/ifcfg-ens33
#DNS2
sed -i '$aDNS2=114.114.114.114' /etc/sysconfig/network-scripts/ifcfg-ens33
#修改uuid
sed -i '/UUID/cUUID='"$(uuidgen)"'' /etc/sysconfig/network-scripts/ifcfg-ens33

#修改主机名称
read -p "请输入主机名称" hn
hostnamectl set-hostname $hn

#停用selinux
setenforce 0
sed -i '/SELINUX=enforcing/cSELINUX=disabled' /etc/selinux/config
#停用防火墙
systemctl stop firewalld
systemctl disable firewalld

#停用NetworkManager
systemctl stop NetworkManager
systemctl disable NetworkManager

#重启网络服务
systemctl restart network

;