什么是shell?

为什么要使用shell?

shell的作用是:

  • 解释执行用户输入的命令或程序等
  • 用户输入一条命令,shell就解释一条
  • 键盘输入命令,Linux给与响应的方式,称之为交互式式

image-20230904203742280

shell是一块包裹这系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入,解释给操作系统,然后处理操作系统的输出结果,输出到屏幕给与用户看到结果

从我们登入Linux,输入账号密码到进去Linux交互式界面,所有的操作都是交给shell解释并执行

1.交互式shell
交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户
进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终
止了。
2.非交互式shell
shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放
在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了

为什么要使用shell?

1.安装操作系统(CentOS)自动化安装操作系统(kickstart cobbler)

*2.***初始化/优化操作系统**

1)ntp时间同步
2)更改默认yum源
3)ssh优化
4)关闭Selinux
5)关闭/开启 防火墙(C6:iptables C7:firewalld)
6)安装基础服务(wget vim lrzsz net-tools unzip gzip...)
7)优化文件描述符
8)优化字符集
9)...

3.安装服务

1)Nginx
2)PHP
3)MySQL
4)Redis
5)MHA
6)Rsync
7)NFS
8)MongoDB
9)Zabbix

...

4.启动服务(系统默认的shell脚本)
5.脚本实现自动化代码上线
*6.监控服务(使用shell)
7.结合定时任务使用shell
8.重复性工作写入脚本**

1)日志切割
2)日志分析
3)数据统计
4)机器巡检
5)数据备份

...

shell编程需要掌握的知识

1.熟练掌握vim
2.熟悉ssh终端
3.熟练掌握linux的常用命令
4.linux三剑客和正则表达式

如何学好shell

1.环境变量
2.条件表达式
3.流程控制语句
4.循环
5.数组
6.函数
学习shell三部曲:
先读懂shell
再修改shell
自己写shell

shell的脚本规范

1.目录统一
2.shell脚本的结尾要以.sh结尾
3.脚本开头要有解释器

!/bin/bash

4.脚本中需要有作者信息
5.一定要有注释

修改vim编写shell脚本的模板

# 1.首先先编辑一个模板文件,该模板文件可以叫任何名字
[root@zabbix01 ~]# vim /usr/share/vim/vimfiles/template.jiujiu
#!/bin/bash
#Author: jiujiu
#Date: 
#Name: 
# 2.写完之后,我们需要修改一下vim的配置文件
[root@zabbix01 ~]# vim /etc/vimrc
autocmd BufNewFile *.spec 0r /usr/share/vim/vimfiles/template.spec
## 在第28行,autocmd自动保存模板文件,修改一下,因为我们是要写shell脚本的模板
## 所以我们要把*.spec 修改成*.sh
## 然后将后面的模板文件改成你定义的模板文件名
autocmd BufNewFile *.sh 0r /usr/share/vim/vimfiles/template.jiujiu
# 3.接下来,我们编辑所有只要以sh结尾的文件,都会带有作者信息
[root@zabbix01 ~]# vim txt.sh
#!/bin/bash
#Author: jiujiu
#Date:
#Name:
----------------------------------------------------------------------------------------------------
#vimscript,专门的vim脚本语法。我们可以完全自定义,上面那个模板不识别变量,你写啥就是啥。接下来我们自己写一个,因为我要获取日期,上面的模板还得我们手动添加。
[root@xbs ~]# vim ~/.vimrc
autocmd bufNewFile *.py,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
  if expand("%:e") == 'sh'
      call setline(1, "#!/bin/bash")
      call setline(2, "# File Name: ".expand("%"))
      call setline(3, "# Version: v1.1 ")
      call setline(4, "# Author: jiujiu")
      call setline(5, "# Mail: @qq.com ")
      call setline(5, "# Domain: yys ")
      call setline(6, "# Date Time: ".expand(strftime("%Y-%m-%d %H:%M")))
  endif
endfunc

