06-bash基础特性
06-bash基础特性

06-bash基础特性

1.命令历史

shell进程会在其会话中保存此前用户提交过的执行过的命令

  • ~]# history

    • 可定制history的功能,通过环境变量实现

    • HISTSIZE: shell进程可保留的历史命令的条数

    • HISRFILE: 持久保存命令历史的文件

      • cat .bash_history
    • HISTFILESIZE: 命令历史文件的大小

  • 命令用法:

    • history [-c] [-d 偏移量][n]
    • history -anrw [文件名]
    • history -ps 参数[参数...]
    • -c: 清空命令历史
    • -d offset: 删除指定历史命令
    • -r:从文件读取命令历史至历史列表中
    • -w:把历史列表中的命令追加至历史文件中
    • history #:显示最近的#条命令
  • 调用命令历史列表中的命令:

    • !#: 再一次执行历史列表中的第#条命令
    • !!:再一次执行上一条命令
    • !STRING:再一次执行命令历史列表中最近一个以STRING开头的命令
    • 注意:命令的重复执行有时候需要依赖于幂等性;
  • 调用上一条命令的最后一个参数

    • 快捷键:ESC+.
    • 字符串:!$
  • 控制命令历史记录的方式:

    • 环境变量: HISTCONTROL

    • echo $HISTCONTROL

    • ignoredups:忽略重复的命令

    • ignorespace:忽略以空白字符开头的命令

    • 以上两者同时生效

    • 修改变量的值(只对当前shell有效):

    • NAME='VALUE'

ubuntu@VM-0-6-ubuntu:~$ help history
history: history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 参数 [参数...]
    显示或操纵历史列表。

    带行号显示历史列表,将每个被修改的条目加上 "*" 前缀。
    参数 N 会仅列出最后的 N 个条目。

    选项:
      -c        删除所有条目从而清空历史列表
      -d 偏移量 删除位于 <偏移量> 的历史条目。负的 <偏移量> 表示从
                历史列表末尾开始倒数

      -a        将当前会话的历史追加到历史文件中
      -n        从历史文件中读取所有未被读取的行,并且将它们追加到历史列表
      -r        读取历史文件并将内容追加到历史列表中
      -w        将当前历史写入到历史文件中

      -p        对每一个 <参数> 执行历史展开并显示结果,而不存储到历史列表中
      -s        将 <参数> 作为单一条目追加到历史列表中

    如果给定了 <文件名>,则将其用作历史文件。否则,如果 HISTFILE 变量
    有值的话,则使用它,否则使用 ~/.bash_history 文件。

    如果 HISTTIMEFORMAT 变量被设定并且不为空,它的值会被用作 strftime(3)
    的格式字符串,以打印每个显示的历史条目的时间戳。否则,不打印时间戳。

    退出状态:
    返回成功,除非使用了无效的选项,或者有错误发生。

2.命令补全

shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当做命令

命令查找机制:

  1. 查找内部命令;
  2. 根据path环境变量中设定的目录,自左而右逐个搜索目录下的文件名echo $PATH
  3. 给定的打头字符串如果能唯一标识某命令程序文件,则直接补全,如果不能唯一标识:再击一次tab键,会给出列表;

路径补全:

  1. 在给定的起始路径下,以对应路径下的打头字符串来注意匹配路径下的每个文件
  2. 如果能唯一表示,则直接补全;
  3. 否则,再一次tab,给出列表;

3.目录管理类的命令

  • mkdir: make directory
    • 创建文件夹
    • 注意:路径基名方为作用对象;基名之前的路径必须得存在
    • -p/-pv按需创建基名,自动创建目录
    • -m创建目录时直接给定权限,否则为默认权限
    • image-20230308163458997
  • rmdir:remove empty directories
    • 删除空目录(用的不多)
    • -p:删除某目录后,如果其父母类为空,则一并删除之
    • -v:显示过程

4.命令行展开

  • ~: 自动展开为用户的家目录,或指定的用户的家目录;
  • {}: 可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;
    • 例如: /tmp/{a,b} 相当于 /tmp/a, /tmp/b
    • image-20230308164737284

