视频参考:https://www.bilibili.com/video/BV1mW411i7Qf?from=search&seid=11812550775556654179
一、历史命令与命令补全
1、历史命令
[root@localhost ~]# history [选项] [历史命令保存文件]
选项: -c:清空历史命令
-w:把缓存中的历史命令写入历史命令保存文件~/.bash_history(现在都可以进行查看)
ly2@DGX:~$ history
1 lscpu
2 conda
3 ls
4 ubuntu
5 mkdir file_1
6 ls
7 cd file_1
8 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
可以查看历史命令,默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改。
历史命令的调用
- 使用上、下箭头调用以前的历史命令
- 使用“!n”重复执行第n条历史命令
- 使用“!!”重复执行上一条命令
- 使用“!字串”重复执行最后一条以该字串开头的命令
2、命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,只要在输入命令或文件时,按“Tab”键就会自动进行补全,有多个需要按两次
ly2@DGX:~$ user
useradd userdel usermod users
ly2@DGX:~$ vim /usr/“Tab键”
bin/ include/ lib32/ local/ share/
games/ lib/ lib64/ sbin/ src/
二、命令别名与常用快捷键
1、命令别名
设定命令别名:
[root@localhost ~]# alias 别名=‘原命令’ #重启即失效
查询命令别名:
[root@localhost ~]# alias
ly2@DGX:~$ alias vi='vim'
命令执行时顺序:
- 第一顺位执行用绝对路径或相对路径执行的命令。
- 第二顺位执行别名。
- 第三顺位执行Bash的内部命令。
- 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。
ly2@DGX:~$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
ly2@DGX:~$ whereis cd
cd: # 没有执行文件/bin/ls,因为它是bash内部命令
让别名永久生效
[root@localhost ~]# vi /root/.bashrc
删除别名
[root@localhost ~]# unalias 别名
2、Bash常用快捷键
快捷键 | 作 用 |
---|---|
ctrl+A | 把光标移动到命令行开头。如果输入的命令过长,想要把光标移动到命令行开头时使用 |
ctrl+E | 把光标移动到命令行结尾 |
ctrl+C | 强制终止当前的命令 |
ctrl+L | 清屏,相当于clear命令 |
ctrl+U | 删除或剪切光标之前的命令。输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便 |
ctrl+K | 删除或剪切光标之后的内容 |
ctrl+Y | 粘贴ctrl+U或ctrl+K剪切的内容 |
ctrl+R | 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索 |
ctrl+D | 退出当前终端 |
ctrl+Z | 暂停,并放入后台。这个快捷键牵扯工作管理的内容,在系统管理章节会进行详细介绍 |
ctrl+S | 暂停屏幕输出 |
ctrl+Q | 恢复屏幕输出 |
三、输入输出重定向
1、标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/sdtout | 1 | 标准输出 |
显示器 | /dev/sdterr | 2 | 标准错误输出 |
2、输出重定向
命令的标准输出是输出到显示器中,而重定向使其输出到文件中。
- 典型应用:定时运行备份文件命令,将结果保存到文件中,便于查错。
- 任何有输出的命令都可以进行重定向,eg…指令cd没有输出。
表1:实际中用处不大
类 型 | 符 号 | 作 用 |
标准输出重定向 | 命令 > 文件 | 以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中。 |
命令 >> 文件 | 以追加的方式,把命令的正确输出输出到指定的文件或设备当中 | |
标准错误输出重定向 | 错误命令 2>文件 | 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中 |
错误命令 2>>文件 | 以追加的方式,把命令的错误输出输出到指定的文件或设备当中。 |
ly2@DGX:~$ ls # 指令输出
hello.sh miniconda3 Miniconda3-latest-Linux-x86_64.sh
ly2@DGX:~$ ls > abc # 标准输出重定向
ly2@DGX:~$ ls
abc hello.sh miniconda3 Miniconda3-latest-Linux-x86_64.sh
ly2@DGX:~$ cat abc # 查看重定向文件
abc
hello.sh
miniconda3
Miniconda3-latest-Linux-x86_64.sh
ly2@DGX:~$ date # 指令输出
Wed Nov 20 22:23:27 HKT 2019
ly2@DGX:~$ date > abc # 覆盖原文件
ly2@DGX:~$ cat abc
Wed Nov 20 22:23:48 HKT 2019
ly2@DGX:~$ ls >> abc # 追加原文件
ly2@DGX:~$ cat abc # 查看追加的重定向文件
Wed Nov 20 22:23:48 HKT 2019
abc
hello.sh
miniconda3
Miniconda3-latest-Linux-x86_64.sh
ly2@DGX:~$ lst # 错误指令输出
No command 'lst' found, but there are 17 similar ones
lst: command not found
ly2@DGX:~$ lst >> abc # 错误指令重定向失败,忘记2
No command 'lst' found, but there are 17 similar ones
lst: command not found
ly2@DGX:~$ lst 2 >> abc # 错误指令重定向失败,2与>之间不能有空格
No command 'lst' found, but there are 17 similar ones
lst: command not found
ly2@DGX:~$ lst 2>> abc # 错误指令重定向
ly2@DGX:~$ cat abc # 查看追加的重定向文件
Wed Nov 20 22:23:48 HKT 2019
abc
hello.sh
miniconda3
Miniconda3-latest-Linux-x86_64.sh
No command 'lst' found, but there are 17 similar ones
lst: command not found
表2:实际中应用
正确输出和错误输出同时保存 | 命令 > 文件 2>&1 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。 |
命令 >> 文件 2>&1 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。 | |
命令 &>文件 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。 | |
命令 &>>文件 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。 | |
命令>>文件1 2>>文件2 | 把正确的输出追加到文件1中,把错误的输出追加到文件2中。 |
ly2@DGX:~$ lst >> bcd 2>&1 # 以追加的方式,把错误输出保存到同一个文件bcd中
ly2@DGX:~$ ls >> bcd 2>&1 # 以追加的方式,把正确输出保存到同一个文件bcd中
ly2@DGX:~$ cat bcd # 查看重定向文件
No command 'lst' found, but there are 17 similar ones
lst: command not found
abc
bcd
hello.sh
miniconda3
Miniconda3-latest-Linux-x86_64.sh
ly2@DGX:~$ date &>> cde # 以追加的方式,把正确输出保存到同一个文件cde中
ly2@DGX:~$ datego &>> cde # 以追加的方式,把错误输出保存到同一个文件cde中
ly2@DGX:~$ cat cde # 查看重定向文件
Wed Nov 20 22:45:27 HKT 2019
datego: command not found
ly2@DGX:~$ ls &>/dev/null # 常用做法,/dev/null文件为空,相当于丢到垃圾箱
3、输入重定向(用处不大)
不再以键盘作为输入,而是以文件作为输入。
[root@localhost ~]# wc [选项] [文件名]
选项: -c 只统计字节数
-w 只统计单词数
-l 只统计行数
- 命令<文件 #把文件作为命令的输入
- 命令<< 标识符
…
标识符 #把标识符之间内容作为命令的输入
ly2@DGX:~$ wc # 统计命令
qwrslmjf ajflasjf # 输入内容
asgga
asfa
hhdt
t # 最后一行按ctrl+d,退出当前输入并输出统计值
5 6 36 # 5行,6个字节,36个字符(包含回车符)
ly2@DGX:~$ wc < anaconda-ks.cfg # 将anaconda日志作为输入
51 121 1207
ly2@DGX:~$ wc << hello
>dgagag
>dsa
>gasg
>as
>hello
4 4 19 # 从wc开始到hello行为界
四、多命令顺序执行与管道符
1、多命令顺序执行
多命令执行符 | 格 式 | 作 用 |
---|---|---|
; | 命令1 ;命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令1 && 命令2 | 逻辑与:当命令1正确执行,则命令2才会执行;当命令1执行不正确,则命令2不会执行 |
| | | 命令1 | | 命令2 | 逻辑或:当命令1执行不正确,则命令2才会执行;当命令1正确执行,则命令2不会执行 |
ly2@DGX:~$ ls; cd /user/; date # 第二个命令会报错
hello.sh miniconda3 Miniconda3-latest-Linux-x86_64.sh # 命令1输出
-bash: cd: /user/: No such file or directory # 命令2输出
Thu Nov 21 09:10:57 HKT 2019 # 命令3输出
[root@localhost ~]# dd if=输入文件 of=输出文件 bs=字节数 count=个数
作用:dd命令可以复制特殊文件如分区和硬盘的数据及其系统,而cp只能复制普通文件。
选项: if=输入文件 指定源文件或源设备
of=输出文件 指定目标文件或目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数 指定输入/输出多少个数据块
ly2@DGX:~$ ls # 查看当前目录下的文件
hello.sh miniconda3 Miniconda3-latest-Linux-x86_64.sh
ly2@DGX:~$ pwd # 显示当前路径
/home/ly2
ly2@DGX:~$ date ; dd if=/dev/zero of=/home/ly2/test bs=1k count=100000 ; date # 两个date之差可以计算复制时间,复制1k*100000≈100M文件
Thu Nov 21 09:21:28 HKT 2019
100000+0 records in
100000+0 records out
102400000 bytes (102 MB, 98 MiB) copied, 0.388664 s, 263 MB/s
Thu Nov 21 09:21:28 HKT 2019
ly2@DGX:~$ ls # 查看当前目录下的文件
hello.sh miniconda3 Miniconda3-latest-Linux-x86_64.sh test
ly2@DGX:~$ ls && echo yes # 逻辑与,1正确,2执行
hello.sh miniconda3 Miniconda3-latest-Linux-x86_64.sh test
yes
ly2@DGX:~$ ls fag && echo yes # 逻辑与,1错误,2不执行
ls: cannot access 'fag': No such file or directory
ly2@DGX:~$ ./configure && make && make install # 常用于软件包安装
ly2@DGX:~$ ls fag || echo no # 逻辑或,1错误,2执行
ls: cannot access 'fag': No such file or directory
no
ly2@DGX:~$ ls || echo no # 逻辑或,1正确,2不执行
hello.sh miniconda3 Miniconda3-latest-Linux-x86_64.sh test
ly2@DGX:~$ ls && echo yes || echo no # 相当于if语句,ls正确执行,yes
d2l-zh hello.sh miniconda3 Miniconda3-latest-Linux-x86_64.sh test
yes
ly2@DGX:~$ lst && echo yes || echo no # ls错误执行,no
No command 'lst' found, but there are 17 similar ones
lst: command not found
no
2、管道符
命令格式: [root@localhost ~]# 命令1 | 命令2
#命令 1 的正确输出作为命令 2 的操作对象
more分屏显示文件内容,不能分屏显示结果,采用管道符可以。
ly2@DGX:~$ ls -l -a /etc # 显示/etc下所有文件的详细信息
total 2158 # 总共2158个文件
drwxr-xr-x 140 root root 12288 Nov 20 19:21 . # 第一个文件
……………………
-r--r-- 1 root root 477 Jul 20 2015 zsh_command_not_found # 最后一个文件
ly2@DGX:~$ ls -l -a /etc | more # 将输出文件通过more进行分屏显示
total 2158 # 总共2158个文件
drwxr-xr-x 140 root root 12288 Nov 20 19:21 . # 第一个文件
……………………
drwxr-xr-x 2 root root 4096 Nov 19 20:41 cron.weekly
-rw-r--r-- 1 root root 54 Apr 24 2019 crypttab # 中间某文件
--More--
同理,grep只能在文件中搜索内容,通过管道符可以搜索文件信息
[root@localhost ~]# grep [选项] “搜索内容” 文件名
选项: -i: 忽略大小写
-n: 输出行号
-v: 反向查找
–color=auto 搜索出的关键字用颜色显示,注意是两个-
netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。
ly2@DGX:~$ netstat -an # 测试netstat命令
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.………… 0.0.………… LISTEN
tcp 0 0 219.………… 219.………… ESTABLISHED
tcp 0 0 127.………… 127.………… ESTABLISHED
………………
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ACC] STREAM LISTENING 403…… @/tmp……
………………
ly2@DGX:~$ grep -n --color=auto "root" /etc/passwd # 测试gre命令
1:root:x:0:0:root:/root:/bin/bash # "root"带颜色显示,输出行号
51:nm-openvpn:x:116:124…………root:/bin/false
ly2@DGX:~$ netstat -an | grep "ESTABLISHED" # 只显示"ESTABLISHED"连接
tcp 0 0 219.………… 219.………… ESTABLISHED
tcp 0 0 127.………… 127.………… ESTABLISHED
………………
五、通配符与其他特殊符号
1、通配符
应用:用来匹配文件名。
通 配 符 | 作 用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个任意字符,也就是可以匹配任何内容 |
[ ] | 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c。 |
[ - ] | 匹配中括号中任意一个字符,-代表一个范围。例如:[a-z] 代表匹配一个小写字母。 |
[ ^ ] | 逻辑非,表示匹配不是中括号内的一个字符。例如:[^09]代表匹配一个不是数字的字符。 |
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# rm -rf #注意不能是rm -rf /* ,它表示的是删除家目录文件
touch命令有两个功能
- 用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来
- 用来创建新的空文件
ly2@DGX:~$ mkdir tongpeifu # 创建测试目录
ly2@DGX:~$ ls # 显示文件
miniconda3 tongpeifu hello.sh Miniconda3-latest-Linux-x86_64.sh
ly2@DGX:~$ cd tongpeifu # 进入测试目录
ly2@DGX:~/tongpeifu$ touch abc # 创建空文件
ly2@DGX:~/tongpeifu$ ls # 显示文件
abc
ly2@DGX:~/tongpeifu$ touch abcd # 创建空文件
ly2@DGX:~/tongpeifu$ touch 012 # 创建空文件
ly2@DGX:~/tongpeifu$ touch 0abc # 创建空文件
ly2@DGX:~/tongpeifu$ touch aabc # 创建空文件
ly2@DGX:~/tongpeifu$ ls # 显示文件
012 0abc abc abcd aabc
ly2@DGX:~/tongpeifu$ ls *abc # 在前匹配零个或任意多个字符
0abc abc aabc
ly2@DGX:~/tongpeifu$ ls *abc* # 两端匹配零个或任意多个字符
0abc abc abcd aabc
ly2@DGX:~/tongpeifu$ ls ?abc # 在前匹配任意一个字符
0abc
ly2@DGX:~/tongpeifu$ ls [0-9]abc # 在前匹配中括号内一个字符
0abc
ly2@DGX:~/tongpeifu$ ls [^0-9]abc # 在前匹配“不是”中括号内一个字符
aabc
2、Bash中其他特殊符号
符 号 | 作 用 |
---|---|
’ ’ | 单引号,用于连接整型,Linux中空格表示命令间隔,例如,‘hello world’。在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义 |
" " | 双引号。在双引号中特殊符号都没有特殊含义,但是“$”、“`” 和“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义 |
` ` | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。 和$()作用一样,不过推荐使用 $(),因为反引号非常容易看错 |
$( ) | 和反引号作用一样,用来引用系统命令。执行括号内命令,将结果输出或赋值给某一变量 |
# | 在Shell脚本中,#开头的行代表注释 |
$ | 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值 |
\ | 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。 如$将输出“$”符号,而不当做是变量引用 |
赋值变量再输出:
ly2@DGX:~/tongpeifu$ name=xdl # 定义一个变量name为常量
ly2@DGX:~/tongpeifu$ echo name # 输出变量名称其本身
name
ly2@DGX:~/tongpeifu$ echo $name # 输出变量值
xdl
ly2@DGX:~/tongpeifu$ echo '$name' # 单引号,特殊符号没有特殊含义
$name
ly2@DGX:~/tongpeifu$ echo "$name" # 双引号,特殊符号$表示调用变量的值
xdl
ly2@DGX:~/tongpeifu$ abc=`date` # 反引号,先执行系统命令,把结果赋给变量
ly2@DGX:~/tongpeifu$ echo $abc # 赋给变量,之后输出
Thu Nov 21 15:57:15 HKT 2019
ly2@DGX:~/tongpeifu$ abc=$(date) # 与上述反引号作用相同,将date运行结果赋值给abc
直接输出:
ly2@DGX:~/tongpeifu$ echo ls # 输出ls本身
ls
ly2@DGX:~/tongpeifu$ echo $(ls) # 输出系统命令ls的结果
012 0abc aabc abc abcd
ly2@DGX:~/tongpeifu$ echo '$(date)' # 单引号,特殊字符无含义
$(date)
ly2@DGX:~/tongpeifu$ echo "$(date)" # 双引号,特殊字符有含义
Thu Nov 21 16:09:23 HKT 2019
ly2@DGX:~/tongpeifu$ echo $(date) # 不赋给变量,直接输出也可以
Thu Nov 21 16:01:41 HKT 2019
ly2@DGX:~/tongpeifu$ echo \$name # 转义符,之后的特殊符号将失去特殊含义
$name