【Linux】Shell基础-Bash基本功能

往期文章
【Linux】常用指令合集
【Linux】文本编辑器Vim
【Linux】软件包管理
【Linux】用户和用户组管理
【Linux】权限管理
【Linux】文件系统管理

什么是Shell

  • Shell是一个命令解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

    如下图所示,最底层是硬件,然后通过内核来管理硬件,但外层的应用程序是内核无法识别的,需要先对程序进行“翻译”成内核可以识别的二进制,这就需要Shell命令解释器来完成。

在这里插入图片描述

  • Shell是一个功能相当强大的编程语言,易编写,易调试,灵活性强。Shell是解释执行的脚本语言,在Shell可以直接调用Linux系统命令。

Linux支持的Shell

查看路径/etc/shells,可以看到所支持的Shell。

在这里插入图片描述

这些Shell之间是可以切换的,只要在命令行输入名称即可切换,输入切换成sh,输入exit退出。

在这里插入图片描述

Shell脚本的执行方式

echo输出命令

echo [选项][输出内容]
选项:
	-e:	支持反斜线控制的字符转换

例如我想输出hello world,则可输入:

echo hello world

在这里插入图片描述

反斜线控制的字符转换有如下格式:

控制字符 作用
\\ 输出\
\a 输出警告音
\b 退格键,也就是向左删除键
\c 取消输出行末的换行符,和“-n"选项一致
\e ESCAPE键
\f 换页符
\n 换行符
\r 回车键
\t 制表符,即Tab键
\v 垂直制表符
\0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数
\xhh 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数

下面举一些例子:

  1. \b删除左侧字符

在这里插入图片描述

  1. \t制表符,\n换行符

在这里插入图片描述

  1. \x按照十六进制ASCII码输出字符

查表可知十六进制61的ASCII码为a,其他依次类推。

在这里插入图片描述

  1. 使输出带特定颜色