5.命令的执行状态结果

  • 命令执行的状态结果:

    • bash通过状态返回值来输出结果:
    • 成功: 0
    • 失败: 1~255
    • 命令执行完成之后,其状态返回值保存于bash的特殊变量$?
    • image-20230308165914834
  • 命令正常执行时,有点还返回有命令返回值;

    • 根据命令及其功能不同,结果各不相同
  • 引用命令的执行结果:

    • $(COMMAND)

    • COMMAND
    • image-20230308170654959

6.bash的基础特性:引用

强引用: ''

弱引用:""

命令引用: ``

7.bash的基础特性:快捷键

  • Ctrl+a 跳转至命令行首(类似Home键)
  • Ctrl+e 跳转至命令行首(类似End键)
  • Ctrl+u:删除行首至光标所在处之间的所有字符
  • Ctrl+k:删除光标所在处至行尾的所有字符
  • Ctrl+l: 清屏 相当于clear

8.文本文件查看类命令

  • cat, tac, head, tail, more, less

  • 分屏查看命令 more和less

    • more FILE
    • 特点:翻屏至文件尾部后自动退出
    • less FILE
  • head -n # FILE

    • 查看文件的前#行
  • tail -n # FILE

    • 查看文件的后#行
  • tail -f # FILE

    • 查看文件尾部内容结束后不退出,跟随显示新增的行
  • stat命令

    • stat FILE

    • 文件:两类数据

    • 源数据:metadata

    • 数据:data

    • 时间戳:

    ubuntu@VM-0-6-ubuntu:~/workspace/VisaLogin$ stat README.md
      文件:README.md
      大小:1329            块:8          IO 块大小:4096   普通文件
    设备:fc02h/64514d      Inode:657972      硬链接:1
    权限:(0644/-rw-r--r--)  Uid: ( 1000/  ubuntu)   Gid: ( 1000/  ubuntu)
    访问时间:2023-01-28 20:54:18.417136318 +0800
    修改时间:2022-12-08 18:46:56.000000000 +0800
    变更时间:2023-01-28 20:54:18.357136036 +0800
    创建时间:2023-01-12 00:37:59.029048900 +0800
  • touch命令

    • touch 更改文件时间戳

    • touch [OPTION]... FILE...

    • -c: 指定的文件路径不存在时不创建文件路径(默认是创建的)

    • -a:仅修改访问时间

    • -m:仅修改修改时间

    • -t: 更改为指定时间【2002-12-01 03:03:03 --> 0212010303.03】

      [lemon@VM-4-10-centos VisaLogin]$ touch -m -t 0212010303.03 README.md
      [lemon@VM-4-10-centos VisaLogin]$ stat README.md
      文件:"README.md"
      大小:1329            块:8          IO 块:4096   普通文件
      设备:fd01h/64769d      Inode:1193578     硬链接:1
      权限:(0664/-rw-rw-r--)  Uid:( 1003/   lemon)   Gid:( 1003/   lemon)
      环境:system_u:object_r:unlabeled_t:s0
      最近访问:2022-12-15 14:26:57.115707201 +0800
      最近更改:2002-12-01 03:03:03.000000000 +0800
      最近改动:2023-03-10 16:23:12.691044194 +0800
      创建时间:-

9.文件管理工具:cp, mv, rm

cp命令 copy

  • 单源复制: cp [OPTION]... [-T] SOURCE DEST
  • 多源复制:
    • cp [OPTION]... SOURCE... DIRECTORY
    • cp [OPTION]... -t DIRECTORY SOURCE...
  • 单源复制:cp [OPTION]... [-T] SOURCE DEST
    • 如果DEST不存在,则实现创建此文件并复制源文件的数据流至DEST中
    • 如果DEST存在:
    • 如果DEST是非目录文件,则覆盖目标文件
    • 如果DEST是目录文件:则先在DEST目录下创建一个源文件同名的文件,并复制其数据流;
  • 多源复制:
    • cp [OPTION]... SOURCE... DIRECTORY
    • cp [OPTION]... -t DIRECTORY SOURCE...
    • 如果DEST不存在,错误
    • 如果DEST存在:
    • 如果DEST是非目录文件,错误
    • 如果DEST是目录文件:分别复制每个文件至目标目录中,并保持原名
  • 常用选项:
    • -i: 交互式复制,即覆盖之前提醒用户确认;
    • -f:强制覆盖目标文件
    • -r, -R:递归复制目录
    • -d:复制符号链接文件本身,而非指向的源文件
    • -a: -dr --preserve=all, archive,用户实现归档
    • --preserve==
    • mode:权限
    • ownership:属主和属组
    • timestamps:时间戳
    • context:安全标签
    • xattr:扩展属性
    • links:符号链接
    • all: 上述所有属性

