一、shell的概述

1.1 什么是编程?

编程是编定程序的中文简称,就是让计算机代码解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。

1.2 编程语言的分类

  • 机器语言(二进制代码)

    缺点:可读性、可移植性差,编程繁杂
    优点:直接执行,速度快,资源占用少
    
  • 汇编语言面向机器的程序设计语言)

  • 高级语言:按转换方式可分为两类:1.编译型语言; 2.解释型语言

1.2.1 高级语言

image20230904151721816.png

1、编译型语言: 由编译器将代码编译成机器码,C,test.c,编译完成后可以直接在CPU中运行,一次编译后,后续不在进行编译,运行的效率高。

2、解释型语言: 这样解释性语言每执行一次就需要逐行翻译一次,效率比较低。

image20230904151210236.png

任何语言都必须翻译成机器语言,计算机才能运行高级语言编写的程序。 翻译的方式有两种:一个是编译,一个是解释

1.3 什么是shell?

shell是一个命令行的解释器,是一个人机交互的桥梁 shell将用户的指令翻译成机器能识别的二进制,内核识别二进制并完成某些功能,将指令的结果输出打印在屏幕上

shell和用户的关系:
	用户将执行的指令交给shell,由shell将指令进行翻译
   
shell和本地终端的关系
	shell就是我们本地终端中的一个程序

1.4 shell和内核的位置关系

image20210905202604802.png

1.5 Shell分类和对比

shell类型易学性可移植性编辑性快捷性
Bourne Shell(sh)容易较差较差
Korn Shell较难较好较好
Bourne Again(Bash)较好
POSIX shell(psh)较难较好
C Shell较难较好较好
TC shell

image20211230204939901.png

Bourne Shell:从1979年起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh。

C Shell:C Shell主要在BSD版的Unix系统中使用,其语法和C语法相类似而得名。

Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Borune家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh。

不同的shell语言的语法不同,一般是不能交换使用的,最常用的shell是bash,也就是Bourne Shell,Bourne Shell,bash由于易用和免费,在工作中被广泛的应用,也是大多数Linux操作系统默认的shell

1.6 查看当前系统的默认shell

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

1.7 查看系统支持的shell类型

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

[root@localhost ~]# chsh -s /bin/sh   #切换shell,切换完了重新登录终端。
Changing shell for root.
Shell changed.

二、编写shell脚本

2.1 shell脚本的功能

1、自动化批量系统初始化程序(系统更新,软件更新,时区设置)

2、 自动化部署软件(LNMP,LAMP等)

3、 自动化系统监控指标采集工具(CPU,memory,Disk等)

4、 自动数据库备份工具
  • 一句话总结:将重复性、复杂化的工作通过编写脚本来一键式完成,如果遇到相同场景,一键执行脚本即可完成大量工作,减轻了工作的复杂度,提升效率。

2.2 shell脚本的执行方式

shel脚本编程需要注意以下几个事项:

1、shel脚本名称命名一般为英文的大写、小写;
2、不能使用特殊符号、空格来命名(!@#$);
3、shell脚本后缀以.sh结尾;
4、不建议shell命名为纯数字, 一般以脚本功能命名
5、shell脚本内容首行需以#!/bin/bash开头(shebang)
6、shell脚本中变量名称尽量使用大写字母, 字母间不能使用“-”, 可以使用“_”;
7、shell脚本变量名称不能以数字、特殊符号开头。

2.3 第一个shell脚本

在执行之前,我们先写一个简单的shell脚本

#!/bin/bash
# This is my First shell
# By author teacher wu
echo "Hello world"                      

first_shell.sh脚本内容详解如下:

1. #!/bin/bash:固定格式, 定义该脚本所使用的shell类型。
2. #This is my First shell:#号表示注释, 没有任何的意义, shell不会解析它。
3. #By author teacher wu:表示脚本创建人, #号表示注解。
4. echo“HelloWorld!” : shell脚本主命令, 执行该脚本呈现的内容,
5. shel脚本编写完毕, 如果运行该脚本, 运行用户需要有执行权限, 可以使用chmod o+x  first_shell.sh赋予可执行权限。然后./first_she ll.sh执行即可

2.4 脚本的执行方式

# 方式一:sh <脚本名称> <参数>
例:sh script.sh

# 方式二:bash <脚本名称> <参数>
例:bash script.sh

# 方式三:. <路径>/<脚本名称>
例:. script.sh

# 方式四:<绝对路径>/<脚本名称> <参数>
例:chmod a+x script.sh | /home/test/script.sh

# 方式五:soure <路径>/<脚本名称>
例:source script.sh


# 方式六:远程执行脚本
例:curl -s 10.0.0.9/script.sh | bash

# 方式七:标准执行
例:chmod a+x script.sh
    ./script.sh
#!/bin/bash
swap=$(free -h |grep -i swap)
  echo Swap:
  echo -e "\e[31m $swap\e[0m"
echo "---"
mem=$(free -h|grep -i mem)
  echo Mem:
  echo -e "\e[32m $mem\e[0m"
echo "---"
disk=$(df -h)
  echo Disk:
  echo -e "\e[33m$disk\e[0m"
echo $$

2.5 脚本调试

脚本调试可以发现一些隐藏的脚本语法或者逻辑问题,可以快速的帮我们定位和发现问题,提高效率

2.5.1 检查语法问题
bash [options]

选项:
	-n:不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示。

	-v:在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本,如果有错误,也会给错误提示。

	-x:将执行的脚本内容及输出显示到屏幕上。

总结:脚本中常见的错误有三种:

  1)逻辑问题:可以使用bash -x  进行调试查看  
  2)语法问题:可以使用bash -n进行调试,但是后续命令不在执行
  3) 脚本内部命令错误:后续命令还会执行,用bash -n无法检测,只能使用bash-x进行检测
  • set 脚本自检
