Linux Shell编程基础
1:Shell的定义
Shell是一种特殊的程序,它是用户与UNIX/Linux系统内核之间的接口。
它介于操作系统内核与用户之间,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行。
内核在系统启动时载入内存,管理系统直至关机。内核负责创建和控制进程,管理内存、文件系统和通信等。内核以外的所有其他程序都保存在磁盘上
Shell在用户登录后启动,它解释并运行由命令行或脚本文件输入的命令,从而实现用户与内核之间的交互
2:交互式Shell
当用户登录系统后,系统会启动一个交互式的shell来提示用户输入命令,用户输入命令后,
shell开始执行任务:先解析命令行,然后查找命令,找到后开始执行
例如:
在Linux Terminal中直接输入Linux命令,如果需要在一行中输入多个命令,那么这些命令之间需要用分号分隔,如下所示:
3:Shell 脚本
Shell脚本,跟批处理文件很相似,都是把一组Linux命令输入到文件中,然后执行该文件,
更复杂的脚本还包括用于实现判断、循环、文件测试等功能的程序结构。
使用vim创建一个文件,文件名为test.sh
vim test.sh
test.sh脚本内容如下:
![](https://img2022.cnblogs.com/blog/2070357/202204/2070357-20220429191508105-31070156.png)
给test.sh赋予执行权限并执行该shell脚本:chmod u+x test.sh
./test.sh:执行shell脚本
4:Shell的类型
UNIX系统支持的主流shell包括:
Bourne shell 、C shell 和 korn shell Bourne shell 是标准的UNIX shell,由AT&T 开发,以简练、紧凑和快速著称; C shell由美国加州大学Berkeley分校开发;在bourne shell基础上增加了新功能;
Korn shell 是AT&T开发,它是Bourne shell的一个扩展集,拥有比C shell更多的功能;
Linux上默认的shell是GNU bash,是一种增强的Bourne shell。 要知道所使用的Linux系统上面有哪些类型的shell,可以查看/etc/shells文件 如下图:
![](https://img2022.cnblogs.com/blog/2070357/202204/2070357-20220429192233625-1384308563.png)
要知道所使用的Linux系统当前使用的是哪一种shell,可以运行下列命令: echo $SHELL 如下图:
5:Bash历史命令功能
命令历史是Bash中用于提高命令输入效率的一项功能,能够让用户快速地重复执行已经输入过的命令
使用历史命令:
用户执行完命令以后,按“↑”键时,会在当前命令行自动出现上一条执行的命令内容,配合“↓”键可以反复在历史命令记录中查询。
在命令行中输入“!”,再输入已经执行过的命令的开头几个字母,回车后可以执行最近一次以这几个字母开头的命令。
查看历史命令列表 :history history命令可以显示当前用户的历史命令列表(默认保存在“~/.bash_history”中)
在命令行中输入“!”后再输入从history命令显示结果中获得的命令序号,也可以再次执行指定命令序号的命令
如上图: !5 相当于执行ll
设置记录历史命令的条数:
Bash环境中默认情况下可以为用户保存最多1000条历史命令,若需要调整所有用户的历史命令条数的限制,
可以通过更改 “/etc/profile” 文件中的 “HISTSIZE=1000” 实现配置。用户重新登录后设置生效。
若只需要调整特定用户的历史命令条数,则可以修改该用户主目录中的“.bash_profile”文件,
添加“export HISTSIZE=100”形式的配置记录,该记录会覆盖“/etc/profile”文件中的设置。需要用户重新登录后生效。
清除命令历史:
history –c
6:命令别名功能 alias
命令别名功能可以将频繁使用的复杂命令定义为简短的别名,当用户需要执行该复杂命令时,只需要使用别名即可完成对应的操作。
查看已设置的别名:
alias
![](https://img2022.cnblogs.com/blog/2070357/202204/2070357-20220429235649576-734596428.png)
设置命令别名:
alias 别名='实际命令'
取消已设置的别名:
unalias 别名
取消所有已设置的别名:
unalias –a
7:标准输入输出
标准输入(STDIN): 默认的设备是键盘,设备文件位于/dev/stdin,文件编号为0,命令从标准输入文件中读取在执行过程中需要的输入数据 标准输出(STDOUT): 默认的设备是显示器,设备文件位于/dev/stdout,文件编号为1,命令将执行后的输出结果发送到标准输出文件 标准错误(STRERR): 默认的设备是显示器,设备文件位于/dev/stderr,文件编号为2,命令将执行时的错误信息发送到标准错误文件
8:重定向 >:清空重定向 >>:追加重定向
在实际Linux操作过程中,也可以变更输入输出内容的方向,而不使用默认的标准输入输出设备,这种操作称为重定向
标准输出重定向: > >> 将命令的输出结果定向(保存)到指定的文件中。输出重定向使用 “>” 或 “>>” 操作符
“>”:重定向符后面指定的文件如果不存在,则会新建该文件,并将命令执行结果保存到该文件中;若该文件已经存在,则将清空文件内容并保存命令的执行结果到文件中
“>>”:重定向符可以将命令执行的结果追加到指定文件的末尾进行保存,而并不覆盖文件中的所有内容
标准输入重定向: <
将使一些交互式的操作过程可以通过读取文件来完成。标准输入重定向使用“<”操作符
read相当于定义一个变量name
![](https://img2022.cnblogs.com/blog/2070357/202204/2070357-20220430001321694-101690464.png)
标准错误重定向: 2> 2>>
将执行命令的过程中出现的错误信息重定向(保存)到指定的文件中。标准错误重定向需要使用“2>” 和 “2>>” 操作符
使用 “2>” 操作符时,会像 “>” 一样覆盖指定文件中的内容,若需要追加到新的内容到同一个文件中,需要使用 “2>>” 重定向操作符
“&>”操作符可以将 标准输出 和 错误输出 的内容,同时重定向的同一个文件中
9:管道 |
在Bash环境中,管道操作为不同命令之间的协同工作提供了一种机制。位于管道符 “|” 左侧的命令输出的结果,会作为右侧命令的输入
例1:统计/etc/passwd文件有多少行 cat /etc/passwd|wc -l
例2:在/etc/passwd文件中找出包含root的行 cat /etc/passwd|grep root|wc -l
grep root /etc/passwd 本来这样使用的
10:编写shell脚本
使用vi等文本编辑工具,创建脚本文件,文件名可以使用扩展名(.sh),也可以不使用扩展名。脚本中需要包含如下内容:
运行环境设置:
通常位于文件的第一行,用于指定使用哪一个Shell程序进行解释。如由Bash进行解释的Shell脚本中第一行为:“#!/bin/bash”
注释行: #
在脚本文件中,除了以 “#!” 开头的Shell环境设置行以外,其他以 “#” 开头的内容将被视为注释信息,执行脚本时将予以忽略
可执行语句:
Shell脚本程序中最重要的组成部分,在命令行操作界面中可以执行的命令都可以写入到脚本中,程序运行时默认情况按照顺序依次执行。
为脚本文件添加可执行权限:
新创建的脚本文件通常不具有可执行属性,因此需要使用 chmod 命令为文件添加“x”权限。
例一:
11:执行shell脚本
直接执行带“x”权限的脚本文件: ./文件名
在Shell命令行中可以直接通过脚本文件的路径执行脚本程序。执行当前目录下的脚本文件,需要在文件名前加入“./”路径。
./test.sh
用Shell解释器程序执行脚本: bash 文件名
由解释器程序负责读取脚本文件中的内容并执行,因此并不需要脚本文件具有“x”权限
bash test.sh 1 2 3
使用“.”或source命令执行环境变量文件,重新导入环境变量
source /etc/profile
12:Shell启动
如果登录shell是bash shell,在显示提示符之前,会先运行一组进程
如下图:
系统启动后运行的第一个进程是init,init创建getty进程,
getty进程负责打开终端端口,提供标准输入、标准输出与标准错误输出,并且在屏幕上显示一个登陆提示符
接着执行的是/bin/login程序,login程序依次执行下面工作:
提示用户输入用户名,密码;
设置初始环境、启动用户的登陆shell(登陆shell是paswd文件的最后一项,即/bin/bash
Bash进程首先查找系统文件/etc/profile,并且执行其中的命令;
然后在用户的主目录中查找文件.bash_profile;
执行完.bash_profile中的命令后,bash shell接着执行用户的.bashrc文件,最后默认的提示符$将出现在屏幕上面,等待用户输入命令