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

一、Shell概述

1. Shell是什么?

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

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

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


      Paste_Image.png
    • 切换不同的Shell(实际上是每切换一个就新增了一个shell。):


      Paste_Image.png
    • 退出Shell:


      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码表
Paste_Image.png

Paste_Image.png

8. \xhh
Paste_Image.png

9. \e[1;……\e[0m
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无法使用小键盘区输入数字

Paste_Image.png

3. 脚本执行

赋予执行权限,直接运行
   chmod 755 xxx.sh  
   ./xxx.sh
通过Bash调用执行脚本(无需赋予权限)
    bash xxx.sh
Paste_Image.png

三、Bash基本功能

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

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

  • 查看与设定别名
alias
查看系统中所有命令的别名
Paste_Image.png

其中:

alias cp='cp -i' 中-i是用来提示是否覆盖不同节点的同名文件的。其他几个原命令中带-i也是同理。
Paste_Image.png
alias 别名 = '原命令'
设定命令别名(系统重启后失效)
Paste_Image.png

Paste_Image.png
  • 别名永久生效和删除别名
vi 用户的家目录/.bashrc 例如:vi ~/.bashrc
写入环境变量配置文件

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


Paste_Image.png

Paste_Image.png

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

source 用户的家目录/.bashrc
立即使/.bashrc内容生效!
Paste_Image.png
unalias 别名
删除别名(是临时删除,下次系统重启后还会存在。要想彻底删除,需要去.bashrc文件中删除指定的别名,就会永久删除)
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. 查看历史命令


    Paste_Image.png
  2. 清空历史命令并同步到历史命令保存文件(历史命令,最好不要清空,如果遇到问题,可以帮助排错)


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

Paste_Image.png
  • 历史命令的调用
    • 使用上、下箭头调用以前的历史命令
    • 使用“!n”重复执行第n条历史命令
    • 使用"!!"重复执行上一条命令
    • 使用"!字串"重复执行最后一条以该字串开头的命令

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


Paste_Image.png

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


Paste_Image.png

使用"!字串"重复执行最后一条以该字串开头的命令:
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中。

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

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

Paste_Image.png

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

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

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

正确输出和错误输出同时保存,追加——【命令 >> 文件 2>&1】和【命令 &>> 文件】效果是一样的:
Paste_Image.png

把正确输出追加到文件1中,把错误输出追加到文件2中,命令 >> 文件1 2>>文件2:
Paste_Image.png

  • ** 输入重定向**

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

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

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

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


Paste_Image.png
wc < 文件 
命令把文件的内容作为标准输入并统计
Paste_Image.png
wc << 标识符
>…… 
>标识符
把标识符之间的内容作为命令的输入并统计
Paste_Image.png

** 4. 管道符**

  • 多命令顺序执行

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

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


Paste_Image.png

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


Paste_Image.png

逻辑或。当命令1执行正确,则命令2不执行。当命令1执行不正确,则命令2执行——【||】
Paste_Image.png

综合逻辑与和逻辑或:


Paste_Image.png
  • 管道符
命令1|命令2
命令1的正确输出作为命令2的操作对象

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


Paste_Image.png

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


Paste_Image.png

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


Paste_Image.png

22端口是谁呢?
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的方式得到变量的值。
转义符。跟在\后面的特殊符号将失去特殊意义,变为普通字符。如$将输出$符号,而不是当作变量引用

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


Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容