autocmd bufNewFile *.py,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
  if expand("%:e") == 'sh'
      call setline(1, "#!/bin/bash")
      call setline(2, "")
      call setline(3, "# File Name: __".expand("%") . "__")
      call setline(4, "# Version: __v1.1__ ")
      call setline(5, "# Author: __jiujiu__ ")
      call setline(6, "# Mail: __@qq.com__ ")
      call setline(7, "# Blog: __jiujiu__ ")
      call setline(8, "# DateTime: __".expand(strftime("%Y-%m-%d %H:%M")) . "__")
  endif
endfunc
[root@xbs ~]# vim 2.sh
#!/bin/bash
# File Name: 2.sh
# Version: v1.1 
# Author: jiujiu
# Domain: yys 
# Date Time: 2023-06-25 14:28
~                             

脚本执行的方式

# 执行脚本
[root@m01 ~]# sh 1.sh     //会产生子shell进程
Hello World
[root@m01 ~]# bash 1.sh    //会产生子shell进程
Hello World
[root@m01 ~]# source 1.sh
Hello World
# 需要执行权限的脚本的方式
[root@m01 ~]# ./1.sh
Hello World
[root@m01 ~]# /root/1.sh
Hello World
[root@m01 ~]# . 1.sh
Hello World
#注: . 和 source 都是在父shell下执行的
sh , bash , 相对路径 , 绝对路径 都是在子shell下执行的

开发语言中程序代码的分类

#编译型语言和解释型语言是两种不同的代码执行方式,它们的主要区别在于代码的执行过程。
1. 编译型语言:
- 编译过程:编译型语言的代码在运行之前需要先经过编译器的编译过程,将源代码一次性地翻译成机器语言的可执行文件(或字节码)。
- 执行过程:在运行时,计算机直接执行编译后生成的可执行文件,不需要再重新翻译源代码。这意味着编译型语言的程序在每次运行时都不需要再重新翻译,因此执行速度较快。
- 例子:C、C++、Go等
2. 解释型语言:
- 解释过程:解释型语言的代码在运行之前不需要经过编译过程,而是逐行地由解释器(或虚拟机)在运行时边解释边执行。
- 执行过程:在运行时,解释器会逐行地读取源代码并将其转换为机器语言或虚拟机指令,然后立即执行。这意味着每次运行都需要重新解释源代码,因此执行速度相对较慢。
- 例子:Python、JavaScript、Ruby等
#根据上述区别,编译型语言的优势在于执行速度较快,但需要先进行编译生成可执行文件。而解释型语言的优势在于开发速度较快,代码可以直接执行,无需编译。不过,随着技术的发展,一些语言也采用混合型的方式,将编译和解释结合起来,以平衡执行速度和开发速度的需求
-----------------------------------------------------------------------------------------------------
#编译型
# 编辑代码
[root@m01 ~]# vim hello.c
#include <stdio.h>
void main(){
printf("hello world");
}
#编译成二进制文件
[root@m01 ~]# gcc hello.c -o hello.bin
[root@m01 ~]# ll
总用量 16
-rwxr-xr-x 1 root root 8440 8月 26 09:40 hello.bin
-rw-r--r-- 1 root root 60 8月 26 09:39 hello.c
[root@m01 ~]# file hello.bin
hello.bin: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=c248ed9f695c05ece7d46731556e86eb0ac6bc11, not stripped
[root@m01 ~]# ./hello.bin
hello world

#解释型
[root@m01 ~]# vim hello.sh
[root@m01 ~]# cat hello.sh
#!/bin/bash
echo 'hello world'
[root@m01 ~]# ll
总用量 20
-rwxr-xr-x 1 root root 8440 8月 26 09:40 hello.bin
-rw-r--r-- 1 root root 60 8月 26 09:39 hello.c
-rw-r--r-- 1 root root 31 8月 26 09:44 hello.sh
[root@m01 ~]# file hello.sh
hello.sh: Bourne-Again shell script, ASCII text executable
[root@m01 ~]# sh hello.sh
hello world