mv命令:move

mv [OPTION]... [-T] SOURCE DEST

mv [OPTION]... SOURCE... DIRECTORY

mv [OPTION]... -t DIRECTORY SOURCE...

  • 常用选项:
    • -i:交互式
    • -f:force

rm命令:remove

rm [OPTION]... FILE...

常用选项:

  • -i:interactive
  • -f:force
  • -r:recursive

注意:所有不用的文件建议不要直接删除,而是移动到某个专业目录(回收站)

10.变量

命名的内存空间:变量是在程序当中快捷的去引用一段内存空间,在其中实现数据存储的机制

变量类型:

  • 字符型
  • 数值型
    • 精确数值:
    • 近似数值
  • 存储格式、数据范围、参与运算

11.globbing

文件名通配(整体文件名匹配,而非部分)

匹配模式:元字符

  • *: 匹配任意长度的任意字符
    • pa*,*pa*,*pa,*p*a*
  • ?: 匹配任意单个字符
    • pa?,??pa,p?a,p?a?
  • []: 匹配指定范围内的任意单个字符
    • 有几种特殊格式:
    • [a-z], [A-Z],[0-9],[a-z0-9]
    • [abcxyz] 取其一
    • [[:upper:]] 所有大写字母
    • [[:lower:]] 所有小写字母
    • [[:alpha:]] 所有字母
    • [[:digit:]] 所有数字
    • [[:space:]] 所有空白字母
    • [[:punct:]] 所有标点符号
  • [^]: 匹配指定范围外的任意单个字符
    • 匹配非大写字母:[^[:upper:]]
    • 匹配非数字:[^0-9]

练习1:显示/var目录所有以1开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录

[root@VM-4-10-centos ~]# touch /var/1asxsasdxas
[root@VM-4-10-centos ~]#  ll /var/1*?*[[:lower:]]
-rw-r--r--. 1 root root 0 4月  11 19:52 /var/1asxsasdxas
[root@VM-4-10-centos ~]# ll /var/1?[[:lower:]]
ls: 无法访问/var/1?[[:lower:]]: 没有那个文件或目录
[root@VM-4-10-centos ~]#

练习2:显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录;

[root@VM-4-10-centos ~]# ll /etc/[0-9]*[^[:digit:]]
-rw-r--r--. 1 root  root     0 4月  11 20:07 /etc/1233d
-rw-r--r--. 1 root  root     0 4月  11 20:07 /etc/1233f
-rw-r-----. 1 redis root 46724 11月 17 01:00 /etc/6370.conf

# ls -d /etc/[0-9]*[^0-9]

练习3:显示/etc目录下,以非字母开头,后面跟一个字母及其他任意长度任意字符的文件或目录;

[root@VM-4-10-centos ~]# ll /etc/[^[:alpha:]][[:alpha:]]*
-rw-r--r--. 1 root root 0 4月  11 20:07 /etc/1w3

# ls -d /etc/[^a-z][a-z]*

练习4:复制/etc目录下,所有以m开头,以非数字结尾的文件或目录值/tmp/magedu.com目录下;

mkdir /tmp/magedu.com
cp -r /etc/m*[^0-9] /tmp/magedu.com

练习5:复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man/目录下;

[lemon@VM-4-10-centos ~]$ ls -d /usr/share/man/man[0-9]
/usr/share/man/man1  /usr/share/man/man3  /usr/share/man/man5  /usr/share/man/man7  /usr/share/man/man9
/usr/share/man/man2  /usr/share/man/man4  /usr/share/man/man6  /usr/share/man/man8
[lemon@VM-4-10-centos ~]$ mkdir /tmp/man/
[lemon@VM-4-10-centos ~]$ cp -r /usr/share/man/man[0-9] /tmp/man/
[lemon@VM-4-10-centos ~]$ ls /tmp/man/
man1  man2  man3  man4  man5  man6  man7  man8  man9
[lemon@VM-4-10-centos ~]$ du -sh /tmp/man
55M     /tmp/man