1、set -u 
	如果脚本中未定义的变量被引用,则报错
		#!/bin/bash
		set -u
		echo $A
2、set -e
	如果脚本中的命令存在问题,则停止运行

2.6 脚本的注释

2.6.1 单行注释
# 这是一个单行注释
2.6.2 多行注释
: <<EOF
这是一个多行注释。
这里可以写多行注释的内容。
EOF
自动生成脚本注释
[root@myx01~]$ cat ~/.vimrc 
set ts=4
set expandtab
set ignorecase
set autoindent
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
    if expand("%:e") == 'sh'
    call setline(1,"#!/bin/bash")
    call setline(2,"#Description:     The test script")
    call setline(3,"#QQ:             2041598918")
    call setline(4,"#Author:          mengyuanxi")
    call setline(5,"#email:          2041598918@qq.com ")
    call setline(6,"#FileName:        ".expand("%"))
    call setline(7,"#Date:            ".strftime("%Y-%m-%d"))
    call setline(8,"#=======================================================")
      endif
   endfunc
 autocmd BufNewFile * normal G

三、Bash基本功能

3.1 echo命令
语法:echo [选项] [输出内容]

选项:

   -n:   取消输出后末行的换行符号

   -e:   支持反斜线控制的字符转换

	\a   警示字符

	\b   退格

	\c   忽略输出中最后的换行符号。这个参数之后的任何字符,包括后面的参数都会被忽略掉。

	\f   自动换行,新行接上一行尾部

	\n   换行

	\r   回车

	\t   水平制表符号

	\v   垂直制表符号

制表符echo -e "\ta\tb\te" 输出警告提示音echo -e "hello shell\a" 取消警告提示音

[root@localhost ~]# head -n 5 /etc/inputrc 
# do not bell on tab-completion
set bell-style none  ---注释去掉,并reboot系统

set meta-flag on
set input-meta on

自动换行

[root@localhost ~]# echo -e "aaa\fbbb"
aaa
   bbb    ##自动换行,新行接上一行尾部

给输出的结果添加颜色标记

更换字体颜色
echo -e "\e[31m hello \e[0m"
...
echo -e "\e[37m hello \e[0m"

image.png

更换字体类型
echo -e "\e[1;31m hello \e[0m"
...
echo -e "\e[7;31m hello \e[0m"

image.png

更换背景颜色
echo -e "\e[1;41m hello \e[0m"
...
echo -e "\e[1;47m hello \e[0m"

image

颜色对照表

image20210905211158461.png

3.2 历史命令

① 查看历史命令
语法:history [选项] [历史命令的保存文件]

 选项
        -c:清理历史命令

        -w:保存缓存中的历史命令,如果不手工指定,默认放到:~/.bash_history中
# /etc/profile

export HISTSIZE=1000         # 设置内存中的history命令的个数
export HISTFILESIZE=1000     # 设置文件中的history命令的个数
② 历史命令的调用
1、使用上、下方向键可以调用出历史的执行记录,逐条查看

2、使用“!n”可以执行第n条命令

