侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 747 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Linux基础(6)之bash的基础特性

zze
zze
2019-09-20 / 0 评论 / 0 点赞 / 529 阅读 / 3926 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

补全

命令补全

一次 TAB:如果用户给定的字符串只有一条唯一对应的命令,一次 TAB 则直接补全。
两次 TAB:如果用户给定的字符串开头对应的命令不唯一,再次 TAB 则会显示所有以该字符串开头的命令。

路径补全

把用户给定的字符串当做路径开头,并在其指定目录下搜索以指定字符串开头的文件名。如果唯一,则直接补全,否则再次 TAB 显示列表。

命令行展开

展开为当前用户主目录

[root@zze testdir]# cd ~
[root@zze ~]# 

展开指定用户的家目录

[root@zze testdir]# cd ~root/
[root@zze ~]# 

路径展开

{} 可承载一个逗号分隔的列表,并将其展开为多个路径。

/tmp/{a,b} -> /tmp/a , /tmp/b
/tmp/{a,b}/c -> /tmp/a/c , /tmp/b/c

练习

如何一次性创建 'tmp/x/y1' , 'tmp/x/y2' , 'tmp/x/y1/a' , 'tmp/x/y1/b' , 'tmp/x/y2/a' , 'tmp/x/y2/b' ?

[root@zze testdir]# mkdir -p tmp/x/{y1,y2}/{a,b}
[root@zze testdir]# tree tmp/
tmp/
└── x
    ├── y1
    │   ├── a
    │   └── b
    └── y2
        ├── a
        └── b
directories, 0 files

如何一次性创建 'x_m' , 'y_m' , 'x_n' , 'y_n' ?

[root@zze testdir]# mkdir -p {x,y}_{m,n}
[root@zze testdir]# ls
x_m  x_n  y_m  y_n

如何一次性创建 'tmp/bin' , 'tmp/sbin' , 'tmp/usr/bin' , 'tmp/usr/sbin' ?

[root@zze testdir]# mkdir -p tmp/{bin,sbin,usr/{bin,sbin}}
[root@zze testdir]# tree tmp
tmp
├── bin
├── sbin
└── usr
    ├── bin
    └── sbin
directories, 0 files

命令的执行状态结果

bash 使用特殊变量 $? 保存最近一条命令的执行状态结果:

[root@zze ~]# ls /~
ls: cannot access /~: No such file or directory
[root@zze ~]# echo $?
2

0:成功,1-255:失败
程序执行有两类结果,执行的返回值结果和执行的状态结果。

命令别名

命令别名主要通过 alias 实现,看如下示例:

alias cdnet='cd /etc/sysconfig/network-scripts'

上述命令就是新建了一个名为 cdnet 的别名,新建完成之后执行 cdnet 命令就相当于执行 cd /etc/sysconfig/network-scripts
alias 命令不指定参数时默认显示当前会话中所有已经存在的别名信息,如下:

root@zze-pc:~# alias
alias cdnet='cd /etc/sysconfig/network-scripts'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
alias mv='mv -i'

注意:上述别名的定义默认只对当前 shell 会话进程有效。
如果想要永久生效,则需要定义在配置文件中。在 ~/.bashrc 中配置仅对当前用户有效;在 /etc/bashrc 中配置则对所有用户有效。如果想要撤销别名,则可通过 unalias 命令,如:

unalias cdnet

上述命令就是撤销当前会话中名为 cdnet 的别名。同理,如果是定义在配置文件中的别名,需要在配置文件中删除对应的定义。还可以制定选项直接删除当前会话中所有别名信息,如下:

unalias -a

看如下情形,如果当前会话中定义了一个如下别名:

alias cp='cp -i'

即别名名称和命令原名称有冲突,如果我们需要单纯的执行 cp 指令,则只需要在指令前加上 \ 就会执行命令本身而不会执行别名对应的命令,所以使用 \cp 就可以满足我们的要求。

glob文件名通配

glob 在 bash 中用于实现文件名“通配”,它的使用则需要借助到几个通配符,看如下示例:
先新建如下几个文件:

touch abc abbc abbd bbbc a1b

使用 * 号匹配任意长度的字符

列出所有以 a 开头的文件名:

root@zze-pc:~/temp# ls a*
a1b  abbc  abbd  abc

使用 ? 匹配任意单个字符

列出以 a 开头且长度为 3 个字符的文件名:

root@zze-pc:~/temp# ls a??
a1b  abc

使用 [] 匹配指定范围内的单个字符

列出以 a 开头且第二个字符为一个数字的文件名:

root@zze-pc:~/temp# ls a[0-9]*
a1b

使用 [^] 范围取反

列出第二个字符不是数字的文件名:

root@zze-pc:~/temp# ls ?[^0-9]*
abbc  abbd  abc  bbbc

除了上述方式 glob 还提供了专用字符集合的方式来匹配,如下: 

[:digit:]:任意数字,相当于 0-9 
[:lower:]:任意小写字母
[:upper:]:任意大写字母
[:alpha:]:任意大小写字母
[:alnum:]:任意数字或字母
[:space:]:空格字符
[:punct:]:所有标点符号
[:graph:]:图片、图形
[:print:]:可打印字符
[:xdigit:]:十六进制字符
[:cntrl:]:控制符
0

评论区