练习6:复制/etc目录下,所有以.conf结尾且以m,n,r,p开头的文件或目录值/tmp/conf.d/目录下;

mkdir /tmp/conf.d
ls -d /etc/[mnrp]*.conf
cp -r /etc/[mnrp]*.conf /tmp/conf.d

12. IO重定向及管道

程序:指令+数据

程序:IO

可用于输入的设备:文件

  • 键盘设备、文件系统上的常规文件、网卡等

可用于输出的设备:文件

  • 显示器、文件系统上的常规文件、网卡等

程序的数据流有三种:

  • 输入的数据流: <-- 标准输入(stdin), 键盘;
  • 输出的数据流: --> 标准输出(stdout),显示器;
  • 错误的输出流: --> 错误输出(stderr), 显示器;

fd: file descriptor,文件描述符

  • 标准输入: 0
  • 标准输出: 1
  • 错误输出: 2

IO重定向:

输出重定向

输出重定向:>

  • 特性:覆盖输出

输出重定向:>>

  • 特性:追加输出,不覆盖

SET -C命令:

  • 禁止覆盖输出重定向至已存在的文件
  • 此时可使用枪支覆盖输出:>|
  • 仅对当前shell有效

SET +C命令:

  • 关闭上述特性

以上重定向仅支持标准输出,错误输出不会被重定向

错误输出重定向:2>2>>

  • 仅支持错误输出重定向

合并正常输出流和错误输出流:

  1. &>,&>>

  2. COMMAND > /path/to/somefile 2>&1

    COMMAND >> /path/to/somefile 2>&1

特殊设备: /dev/null,数据黑洞,假文件,进去就没了

输入重定向

命令:<

[rhino@rhino010 lxc]$ cat
ni
ni
shi
shi
sha
sha
bi
bi
^C
[rhino@rhino010 lxc]$ cat < t.py
import os
from os.path import dirname, abspath

path = dirname(abspath(__file__)) + os.sep + 'js' + os.sep
print(path)

tr命令

  • tr [OPTION]... SET1 [SET2]

  • 把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符

  • 用法1:

    tr SET1 SET2 < /PATH/FROM/SOMEFILE

  • 用法2:

    tr -d SET1 /PATH/FROM/SOMEFILE

  • 注意:不修改原文件

image-20230412172109981

Here DocumentL : <<

将EOF定义为结束符

cat << EOF

cat > /path/to/somefile << EOF

管道

作用:连接程序,实现将前一个命令的输出,直接定向给后一个程序当作输入数据流

COMMAND1 | COMMAND2 | COMMAND3 | ...

tee 命令:

  • tee命令的作用就是读取标准输入内容,将读取到的数据写到标准输出和文件。应用场景一就是有时候我们希望操作命令既显示到屏幕又保存到文档,tee命令是我们的不二选择;应用场景二是重复展示输入内容;应用场景三是可以将文件同时复制多份。当然tee命令还可以与其他命令结合使用,组合达到我们期待的效果。

  • COMMAND | tee /path/to/somefile

[lemon@VM-4-10-centos ~]$ cat /etc/issue
\S
Kernel \r on an \m

[lemon@VM-4-10-centos ~]$ cat /etc/issue | tr 'a-z' 'A-Z'
\S
KERNEL \R ON AN \M

练习1:把etc/passwd文件的前六行信息转换为大写字符后输出

[lemon@VM-4-10-centos ~]$ tail -n 6 /etc/passwd | tr 'a-z' 'A-Z'
MYSQL:X:1001:1001::/HOME/MYSQL:/SBIN/NOLOGIN
LIGHTHOUSE:X:1002:1002::/HOME/LIGHTHOUSE:/BIN/BASH
LEMON:X:1003:1003::/HOME/LEMON:/BIN/BASH
TSS:X:59:59:ACCOUNT USED BY THE TROUSERS PACKAGE TO SANDBOX THE TCSD DAEMON:/DEV/NULL:/SBIN/NOLOGIN
REDIS:X:995:990:REDIS DATABASE SERVER:/VAR/LIB/REDIS:/SBIN/NOLOGIN
X:X:1004:1004::/HOME/X:/BIN/BASH

# head -n 6 /etc/passwd | tr 'a-z' 'A-Z'

发表回复

您的电子邮箱地址不会被公开。