3、使用“!!”可以重复执行上一条命令

4、使用“!字符串”可以执行最后一条以该字符串开头的命令

5、使用“!$” 重复执行上一条命令的最后一个参数

6、CTRL-R:搜索最近使用的以该字符串开始的命令

3.3 命令和文件的补全

​ 可以帮助我们通过tab键来补全命令和文件【快速按两次tab键】

3.4 别名

别名的配置文件在:~/.bashrc

image20211230213937513.png

命令执行优先级
1、第一顺位执行使用绝对路径或者相对路径执行命令

2、第二顺位执行别名

3、第三顺位执行bash的内部命令

4、第四顺位执行按照$PATH环境变量定义的目录查找到的第一个命令
  • 设置别名:格式:alias 别名='[要执行的命令]'
  • 删除别名:格式:unalias 别名

3.5 bash常用快捷键

快捷键说明
CTRL-A将光标移到行首(在命令行下)
CTRL-B退格 (非破坏性的),这个只是将光标位置往回移动一个位置
CTRL-C中断,终结一个前台作业
CTRL-D“EOF” (文件结尾:end of file)。它用于表示标准输入(stdin)的结束。在控制台或xterm 窗口输入文本时,CTRL-D 删除在光标下的字符。从一个shell中退出 (类似于exit)。如果没有字符存在,CTRL-D 则会登出该会话。在一个xterm窗口中,则会产生关闭此窗口的效果。
CTRL-E将光标移动到行尾(在命令行下)
CTRL-F将光标向前移动一个字符(在命令行下)
CTRL-U擦除从光标位置开始到行首的所有字符内容。在某些设置下,CTRL-U会不以光标位置为参考而删除整行的输入
CTRL-Y将之前已经清除的文本粘贴回来(主要针对CTRL-U或CTRL-W)
CTRL-R回溯搜索(Backwards search)history缓冲区内的文本(在命令行下)。注意:按下之后,提示符会变成(reverse-i-search)”:输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令
CTRL-Z暂停一个前台的作业;在某些文本处理程序中也作为替换操作;在MSDOS文件系统中作为EOF(End-of-file)字符。

3.6 多条命令执行与管道符

3.6.1 连续多个命令的执行方式
多命令执行符格式作用
;(分号)命令1 ; 命令2多个命令顺序执行,命令之间没有任何的逻辑关系
&&命令1 && 命令2逻辑与,当命令1正确执行后,命令2才会执行,当命令1执行不正确,命令2不执行
||命令1 || 命令2逻辑或,当命令1执行不正确时,则命令2才会执行,当命令1执行正确,则命令2不会执行
3.6.2 管道符
命令格式:命令1 | 命令2

将前一个命令的输出作为后一个命令的输入

3.7 输入和输出重定向

3.7.1 标准输入输出

默认Linux中给程序提供的三种IO设备

设备设备文件文件描述符类型
键盘/dev/stdin0标准输入
显示器/dev/stdout1标准输出
显示器/dev/stderr2标准错误输出
3.7.2 输出重定向
类型符号作用
标准输出重定向命令>文件以覆盖的方式,把命令正确输出到指定的文件或者设备中
标准输出重定向命令>>文件以追加的方式,把命令的正确输出到指定的文件或者设备中
标准错误输出重定向错误命令2>文件以覆盖的方式,把命令的错误输出到指定的文件或者设备中
标准错误输出重定向错误命令2>>文件以追加的方式,把命令的错误输出到指定的文件或者设备中
正确输出和错误输出同时保存命令>文件 2 >&1以覆盖的方式,把正确输出和错误输出都保存到同一个文件中
正确输出和错误输出同时保存命令>>文件 2 >&1以追加的方式,把正确输出和错误输出都保存到同一个文件中
正确输出和错误输出同时保存命令 &>文件以覆盖的方式,把正确输出和错误输出都保存到同一个文件中
正确输出和错误输出同时保存命令 & >>文件以追加的方式,把正确输出和错误输出都保存到同一个文件中
正确输出和错误输出同时保存命令>>文件1 2 >>文件2把正确的输出追加到文件1中,把错误的输出追加到文件2中。
3.7.3 输入重定向
格式:命令 [选项] < [文件名]
3.7.4 常用的配置文件
.bash_logout:终端退出之前,做什么操作
.bashrc:保存用户的别名信息
.bash_history:用户的历史命令
.bash_profile:普通用户系统环境变量

man bash:用于查找内部命令