初识shell

什么是shell?

shell 的中文含义是壳,与 Kernel (核)对应。

早期计算机系统没有图形界面,要想操作计算机非常困难,需要记忆大量的命令,那个时候的计算机只有专业人员才能使用。

后来,为了方便非专业人员使用计算机,人们开发了图形界面工具以及命令行工具,这些工具的普及把人们从繁琐复杂命令中解脱出来,计算机也从高端实验室进入了千家万户。

不管是图形界面还是命令行,它们的目的都是一样的,都是让用户来控制计算机。然而,真正能控制计算机硬件的只有内核(Kernel ),但出于安全、复杂、繁琐的考虑,用户不能直接接触内核,因此,需要在用户和内核之间需要设置一个中间层对用户操作进行代理,让用户间接操控内核,图形界面和命令行就是这个中间层。在图形界面中我们通过点点点的方式来控制计算机,在命令行中以各种命令来控制。

在 Linux 系统中,这个命令行工具叫 shell ,套在核外面的一层壳。

shell 本身是个应用程序(壳程序),它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地的使用 Linux 内核,这就是 shell 本质。

shell 的种类

与Windows、Mac OS 不一样,它们由一家公司开发,核心软件和基础库都由一家公司做决定,容易形成统一标准,一般不会开发多款功能类似的软件。但 Linux 不是这样的,它由不同的组织机构共同开发,不同的组织机构为了发展自己的 Linux 分支可能会开发出功能类似的软件,shell 就是这样一款软件。不同的组织机构开发的不同 shell 各有所长,常见的 shell 有 sh、bash、csh、tcsh、ash等。

sh :sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne 开发,为了纪念他,就以他的名字命名了。这款 shell 是 UNIX 上的标准 shell,也是第一个流行的 shell。

csh : csh 是 sh 之后另一个广为流传的 shell,这款 shell 的语法有点类似 C 语言,所以才得名 C shell,简称 csh。它的设计者 Bill Joy 同时也是 vi 编辑器的开发者。

bash : bash 全称 Bourne Again shell,是 Linux 的默认 shell 。

ash : ash 是一款简单的轻量级 shell,占用资源少,适合运行低内存环境,与 bash 完全兼容。

执行第一个 shell 脚本

先编写第一个 shell 脚本 test.sh。

1
2
3
#!/bin/bash
#这是一个shell测试文件
echo "hello world"

这个脚本中,第一行的 #! 是一个约定的标记,告诉系统这个脚本需要什么解释器来执行,以及解释器的位置在哪里;第二行 # 开头表示注释;第三行的 echo 命令向标准输出文件输出文本。

下面我们来执行一下这个小脚本。在脚本所在位置打开 cmder ,输入 bash ,进入 bash 界面,输入 ./test.sh 执行脚本,接下来就可以看到输出。

1565754740334

在一些参考文章中,执行前需要使用命令 chmod +x ./test.sh 添加执行权限,但我在 cmder 中执行时不用添加也能执行。

上图中 ./ 表示当前目录,整条命令的意思是执行当前目录下的 test.sh 脚本。如果不写./,Linux 会到系统路径(由 PATH 环境变量指定)下查找 test.sh,而系统路径下显然不存在这个脚本,所以会执行失败。

此外,还可以使用 source test.sh 来运行这个脚本。

1565754455208

或者 . test.sh (注意点和文件之间有空格)

1565754570074

以上两种方法等价,source 是 Shell 内置命令的一种,它会读取脚本文件中的代码,并依次执行所有语句。你也可以理解为,source 命令会强制执行脚本文件中的全部命令,而忽略脚本文件的权限。其中 . test.sh 是它的简写。

执行第二个 shell 脚本

再写一个 shell 脚本 test2.sh:

1
2
3
4
#!/bin/bash
echo "What is your name?"
read name
echo "Hello, $name" #注意双引号

从第三行开始说起,read 命令用来从标准输入文件(Standard Input,stdin,一般就是指键盘)读取用户输入的数据。所以这行代码的意义是读取输入内容并赋值给 name ,第四行表示输出变量内容,变量前要加 $ 。

带我飞