Linux学习笔记(三、Shell基础)

一、Shell概述

1. Shell是什么?

  • Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
  • Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

课外参考文章: 编译执行和解释执行的区别

Linux学习笔记(三、Shell基础)_第1张图片
Paste_Image.png

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:


      Paste_Image.png
    • 查看Bash兼容哪些Shell:vi /etc/shells


      Linux学习笔记(三、Shell基础)_第2张图片
      Paste_Image.png
    • 切换不同的Shell(实际上是每切换一个就新增了一个shell。):


      Paste_Image.png
    • 退出Shell:


      Linux学习笔记(三、Shell基础)_第3张图片
      Paste_Image.png

二、脚本执行方式

脚本,是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。

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

Paste_Image.png

发现\b放在字符串末尾是无效的
Paste_Image.png

3. \n
Paste_Image.png

4. \r
Paste_Image.png

5. \t
Paste_Image.png

6. \v
Paste_Image.png

7. \0nnn
参考: ASCII码表
Linux学习笔记(三、Shell基础)_第4张图片
Paste_Image.png

Paste_Image.png

8. \xhh
Paste_Image.png

9. \e[1;……\e[0m
Linux学习笔记(三、Shell基础)_第5张图片
Paste_Image.png

2. 第一个脚本

1. vim(vim是vi的增强版,完全兼容vi的所有功能) xxx.sh 创建脚本文件xxx.sh
2. 进入vim编辑器,开头声明:
#!/bin/bash
3. echo -e "内容……"

linux——vi和vim的区别

我的XShell无法输入小盘的数字,有同样问题者,戳这里:xshell无法使用小键盘区输入数字

Linux学习笔记(三、Shell基础)_第6张图片
Paste_Image.png

3. 脚本执行

赋予执行权限,直接运行
   chmod 755 xxx.sh  
   ./xxx.sh
通过Bash调用执行脚本(无需赋予权限)
    bash xxx.sh
Linux学习笔记(三、Shell基础)_第7张图片
Paste_Image.png

三、Bash基本功能

** 1. 命令别名与快捷键**

别名,正式的或规范的名称以外的名称,一种事物在通常的名称之外还有另外的一种名称,有地方称之为昵称,也有地方称之为小名。

  • 查看与设定别名
alias
查看系统中所有命令的别名
Linux学习笔记(三、Shell基础)_第8张图片
Paste_Image.png

其中:

alias cp='cp -i' 中-i是用来提示是否覆盖不同节点的同名文件的。其他几个原命令中带-i也是同理。
Linux学习笔记(三、Shell基础)_第9张图片
Paste_Image.png
alias 别名 = '原命令'
设定命令别名(系统重启后失效)
Linux学习笔记(三、Shell基础)_第10张图片
Paste_Image.png

Linux学习笔记(三、Shell基础)_第11张图片
Paste_Image.png
  • 别名永久生效和删除别名
vi 用户的家目录/.bashrc 例如:vi ~/.bashrc
写入环境变量配置文件

那么下边将我之前设置的新的ll别名,写入到我(root用户)的环境变量配置文件。


Paste_Image.png

Linux学习笔记(三、Shell基础)_第12张图片
Paste_Image.png

设置完成后,下次重新登录,这个别名就会永久生效了!!!那么。如果我想让它直接生效呢?

source 用户的家目录/.bashrc
立即使/.bashrc内容生效!
Paste_Image.png
unalias 别名
删除别名(是临时删除,下次系统重启后还会存在。要想彻底删除,需要去.bashrc文件中删除指定的别名,就会永久删除)
Linux学习笔记(三、Shell基础)_第13张图片
Paste_Image.png
  • 命令生效顺序
    我想有很多小伙伴跟我有一样的疑惑,刚才查看命令别名的时候,有很多别名和原命令是一样的,例如: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+r不好用文字描述,截个图看吧:


Paste_Image.png

** 2. 历史命令**

  • 历史命令
history [选项] [历史命令保存文件]
选项:
    -c 清空历史命令
    -w 把缓存中的历史命令同步到历史命令保存文件~/.bash_history(会覆盖之前保存的历史命令,而不是追加)
  1. 查看历史命令


    Linux学习笔记(三、Shell基础)_第14张图片
    Paste_Image.png
  2. 清空历史命令并同步到历史命令保存文件(历史命令,最好不要清空,如果遇到问题,可以帮助排错)


    Paste_Image.png
历史命令会默认保存1000条,可以在环境变量配置文件/etc/profile中进行修改。
Paste_Image.png

Linux学习笔记(三、Shell基础)_第15张图片
Paste_Image.png
  • 历史命令的调用
    • 使用上、下箭头调用以前的历史命令
    • 使用“!n”重复执行第n条历史命令
    • 使用"!!"重复执行上一条命令
    • 使用"!字串"重复执行最后一条以该字串开头的命令

使用“!n”重复执行第5条历史命令:


Linux学习笔记(三、Shell基础)_第16张图片
Paste_Image.png

使用"!!"重复执行上一条命令:


Linux学习笔记(三、Shell基础)_第17张图片
Paste_Image.png

使用"!字串"重复执行最后一条以该字串开头的命令:
Linux学习笔记(三、Shell基础)_第18张图片
Paste_Image.png
  • 命令与文件补全
    • 在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全。

** 3. 输入输出重定向**

  • 标准输入输出
设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/sdtout 1 标准输出
显示器 /dev/sdterr 2 标准错误输出
  • 输出重定向
    linux中使用重定向符号可以实现输出输入重定向,默认条件下,标准输出和错误输出都是终端,用重定向符号可以把标准输出和错误内容进行重定向,例如把标准输出重定向到文件。

为什么需要重定向呢?
举个例子。假如一个命令正在运行的时候,没有人在电脑跟前,那么就可以把它的结果重定向到文件中,等有人的时候直接看文件中保存的数据就好了。

类型 符号 作用
标准输出重定向 命令 > 文件 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中。
同上 命令 >> 文件 以追加的方式,把命令的正确输出输出到指定的文件或设备当中。
标准错误输出重定向 错误命令 2>文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中。
同上 错误命令 2>>文件 以追加的方式,把命令的错误输出输出到指定的文件或设备当中。
正确输出和错误输出同时保存 命令 >文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同一文件当中。
同上 命令 >>文件 2>&1 以追加的方式,把正确输出和错误输出都保存到同一文件当中。
同上 命令 &> 文件 以覆盖的方式,把正确输出和错误输出都保存到同一文件当中。
同上 命令 &>> 文件 以追加的方式,把正确输出和错误输出都保存到同一文件当中。
同上 命令 >> 文件1 2>>文件2 把正确输出追加到文件1中,把错误输出追加到文件2中。

备注:此处的文件如果不存在那么创建,存在就覆盖或者追加。

标准输出重定向,覆盖——命令 > 文件:

Linux学习笔记(三、Shell基础)_第19张图片
Paste_Image.png

标准输出重定向,追加——命令 >> 文件:
Linux学习笔记(三、Shell基础)_第20张图片
Paste_Image.png

标准错误输出重定向,覆盖——命令 2> 文件:
Linux学习笔记(三、Shell基础)_第21张图片
Paste_Image.png

标准错误输出重定向,追加——命令 2>> 文件:
Paste_Image.png

正确输出和错误输出同时保存,追加——【命令 >> 文件 2>&1】和【命令 &>> 文件】效果是一样的:
Linux学习笔记(三、Shell基础)_第22张图片
Paste_Image.png

把正确输出追加到文件1中,把错误输出追加到文件2中,命令 >> 文件1 2>>文件2:
Linux学习笔记(三、Shell基础)_第23张图片
Paste_Image.png

  • ** 输入重定向**

| 类型| 符号 | 功能 |
| ------------- |:-------------:| :-----:| :-----:|
|标准输入 |命令 < 文件 |命令把文件的内容作为标准输入|
|标识符限定输入 | 命令 << 标识符 |命令从标准输入中读入内容,直到遇到标识符位置|
|输入输出重定向| 命令 < 文件 > 文件2 |命令以文件1作为标准输入,以文件2作为标准输出|

Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。

wc [选项] [文件名]
选项:
    -c 只统计字节数
    -w 只统计单词数(只要字符之间有空格,就认识是一个单词)
    -l 只统计行数

操作步骤:
输入wc → 回车 → 输入内容 → Ctrl+D


Linux学习笔记(三、Shell基础)_第24张图片
Paste_Image.png
wc < 文件 
命令把文件的内容作为标准输入并统计
Linux学习笔记(三、Shell基础)_第25张图片
Paste_Image.png
wc << 标识符
>…… 
>标识符
把标识符之间的内容作为命令的输入并统计
Linux学习笔记(三、Shell基础)_第26张图片
Paste_Image.png

** 4. 管道符**

  • 多命令顺序执行

| 多命令执行符| 格式 | 作用 |
| ------------- |:-------------:| :-----:| :-----:|
|; |命令1 ; 命令2|多个命令顺序执行,命令之间没有任何逻辑关系|
|&& | 命令1&&命令2 |逻辑与。当命令1正确执行,命令2才会执行。命令1执行不正确,不执行命令2|
|||| 命令1||命令2 |逻辑或。当命令1执行正确,则命令2不执行。当命令1执行不正确,则命令2执行|

多个命令顺序执行,命令之间没有任何逻辑关系——【;】


Linux学习笔记(三、Shell基础)_第27张图片
Paste_Image.png

逻辑与。当命令1正确执行,命令2才会执行。命令1执行不正确,不执行命令2——【&&】


Linux学习笔记(三、Shell基础)_第28张图片
Paste_Image.png

逻辑或。当命令1执行正确,则命令2不执行。当命令1执行不正确,则命令2执行——【||】
Linux学习笔记(三、Shell基础)_第29张图片
Paste_Image.png

综合逻辑与和逻辑或:


Linux学习笔记(三、Shell基础)_第30张图片
Paste_Image.png
  • 管道符
命令1|命令2
命令1的正确输出作为命令2的操作对象

先查处出家目录下所有文件,然后作为命令2的操作对象,查出小于4k大于1k的文件并详细展示:


Paste_Image.png

查出当前所有的网络连接:
以下是网络端口的访问情况,数据很长,暂且就截这么点吧


Linux学习笔记(三、Shell基础)_第31张图片
Paste_Image.png

其中,有一条是这样的,其他状态时LISTEN,代表端口被监听中。这条ESTABLISHED,代表正在连接这个端口。


Paste_Image.png

22端口是谁呢?
Linux学习笔记(三、Shell基础)_第32张图片
Paste_Image.png

当然是现在正在进行远程连接的Xshell了!

通过管道符查询当前链接linux的客户端:


Paste_Image.png

增强,通过管道符查询当前链接linux的客户端的人数:
Paste_Image.png

** 5. Shell中通配符**

  • 通配符
通配符 作用
? 匹配一个任意字符
* 可以匹配0个或多个任意字符
[] 匹配中括号中任意一个字符。
[-] 匹配中括号中任意一个字符。-代表一个范围。例如[a-z],代表可以匹配a-z之间的任意一个字符
[ ^ ] 逻辑非,表示匹配不是中括号内的一个字符。例如[^0-9],代表匹配一个不是数字的字符

一般用在文件名称的匹配和目录的匹配。

  • Bash中的其他符号
符号 作用
' ' 单引号。在单引号中所有的特殊符号,都没有特殊含义。
"" 双引号。在双引号中所有的特殊符号,都没有特殊含义。但是“$”、“`”、“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。
`` 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。
$() 和反引号作用一样,用来引用系统命令。
# 在Shell脚本中,#号开头的行代表注释
$ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。
转义符。跟在\后面的特殊符号将失去特殊意义,变为普通字符。如$将输出$符号,而不是当作变量引用

这个例子,用到了单引号、双引号、反引号、$()、$变量名:


Linux学习笔记(三、Shell基础)_第33张图片
Paste_Image.png

你可能感兴趣的:(Linux学习笔记(三、Shell基础))