兄弟连linux基础之Shell基础(二)——Bash的基本功能

视频参考: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'

命令执行时顺序:

  1. 第一顺位执行用绝对路径或相对路径执行的命令。
  2. 第二顺位执行别名。
  3. 第三顺位执行Bash的内部命令。
  4. 第四顺位执行按照$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
发布了18 篇原创文章 · 获赞 0 · 访问量 1741

猜你喜欢

转载自blog.csdn.net/weixin_44159487/article/details/103172542