什么是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 | !/bin/bash |
这个脚本中,第一行的 #! 是一个约定的标记,告诉系统这个脚本需要什么解释器来执行,以及解释器的位置在哪里;第二行 # 开头表示注释;第三行的 echo 命令向标准输出文件输出文本。
下面我们来执行一下这个小脚本。在脚本所在位置打开 cmder ,输入 bash ,进入 bash 界面,输入 ./test.sh
执行脚本,接下来就可以看到输出。
在一些参考文章中,执行前需要使用命令 chmod +x ./test.sh
添加执行权限,但我在 cmder 中执行时不用添加也能执行。
上图中 ./
表示当前目录,整条命令的意思是执行当前目录下的 test.sh 脚本。如果不写./
,Linux 会到系统路径(由 PATH 环境变量指定)下查找 test.sh,而系统路径下显然不存在这个脚本,所以会执行失败。
此外,还可以使用 source test.sh
来运行这个脚本。
或者 . test.sh
(注意点和文件之间有空格)
以上两种方法等价,source
是 Shell 内置命令的一种,它会读取脚本文件中的代码,并依次执行所有语句。你也可以理解为,source
命令会强制执行脚本文件中的全部命令,而忽略脚本文件的权限。其中 . test.sh
是它的简写。
执行第二个 shell 脚本
再写一个 shell 脚本 test2.sh:
1 | !/bin/bash |
从第三行开始说起,read
命令用来从标准输入文件(Standard Input,stdin,一般就是指键盘)读取用户输入的数据。所以这行代码的意义是读取输入内容并赋值给 name
,第四行表示输出变量内容,变量前要加 $ 。