一、Shell概述
1. Shell是什么?
- Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
- Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
课外参考文章: 编译执行和解释执行的区别
2. Shell的分类
Bourne Shell: 是 UNIX 最初使用的 shell,并且在每种 UNIX 上都可以使用, 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。
C Shell: C Shell主要在BSD版的Unix系统中使用,其语法与C语言相类似而得名。
Shell的两种主要语法类型有Bourne Shell和C Shell,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括csh、tash。
-
Bash:Bourne Again shell,它是 Bourne shell 的扩展,简称 Bash,与 Bourne shell 完全向后兼容,并且在Bourne shell 的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多 C shell 和 Korn shell 中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。
-
查看我们当前使用的Shell:
-
查看Bash兼容哪些Shell:vi /etc/shells
-
切换不同的Shell(实际上是每切换一个就新增了一个shell。):
-
退出Shell:
-
二、脚本执行方式
脚本,是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。
1. echo 输出命令
echo [选项] [输出内容]
选项:
-e 支持反斜线控制的字符转换
控制字符表:
| 控制字符| 作用 |
| ------------- |:-------------:| -----:|
| \a | 输出警告音 |
| \b | 退格键,也就是向左删除键 |
| \n | 换行符 |
| \r | 回车键 |
| \t | 制表符,也就是Tab键 |
| \v | 垂直制表符 |
| \0nnn | 按照八进制ASCII码表输出字符。其中0为数字0,nnn是三位八进制数 |
| \xhh | 按照十六进制ASCII码表输出字符。 其中hh是两位十六进制数|
| \e[1;……\e[0m |输出颜色,可选:30m 黑色、31m 红色、32m 绿色、33m 黄色、34m 蓝色、35m 洋红、36m 青色、37m 白色|
下面实验:
1. \a
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/3087800-7d5449a015e3d4aa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2. \b
发现\b放在字符串末尾是无效的
3. \n
4. \r
5. \t
6. \v
7. \0nnn
参考: ASCII码表
8. \xhh
9. \e[1;……\e[0m
2. 第一个脚本
1. vim(vim是vi的增强版,完全兼容vi的所有功能) xxx.sh 创建脚本文件xxx.sh
2. 进入vim编辑器,开头声明:
#!/bin/bash
3. echo -e "内容……"
linux——vi和vim的区别
我的XShell无法输入小盘的数字,有同样问题者,戳这里:xshell无法使用小键盘区输入数字
3. 脚本执行
赋予执行权限,直接运行
chmod 755 xxx.sh
./xxx.sh
通过Bash调用执行脚本(无需赋予权限)
bash xxx.sh
三、Bash基本功能
** 1. 命令别名与快捷键**
别名,正式的或规范的名称以外的名称,一种事物在通常的名称之外还有另外的一种名称,有地方称之为昵称,也有地方称之为小名。
- 查看与设定别名
alias
查看系统中所有命令的别名
其中:
alias cp='cp -i' 中-i是用来提示是否覆盖不同节点的同名文件的。其他几个原命令中带-i也是同理。
alias 别名 = '原命令'
设定命令别名(系统重启后失效)
- 别名永久生效和删除别名
vi 用户的家目录/.bashrc 例如:vi ~/.bashrc
写入环境变量配置文件
那么下边将我之前设置的新的ll别名,写入到我(root用户)的环境变量配置文件。
设置完成后,下次重新登录,这个别名就会永久生效了!!!那么。如果我想让它直接生效呢?
source 用户的家目录/.bashrc
立即使/.bashrc内容生效!
unalias 别名
删除别名(是临时删除,下次系统重启后还会存在。要想彻底删除,需要去.bashrc文件中删除指定的别名,就会永久删除)
-
命令生效顺序
我想有很多小伙伴跟我有一样的疑惑,刚才查看命令别名的时候,有很多别名和原命令是一样的,例如:alias cp='cp -i',都是cp,那么执行顺序是怎样的呢?- 第一顺位执行用绝对路径或相对路径执行的命令
(路径绝对是第一位的) - 第二顺位执行别名
(这就解释了上边的疑惑,同名,会先执行别名) - 第三顺位执行Bash的内部命令
(例如cd,就是使用whereis找不到bin文件的,即代表是内部命令) - 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
(除了内部命令,其他命令我们都需要到$PATH环境变量定义的目录中查找的)
- 第一顺位执行用绝对路径或相对路径执行的命令
-
常用快捷键
- ctrl+c 强制终止当前命令
(例如,ping ip时,数据一直增加,这时就可以使用ctrl+c终止此次ping) - ctrl+l 清屏
- ctrl+a 光标移动到命令行首(输入了很长的命令,使用ctrl+a可以使光标移动到这行命令的第一个字符的位置)
- ctrl+e 光标移动到命令行尾
- ctrl+u 从光标所在位置删除到行首(其实就是删除整行命令)
- ctrl+z 把命令放入后台(例如ping ip时显示数据,懒得看,可以把它放入后台。不过还是要谨慎使用哦)
- ctrl+r 从历史命令中搜索
- ctrl+c 强制终止当前命令
ctrl+r不好用文字描述,截个图看吧:
** 2. 历史命令**
- 历史命令
history [选项] [历史命令保存文件]
选项:
-c 清空历史命令
-w 把缓存中的历史命令同步到历史命令保存文件~/.bash_history(会覆盖之前保存的历史命令,而不是追加)
-
查看历史命令
-
清空历史命令并同步到历史命令保存文件(历史命令,最好不要清空,如果遇到问题,可以帮助排错)
历史命令会默认保存1000条,可以在环境变量配置文件/etc/profile中进行修改。
- 历史命令的调用
- 使用上、下箭头调用以前的历史命令
- 使用“!n”重复执行第n条历史命令
- 使用"!!"重复执行上一条命令
- 使用"!字串"重复执行最后一条以该字串开头的命令
使用“!n”重复执行第5条历史命令:
使用"!!"重复执行上一条命令:
使用"!字串"重复执行最后一条以该字串开头的命令:
- 命令与文件补全
- 在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全。
** 3. 输入输出重定向**
- 标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/sdtout | 1 | 标准输出 |
显示器 | /dev/sdterr | 2 | 标准错误输出 |
- 输出重定向
linux中使用重定向符号可以实现输出输入重定向,默认条件下,标准输出和错误输出都是终端,用重定向符号可以把标准输出和错误内容进行重定向,例如把标准输出重定向到文件。
为什么需要重定向呢?
举个例子。假如一个命令正在运行的时候,没有人在电脑跟前,那么就可以把它的结果重定向到文件中,等有人的时候直接看文件中保存的数据就好了。
类型 | 符号 | 作用 |
---|---|---|
标准输出重定向 | 命令 > 文件 | 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中。 |
同上 | 命令 >> 文件 | 以追加的方式,把命令的正确输出输出到指定的文件或设备当中。 |
标准错误输出重定向 | 错误命令 2>文件 | 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中。 |
同上 | 错误命令 2>>文件 | 以追加的方式,把命令的错误输出输出到指定的文件或设备当中。 |
正确输出和错误输出同时保存 | 命令 >文件 2>&1 | 以覆盖的方式,把正确输出和错误输出都保存到同一文件当中。 |
同上 | 命令 >>文件 2>&1 | 以追加的方式,把正确输出和错误输出都保存到同一文件当中。 |
同上 | 命令 &> 文件 | 以覆盖的方式,把正确输出和错误输出都保存到同一文件当中。 |
同上 | 命令 &>> 文件 | 以追加的方式,把正确输出和错误输出都保存到同一文件当中。 |
同上 | 命令 >> 文件1 2>>文件2 | 把正确输出追加到文件1中,把错误输出追加到文件2中。 |
备注:此处的文件如果不存在那么创建,存在就覆盖或者追加。
标准输出重定向,覆盖——命令 > 文件:
标准输出重定向,追加——命令 >> 文件:
标准错误输出重定向,覆盖——命令 2> 文件:
标准错误输出重定向,追加——命令 2>> 文件:
正确输出和错误输出同时保存,追加——【命令 >> 文件 2>&1】和【命令 &>> 文件】效果是一样的:
把正确输出追加到文件1中,把错误输出追加到文件2中,命令 >> 文件1 2>>文件2:
- ** 输入重定向**
| 类型| 符号 | 功能 |
| ------------- |:-------------:| :-----:| :-----:|
|标准输入 |命令 < 文件 |命令把文件的内容作为标准输入|
|标识符限定输入 | 命令 << 标识符 |命令从标准输入中读入内容,直到遇到标识符位置|
|输入输出重定向| 命令 < 文件 > 文件2 |命令以文件1作为标准输入,以文件2作为标准输出|
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
wc [选项] [文件名]
选项:
-c 只统计字节数
-w 只统计单词数(只要字符之间有空格,就认识是一个单词)
-l 只统计行数
操作步骤:
输入wc → 回车 → 输入内容 → Ctrl+D
wc < 文件
命令把文件的内容作为标准输入并统计
wc << 标识符
>……
>标识符
把标识符之间的内容作为命令的输入并统计
** 4. 管道符**
- 多命令顺序执行
| 多命令执行符| 格式 | 作用 |
| ------------- |:-------------:| :-----:| :-----:|
|; |命令1 ; 命令2|多个命令顺序执行,命令之间没有任何逻辑关系|
|&& | 命令1&&命令2 |逻辑与。当命令1正确执行,命令2才会执行。命令1执行不正确,不执行命令2|
|||| 命令1||命令2 |逻辑或。当命令1执行正确,则命令2不执行。当命令1执行不正确,则命令2执行|
多个命令顺序执行,命令之间没有任何逻辑关系——【;】
逻辑与。当命令1正确执行,命令2才会执行。命令1执行不正确,不执行命令2——【&&】
逻辑或。当命令1执行正确,则命令2不执行。当命令1执行不正确,则命令2执行——【||】
综合逻辑与和逻辑或:
- 管道符
命令1|命令2
命令1的正确输出作为命令2的操作对象
先查处出家目录下所有文件,然后作为命令2的操作对象,查出小于4k大于1k的文件并详细展示:
查出当前所有的网络连接:
以下是网络端口的访问情况,数据很长,暂且就截这么点吧
其中,有一条是这样的,其他状态时LISTEN,代表端口被监听中。这条ESTABLISHED,代表正在连接这个端口。
22端口是谁呢?
当然是现在正在进行远程连接的Xshell了!
通过管道符查询当前链接linux的客户端:
增强,通过管道符查询当前链接linux的客户端的人数:
** 5. Shell中通配符**
- 通配符
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 可以匹配0个或多个任意字符 |
[] | 匹配中括号中任意一个字符。 |
[-] | 匹配中括号中任意一个字符。-代表一个范围。例如[a-z],代表可以匹配a-z之间的任意一个字符 |
[ ^ ] | 逻辑非,表示匹配不是中括号内的一个字符。例如[^0-9],代表匹配一个不是数字的字符 |
一般用在文件名称的匹配和目录的匹配。
- Bash中的其他符号
符号 | 作用 |
---|---|
' ' | 单引号。在单引号中所有的特殊符号,都没有特殊含义。 |
"" | 双引号。在双引号中所有的特殊符号,都没有特殊含义。但是“$”、“`”、“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。 |
`` | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。 |
$() | 和反引号作用一样,用来引用系统命令。 |
# | 在Shell脚本中,#号开头的行代表注释 |
$ | 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。 |
转义符。跟在\后面的特殊符号将失去特殊意义,变为普通字符。如$将输出$符号,而不是当作变量引用 |
这个例子,用到了单引号、双引号、反引号、$()、$变量名: