Linux 学习笔记(二)- Shell 初识


什么是 Shell

之前我一直混淆了几个概念:命令行、脚本、命令解释器、Shell。

从严格意义上讲,命令行指的是供用户输入命令的界面,其本身只是接受输入,然后把命令传递给命令解释器。后者就是 Shell。从本质上讲,Shell 是一个程序,它在用户和操作系统之间提供了一个面向行的可交互接口。用户在命令行中输入命令,运行在后台的 Shell 把命令转换成指令代码发送给操作系统。Shell 提供了很多高级特性,使得用户和操作系统间的交互变得简便和高效。

目前,在 Linux 环境下有几种不同类型的 Shell, 常用的有 Bourne Again Shell(BASH)、TCSH Shell、 Z-Shell 等。不同的 Shell 提供不尽相同的语法和特性,用户可以使用任何一种 Shell。在 Linux 上,BASH shell 是默认安装和使用的 Shell。

在 BASH 中,命令行以 $ 为提示符,表示我们可以开始输入命令了,以 root 身份执行命令时,Shell 提示符号为 #

1
2
3
##[用户名@主机名 目录]提示符 命令
[root@VM-0-13-centos ~]# 登出
[tommy@VM-0-13-centos ~]$ 登出

FYI:Linux 中命令和文件名都是区分大小写的。

小试牛刀

cd /

进入根目录

ls

列出文件和目录

cd home/

进入 /home 目录,home 目录中存放着系统中所有用户的主目录,主目录的名字就是用户名。

cd

不带任何参数的 cd 命令进入当前用户的主目录。用户主目录默认对其他用户关闭访问权限。

cd /etc/

进入 /etc/ 目录,这个目录存放着系统以及绝大部分应用软件的配置文件。

cat fstab

查看 fstab 文件,这个文件定义了各硬盘分区所挂载到的目录路径。(这里我有点儿懵)

命令行补全:Tab 键

  有些命令并不是一个单词,亦或者文件名作为最常见的参数有的名字也很长不容易记住。BASH 提供了一种特性:命令行补全。例如我们输入 ss,然后点击 Tab 键,Shell 会把 ss 开头的命令打印出来,我们也可以继续按 Tab 键进行选择:

1
2
3
$ ss<TAB>
SSH_AUTH_SOCK ssh-add ssh-copy-id ssh-keyscan sso_util
ssh ssh-agent ssh-keygen sshd

  那对于输入文件名的时候,只需要输入前面几个字符,然后按 Tab 键,Shell 会自动把文件名补全,当然这得是对应目录里面存在这个文件,并且只有一个:

1
2
3
4
[tommy@VM-0-13-centos ~]$ cd /etc/
[tommy@VM-0-13-centos etc]$ cat fs<TAB>
#自动补全为:
[tommy@VM-0-13-centos etc]$ cat fscat

  如果以输入的字符开头的文件不止一个,Shell 会列出字符开头的文件列表:(我看有的书上说要按两次 Tab?)

1
2
3
[tommy@VM-0-13-centos etc]$ cat b<TAB>
bash_completion.d/ bashrc bashrc.rpmnew binfmt.d/
...

FYI:系统命令本质上就是一些可执行文件,可以在 /usr/bin/ 目录下找到。从这种意义上讲,命令补全和文件名补全其实是一回事。

通配符:

*

“*” 用于匹配文件名中任意长度的字符串。

1
2
3
4
[tommy@VM-0-13-centos etc]$ ls *.conf
asound.conf libuser.conf sos.conf
chrony.conf locale.conf sudo.conf
...

?

和“/*” 相类似的通配符是“?”。但和“/*” 匹配任意长度的字符串不同,“?” 只匹配一个字符。

1
2
3
4
[tommy@VM-0-13-centos etc]$ ls host?
hosts
[tommy@VM-0-13-centos etc]$ ls host*
host.conf hostname hosts hosts.allow hosts.deny

[]

“[]”用于匹配所有出现在方括号内的字符。

例如,列出以 rp 开头而仅以 c 或 m 结尾的文件名或目录。

1
2
3
4
5
[tommy@VM-0-13-centos etc]$ ls rp[cm]
rpc

rpm:
macros.dist macros.perl

其他用法:ls text[1-3] 列出所有以 text 开头并以 1~3 中某个字符(包括1和3)结束的文件;也可以使用字母范围,在 ASCII 字符集中,A-Z 匹配所有大写字母:ls text[A-C]