\e[1为开启颜色输出,\e[0m表示结束颜色输出,其中31m代表红色。color可替换为任意内容。

在这里插入图片描述

其他颜色:

30m=黑色	31m=红色	32m=绿色	33m=黄色
34m=蓝色	35m=洋红	36m=青色	37m=白色

第一个脚本

创建脚本

vim hello.sh

脚本开头加上以下一行内容,注意这不是注释,是标称,标称我以下写的内容是shell脚本,除了这一句,其他用#开头的就属于注释了。

#!/bin/Bash

然后随便写一些内容,保存退出。

在这里插入图片描述

执行脚本

有两种方法(第一种比较常用):

  • 赋予执行权限,用相对路径或绝对路径执行。
chmod 755 hello.sh
#用绝对路径执行,注意这个sh文件夹是我自己创建的,用于储存脚本文件
/root/sh/hello.sh
#用相对路径执行,前提是已经在sh文件夹下
./hello.sh
  • 通过Bash调用执行文本,不用添加执行权限。
bash hello.sh

注意:Windows下的shell脚本在Linux下执行时,记得要进行格式转换!,用以下命令:

dos2unix [要转换的文件] #Windows->Linux
unix2dos [要转换的文件] #Linux->Windows

Bash的基本功能

历史命令与命令补全

历史命令

history
选项:
	-c:		清空历史命令
	-w:		把缓存中的历史命令写入历史命令保存文件~/.bash_history

注意,当前登录状态输入的命令不会保存在文件~/.bash_history,需要退出后才会保存,如果要立刻保存,则可以执行以下命令。

 history -w [历史命令保存文件]

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

vim /etc/profile

在这里插入图片描述

历史命令的调用

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

命令与文件补全

在输入命令或文件时,按Tab键可以自动补全,如果没有补全,说明有多个以该字串开头的命令,再按一次Tab,则会将所有相关命令列出。

别名与快捷键

命令别名

设定命令别名

alias 别名='原命令'

查询命令别名

alias

命令执行时顺序

  1. 第一顺位执行用绝对路径或相对路径执行命令。
  2. 第二顺位命令执行别名。
  3. 第三顺位执行Bash的内部命令。
  4. 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。

例如,我用vi作为别名代替vim:

alias vi='vim'

其实vi本身也是一个命令,但原本的vi处于第四顺位,别名的优先级更高,所以我执行vi时就相当于执行vim,如果要执行原来的vi则需要用绝对路径,虽然如此,但不建议将原有命令作为别名。

在说说$PATH环境变量,其实在Linux中所有命令的执行都是用绝对路径完成的,但实际上我们在执行命令时只需要输入命令名称即可,这是因为这些命令的绝对路径储存在PATH环境变量中。

让别名永久生效

修改文件.bashrc

vi /root/.bashrc

按下列格式添加即可:

在这里插入图片描述

Bash常用快捷键

快捷键 作用
ctrl+A 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。
ctrl+E 把光标移动到命令行结尾。
ctrl+C 强制终止当前命令。
ctrl+L 清屏
ctrl+U 删除或剪切光标之前的命令。
ctrl+K 删除或剪切光标之后的内容。
ctrl+Y 粘贴ctrl+U或ctrl+K剪切的内容。
ctrl+R 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。
ctrl+D 退出当前终端。
ctrl+Z 暂停,并放入后台。
ctrl+S 暂停屏幕输出。
ctrl+Q 恢复屏幕输出。

输入输出重定向

标准输入输出

设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/sdtout 1 标准输出
显示器 /dev/sdterr 2 标准错误输出

由于设备文件名比较难记,故用文件描述符来描述。

输出重定向

举个例子,当我输入一个指令时,输出应该是在屏幕上,但现在我不让它输出到屏幕,把它输出到文件中,也就是改变了它的输出方向,叫做输出重定向。但为什么要输出到文件中呢?因为该文件可作为一个执行脚本,让系统在指定的时间可以执行该脚本。

在这里插入图片描述

标准输出重定向

例如,我将命令ls输出的结果保存在一个文件中:

ls > abc

然后看一下文件abc的内容:

cat abc

我们会发现ls命令输出的结果已经保存在文件中:

在这里插入图片描述

如果们需要追加一些命令的输出,则需要用>>,不能用>,否则会将原输出覆盖。

标准错误输出重定向

例如将ls打成lsd,然后把错误输出到abc文件中,则需要多加一个2:

lsd 2>> abc

此时错误已经输出到了文件中。

在这里插入图片描述

实际上这种将正确输出和错误输出分别保存的方法用处不大,因为错误输出的前提是我们已经知道了这个命令是错误的,那我们把它改为正确的就好。

下面这种方式才是常用的:

前四种方法都是一样的,即把正确的输出和错误的输出同时保存在同一个文件中。

在这里插入图片描述

输入重定向

我们之前的输入都是通过键盘来输入的,如果我们通过文件来输入,这就叫输入重定向(用的不多,了解即可)。

wc [选项][文件名]
选项:
	-c	统计字节数
	-w	统计单词书
	-l	统计行数

输入wc统计键盘输入命令,随便添加一些内容,然后Ctrl+d退出,会出现三个数字,从左到右依次是行数,单词数和字符数(包括回车)

在这里插入图片描述

输入重定向的格式如下:

命令<文件	把文件作为命令输入

多命令顺序执行与管道符

多命令顺序执行

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

管道符

命令1的正确输出作为命令2的操作对象。

命令1 | 命令2

来看看管道符有什么用,如果我们想要查看etc下的文件,则可输入:

ll -a /etc/

但会发现文件非常多,不符合我们的查看习惯,这时候我们就可以用分页显示命令more,但如果单独执行more,无法分屏显示etc下的文件,那么我们可以使用管道符,在**ll -a /etc/**成功执行的情况下执行more。

ll -a /etc/ | more

通配符与其他特殊符号

通配符

通配符 作用
匹配一个任意字符
* 匹配0个或任意多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符。
[-] 匹配中括号中任意一个字符,-代表范围。
[^] 逻辑非,代表匹配不是中括号内的字符。

如果我们要删除一个目录下的所有文件,就可以用*来表示。

例如我们可以进入文件夹tmp,删除该目录下所有文件,一定要确保已经进入tmp目录,别把根目录删了!!!

rm -rf *

然后我们再创建以下几个文件,来看看其他通配符的作用

touch abc
touch abcd
touch 123
touch 0abc

显示字符后面带有abc的文件:

ls *abc

在这里插入图片描述

如果要显示abcd,则需要修改为,表示abc后面也允许有其他字符:

ls *abc*

与*不同的是,如果用?,则至少匹配一个字符,例如:

ls ?abc

此时文件abc不会显示,因为abc前面没有与?匹配的字符,只会显示0abc

在这里插入图片描述

再来看看通配符[-]

ls [0-9]abc

在这里插入图片描述

最后是取反通配符[^]

如下命令表示显示abc前面接除了0-9外的字符的文件。

ls [^0-9]abc

Bash中其他特殊符号

符号 作用
‘ ’ 单引号。在单引号中所有的特殊符号,如“$”和“`“(反引号)都没有特殊含义。
“ ” 双引号。在双引号中特殊符号都没有特殊含义,但是"$"、“`“和"\"有意义。
`` 反引号。反引号括起来的内容是系统命令,在Bash中会先执行。
$() 和反引号作用一样,推荐用这个。
# #开头的代表注释。
$ 用于调用变量的值。
\ 转义符,跟在\之后的特殊符号失去特殊含义。

例子:

符号$、’ ’、“ ”的作用

[root@aubin tmp]# name=sc
[root@aubin tmp]# echo $name
sc
[root@aubin tmp]# echo '$name'
$name
[root@aubin tmp]# echo "$name"
sc

反引号,括起来的是系统命令,与$()作用一样,推荐用后者:

在这里插入图片描述

笔记领取

在这里插入图片描述

参考资料:
[1] https://www.bilibili.com/video/BV1mW411i7Qf

猜你喜欢

转载自blog.csdn.net/watermelon_c/article/details/123901250