SHELL 基础 入门(三) Bash 快捷键 命令执行顺序,详解通配符

目录

[Bash 常用快捷键](#Bash 常用快捷键)

输入输出重定向

[<< 用法](#<< 用法)

输出重定向

命令执行顺序

[; 分号](#; 分号)

&&

||

通配符

传统通配符

[' * '](#' * ')

[[ ]](#[ ])

[[ - ]](#[ - ])

[[ ^ ]](#[ ^ ])

常用字符

[强调 : { } 生成序列](#强调 : { } 生成序列)


Bash 常用快捷键

Ctrl + A 把光标移动到命令行开头

Ctrl + E 把光标移动到命令行尾

Ctrl + D 退出当前终端 ( 正常的退出 )

Ctrl + C 强制终止当前命令 ( 非正常的退出 )

Ctrl + L 清屏

Ctrl + U 删除或剪切光标之前的命令

Ctrl + K 删除或剪切光标之后的命令

Ctrl + Y 粘贴 Ctrl + U 或 Ctrl + K 剪切的内容

Ctrl + R 在历史命令中搜索

Ctrl + Z 暂停,并放入后台

Ctrl + S 暂停屏幕输出

Ctrl + Q 恢复屏幕输出

输入输出重定向

Bash 的标准输入输出

设备 设备文件名 文件描述符 类型

键盘 /dev/stdin 0 标准输入

显示器 /dev/stdout 1 标准输出

显示器 /dev/stderr 2 标准错误输出

<< 用法

快速生成文件

===>>

复制代码
[root@localhost ~]# cat > test1.txt << EOF
> TOM
> LACY
> Jon
> EOF
[root@localhost ~]# 

当键盘输入 EOF 的时候,就会结束,就是 结束符 ~!!

这样 test1.txt 就生成了 ~!!!

输出重定向

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

命令执行顺序

; 分号

-- 命令的顺序执行

===>>>

不管前面的命令是否执行成功,都会挨个执行一遍,即使中间有的命令没能执行成功,也会接着

执行后面的命令。

&&

-- 前面命令执行不成功,后面的命令不执行

===>>>

显然,前面 lddd 命令执行不成功,后面的 pwd 也就不执行了 ~!!

||

-- 前面的命令执行成功,后面的命令就不执行; 前面的命令执行不成功,后面的命令才执行

===>>>

前面命令执行不成功,则执行后面命令

前面命令执行成功了,后面命令就不执行了 ~!!!

拓展 : 面试题

如果用户 hadoop 不存在则创建

===>>>

首先,我们如何判断用户是否存在呢 ??

===>>>

那就是 id 命令了, id 用户名

那我们就可以根据 id 用户名 是否执行成功来判断 该用户是否存在,

即利用命令的返回值来判断,并且,我们又不需要这个命令执行的结果,只要这个命令是否

执行成功的返回值。

===>>>

复制代码
[root@localhost ~]# id hadoop &> /dev/null

这就是 我们将命令执行,执行完后把结果扔到 回收站 ( 我们不要执行结果 )

完整执行为

===>>>

复制代码
[root@localhost ~]# id hadoop &> /dev/null || userhad hadoop 

我们就用到了 || 符, 即前面的命令要是执行成功了,那就不需要再创建该用户;

要是 || 符 前面的命令没执行成功,那就说明没有该用户,那就执行 || 后面的命令,创建用户

通配符

传统通配符

? 匹配一个任意字符

' * ' 匹配0个或任意多个任意字符,也就是可以匹配任意内容

\] 匹配 \[ \] 中任意一个字符 \[ - \] 匹配 \[ \] 中任意一个字符, - 代表一个范围,从哪儿到哪儿 \[ \^ \] 逻辑非,表示匹配不是中括号内的一个字符

示例

创建一系列文件,提供素材

复制代码
[root@localhost test]# touch test.txt
[root@localhost test]# touch test{1..20}.txt

===>>>

没有 test.txt 和 test10 - test20.txt

' * '

===>>>

所有 test.txt 的文件都列出了,包括 test.txt 理解 0个或多个 任意字符

[ ]

===>>>

\] 中 任意 一个字符 ### **\[ - \]** **===\>\>\>** ![](https://file.jishuzhan.net/article/1694562396649033729/30c1875dc1f34982a69f547fd29736c6.png) ![](https://file.jishuzhan.net/article/1694562396649033729/577eb00b6c0342eca1b3dd003b579bf9.png) 注意列出 test11 到 test16 的文件时,那就得 往外提一个 1 出去,因为 \[ \] 里只能匹配一个字符 列出以小写字母开头,结尾时 .sh 的文件 **===\>\>\>** [root@localhost test]# ls [a-z]*.txt ### **\[ \^ \]** **===\>\>\>** ![](https://file.jishuzhan.net/article/1694562396649033729/ed344ac76be44c96aebc7b319ead36f6.png) 不想要 test1 test3 test5 文件,所以就取反; 注意列出的 也并没有 test10-test20 .txt 的文件哦 ## 常用字符 \[ \[:class:\] \] : 匹配一个属于指定字符类中的字符 \[:class:\] 表示一种字符类,比如: 数字,大小写字母等 常用字符类 : > \[:alnum:\] : 匹配任意一个字母或数字,传统写法 : a-zA-Z0-9 > > \[:alpha:\] : 匹配任意一个字母, 传统写法 : a-zA-Z > > \[:digit:\] : 匹配任意一个数字, 传统写法 : 0-9 > > \[:lower:\] : 匹配任意一个小写字母 传统写法 : a-z > > \[:upper:\] : 匹配任意一个大写字母 传统写法 : A-Z **注** : 在使用专属字符集的时候,字符集之外还需要 \[ \] 来包含,否则不能生效 \~!! 如果使用上述格式的话,那对它的取反就是 在两个括号的中间进行取反 如 : \[\^\[ : alnum:\]\] \[\^\[:digit:\]\] \[\^\[:lower:\]\] 等等 列出 以小写字母开头,.txt 结尾的文件 **===\>\>\>** [root@localhost test]# ls [[:lower:]]*.txt ### **强调** : { } 生成序列 > { } 生成序列 > > touch file{1..9}.txt # 当前路径生成 file1.txt-file9.txt 。 { a..f } 代表 a-f > > 不连续的使用 , 分隔,比如 file{1,3,5}.txt 那就是 file1.txt file3.txt file5.txt > 利用 { } 备份 > > \[root@localhost test\]# cp test1.txt{,.bak} # 将test1.txt 复制一份叫 test1.txt.bak > > > \[root@localhost test\]# cp test{2,22}.txt # 复制 test2.txt 为 test22.txt **示例** : 列出 /etc/ 目录中不是以字母 a 到 n 开头的,并且以 .conf 结尾的文件 **===\>\>\>** [root@localhost test]# ls /etc/[^a-n]*.conf 列出 /bin/ 下以 c 或 k 开头的文件 **===\>\>\>** [root@localhost test]# ls /bin/[ck]*

相关推荐
乌托邦的逃亡者34 分钟前
Docker的/var/lib/docker/目录占用100%的处理方法
运维·docker·容器
ldj202039 分钟前
Jenkins 流水线配置
运维·jenkins
古希腊数通小白(ip在学)3 小时前
stp拓扑变化分类
运维·服务器·网络·智能路由器
l1x1n05 小时前
Vim 编辑器常用操作详解(新手快速上手指南)
linux·编辑器·vim
12点一刻5 小时前
搭建自动化工作流:探寻解放双手的有效方案(2)
运维·人工智能·自动化·deepseek
未来之窗软件服务5 小时前
东方仙盟AI数据中间件使用教程:开启数据交互与自动化应用新时代——仙盟创梦IDE
运维·人工智能·自动化·仙盟创梦ide·东方仙盟·阿雪技术观
ajassi20006 小时前
开源 python 应用 开发(三)python语法介绍
linux·python·开源·自动化
o不ok!6 小时前
Linux面试问题-软件测试
linux·运维·服务器
DaxiaLeeSuper7 小时前
Prometheus+Grafana+node_exporter监控linux服务器资源的方案
linux·grafana·prometheus
尽兴-8 小时前
如何将多个.sql文件合并成一个:Windows和Linux/Mac详细指南
linux·数据库·windows·sql·macos