0%

Shell的基本概述

shell的基本概述

Shell基本概述

Shell是一个命令解释器,它的作用是解释和执行用户输入的命令及程序等,用户输入一条命令,Shell就解释执行一条。

什么是Shell ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@web01 ~]# echo   $-
himBH

h hashall 缓存,命令的路径
i 交互式shell
m 监控
B 大括号扩展
H history

[root@web01 ~]# vim test.sh
#!/bin/bash
echo $-
[root@web01 ~]# sh test.sh
hB



[root@web01 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

shell的种类
[root@web01 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
[root@web01 ~]# echo $SHELL
/bin/bash

什么是Shell脚本 ?

1
2
3
4
5
6
7
8
9
10
11
01)系统的命令堆积在一起,按照顺序执行。

02)特定的格式 + 特定的语法 + 系统的命令 = 文件

03)以.sh为结尾的文件

为什么要学习shell

重复性的工作
自动化的脚本
提高工作效率

Shell脚本能做什么 ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
01)基础配置:系统初始化操作、系统更新、内核调整、网络、时区、SSH优化等。

02)安装程序:LNMP、LAMP、MySQL、Nginx、Redis等。

03)配置变更:Nginx Conf、PHP Conf、MySQL Conf、Redis Conf等。

04)业务部署:Shell配合Git、Jenkins实现自动化部署PHP、Java代码,以及代码回滚。

05)日常备份:MySQL全备 + 增量 + binlog + crond + Shell脚本备份等。

06)信息采集:Zabbix + Shell: 对硬件、系统、服务、网络的监控等。

07)日志分析:ELK:取值->排序->去重->统计->分析等。

08)服务扩容/缩容:Zabbix + Shell
扩容: 监控服务器cpu, 如cpu负载持续80% + 触发动作(脚本)
脚本: 调用api开通云主机->初始化环境->加入集群->对外提供访问
缩容: 监控服务器cpu使用率20%->判断有多少web节点->判断是否超过预设->缩减到对应的预设状态->变更负载的配置

shell脚本书写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


01) 创建存放脚本的文件夹

02)推荐使用vim编辑器编辑脚本(高亮显示)

03)以.sh为扩展名

04)规范的Shell脚本第一行会指出由哪个程序(解释器)来执行脚本中的内容。
#!/bin/bash 或 #!/bin/sh #如不指定Shell,默认以bash执行。

05)开头的"#!"称为幻数,在执行Shell脚本的时候,内核会根据"#!"后的解释器来确定使用哪个程序解释脚本中的内容。注意:这一行必须在每个脚本顶端的第一行,如果不是第一行则为脚本注释行。

06)附带作者及版权信息。

07)脚本注释:在Shell脚本中,跟在"#"后面的内容表示注释。注释部分不会被执行,仅给人看。注释可以自成一行,也可以跟在命令后面,与命令同行。要养成写注释的习惯,方便自己与他人。最好不用中文注释,因为在不同字符集的系统会出现乱码。

08)成对的符号一次书写完成。

09)循环的格式一次书写完成。

登录shell

是需要用户名、密码登录后才能进入的Shell。

非登录shell

当然就不需要输入用户名和密码即可打开的Shell,例如:直接命令”bash”就是打开一个新的非登录Shell,在Gnome或KDE中打开一个”终端”(terminal)窗口程序也是一个非登录Shell。

单双引号和不加引号及反引号的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@web01 shell]# echo  $name
web01
[root@web01 shell]# echo my name is web01 moneny is $10000000000
my name is web01 moneny is 0000000000
[root@web01 shell]# echo my name is $name moneny is $10000000000
my name is web01 moneny is 0000000000
[root@web01 shell]# echo 'my name is $name moneny is $10000000000'
my name is $name moneny is $10000000000
[root@web01 shell]# echo "my name is $name moneny is $10000000000"
my name is web01 moneny is 0000000000
[root@web01 shell]# echo "my name is $name moneny is \$10000000000"
my name is web01 moneny is $10000000000
[root@web01 shell]# echo my name is $name moneny is \$10000000000
my name is web01 moneny is $10000000000
[root@web01 shell]# echo 'my name is $name moneny is \$10000000000'
my name is $name moneny is \$10000000000

单引号 所见即所得,会把引号中的内容看做是一个整体。
双引号 所见即所得,会把引号中的内容看做是一个整体。会解析变量。
不加引号 所见即所得,如果出现空格,并不会把他看做是一个整体,会解析变量。
反引号 先执行里面的命令,把结果交出来 和$()同义。

echo特性

1
2
3
4
5
6
7
8
9
10
#echo命令输出颜色。

echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"

使用read命令写一个脚本修改主机名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
1.使用read提示用户输入新的主机名 
2.是否确认修改主机名为新的主机名 提示用户输入 Y N
3.根据用户输入的Y或N进行判读
4.如果是Y,则修改。否则退出

[root@web01 shell]# vim read-4.sh
#!/bin/bash
#1.提示用户要修改之后的新的主机名
read -p "请输入你要修改之后的主机名:" New
#2.友好提示,是否确认修改
read -p "请确认是否修改主机名为 $New ,请输入[Y|N]:" con
#3.根据用户输入的Y或N进行判断,如果是Y,则修改,否则就不修改退出。
if [ $con == "Y" ];then
hostnamectl set-hostname $New && echo "hostname更新成功!"
bash
else
echo "你选择的是不修改,脚本退出!"
exit
fi

使用read写一个修改ip地址的脚本

[root@shell shell]# cat read-5.sh
#!/bin/bash
#1.请用户输入修改之后的ip地址的主机位
read -p "请输入你要修改之后的IP地址的主机位:" Ip
#2.友好提示,是否确认修改
read -p "你修改之后的ip地址主机位为:$Ip ,是否确认修改[Y|N]:" con
#3.判断用户输入的是Y还是N,如果是Y,则修改,否则退出。
if [ $con == "Y" ];then
#5.修改ip地址
sed -ri "s#(^IPA.*\.).*#\1$Ip#g" /etc/sysconfig/network-scripts/ifcfg-eth[01] && echo "IP地址修改成功"
#6.友好提示,主机名修改成功,是否确认重启网络服务进行生效。
read -p "是否确认重启网卡进行生效。请确认[Y|N]:" red
#根据用户输入的值进行判断,是否重启网卡
if [ $red == "Y" ];then
echo "网卡重启之后,该连接会断开,成功之后请使用新的ip地址进行连接。"
systemctl restart network
else
echo "你没有选择进行重启网卡服务,你可以手动重启,再见!"
exit
fi
else
echo "你选择不修改IP地址,再见!"
exit
fi

shell变量替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
变量							说明
${#变量} 获取变量值的长度
${变量#匹配规则} 从头开始匹配,最短删除
${变量##匹配规则} 从头开始匹配,最长删除
${变量%匹配规则} 从尾开始匹配,最短删除
${变量%%匹配规则} 从尾开始匹配,最长删除
${变量/旧字符串/新字符串} 替换变量内的旧字符串为新字符串,只替换第一个
${变量//旧字符串/新字符串} 替换变量内的旧字符串为新字符串,全部替换
${变量:匹配规则:匹配规则} 索引及切片

[root@shell shell]# url=www.oldboyedu.com.cn
[root@shell shell]# echo ${#url}
20

[root@shell shell]# echo ${url#*.}
oldboyedu.com.cn
[root@shell shell]# echo ${url##*.}
cn

[root@shell shell]# echo ${url%.*}
www.oldboyedu.com
[root@shell shell]# echo ${url%%.*}
www

[root@shell shell]# echo ${url/o/O}
www.Oldboyedu.com.cn
[root@shell shell]# echo ${url//o/O}
www.OldbOyedu.cOm.cn

[root@shell shell]# echo ${url:5:5}
ldboy
[root@shell shell]# echo ${url:0:3}
www
[root@shell shell]# echo ${url:3}
.oldboyedu.com.cn