术语:在unix中,shell被称为工具(unility)或命令(command)。
关键字:命令,shell
1.1 什么是命令
术语: 命令(command)是一个可以运行的程序。
例:
$ date
产生输出:
2020年 12月 17日 星期四 20:33:40 CST
该命令(date)显示当前日期、时间和年份。
例:
$ who
产生输出:
jianghao :0 2020-12-15 22:45 (:0)
该命令显示了所有正在使用unix系统的人员或用户的一个列表。
第一列为登录的用户名,第二列为登录的终端,第三列为登录的时间。
1.1.1 简单命令
术语: 简单(simple)命令,一条简单的命令只需要在提示符后面输入要执行的命令名(command)即可(按ENTER键执行,美元符“$”为系统提示符)。
$ command
1.1.2 复杂命令
术语: 复杂(complex)命令,是由一条命令和参数列表组成的命令。
例:
who am i
术语: 参数(argument),是命令修饰符,用以改变命令的行为。在本例中命令名是who,参数是am和i。
术语:缺省(default)行为,一条命令在作为简单命令运行时产生的输出。
参数am和i改变了who命令的行为,使它仅列出了自己的信息。在unix中大多数命令可以接受参数来改变他们的行为。
复杂命令语法:
$ command argument1 argument2 argument3 ...argumentN
复合命令
unix的一个强大特征就是能把简单和复杂的命令组合起来形成复合命令。
术语: 复合(compound)命令,由一组被分号”;“隔开的简单和复杂命令的组成。
例:
$ date; who am i;
产生输出:
2020年 12月 17日 星期四 21:06:52 CST
jianghao :0 2020-12-15 22:45 (:0)
在复合命令下不需要在两条命令之间返回到提示符下,直接按顺序执行命令。
复合命令语法:
$ command1; command2; command3 ... commandN
这里的command1 到 commandN 是简单或者复杂命令。按顺序执行到最后一条命令后返回到提示符下。
1.1.4 命令分隔符
术语: 分隔符(separator),分号(;)被看作一个命令分隔符,它指出一条命令的结束和一条命令的结尾。如果命令之间不加分号,则会报错,使用复合命令时候必用分号分隔。
在脚本中常用分号来终止简单或者复杂命令。
1.2 什么是shell
计算机是如何知道用户要运行命令呢?
术语: 计算机通过shll来与用户进行交互。shell提供一个到unix系统的接口,它收集用户的输入,并跟据用户的输入来执行程序。当一个程序运行结束之后,它显示程序的输出。因此,shell也被叫做命令解释器。
shell的真正强大不仅在于是一个命令解释器,还是一个强大的编程语言。有着完整的条件语句、循环和函数。
1.2.1 shell提示符
当显示第一个提示符时,用户可以输入一条命令。shell在用户按Enter后读入该输入。跟据输入的第一个单词来决定要执行的是什么命令。单词是一组无间隔的字符,通常用空格或者tab来分割。
对于shell,用户输入命令如下:
$ word1 word2 word3 ... wordN
shell总是选择word1作为要执行的命令名。如果只有一个单词:
$ date
shell的工作就很容易了,只要执行该命令即可。如果有多个单词:
who am i
shell会把who后面的单词作为参数传递给who。
1.2.2 shell类型
使用不同的shell类型,所显示的提示符是不同的,在UNIX中有两种主要的类型shell:
- Bourne Shell(包括sh,ksh,bash)——提示符:$
- C Shell(包括csh,tcsh) ——提示符:%
Note:
在UNIX中有两类账号:普通用户账号和root账号。普通用户被赋予普通用户账号。root账号是拥有特殊权限的账号,UNIX系统的系统管理员(叫做sysadmin)用其对系统进行维护和升级。
如果用户使用root账号, Bourne和C shell都显示#字符作为提示符,当作为root用户执行命令时要格外小心,因为该命令对整个系统都有影响。
不同的Bourne Shell如下:
- Bourne Shell(sh)
- Korn Shell(ksh)
- Bourne Again Shell(bash)
- POSLX Shell
不同类型的C Shell如下:
- C Shell(csh)
- TENEX/TOPS C Shell(tcsh)
1、Bourne Shell
Bourne Shell特征:
- 进程控制
- 变量
- 正规表达式
- 流控制
- 强大的输入和输出控制
- 函数
所有的Bourne 类型的shell都支持以上的特征。
最初的Bourne Shell的一个重要缺陷是交互使用困难。三个主要缺点是:
- 没有文件名完整功能
- 没用命令历史或命令编辑
- 很难执行多个后台进程或任务。
2、C Shell
主要缺陷:
- 输入和输出控制比较弱
- 缺少函数
- 由于“懒惰”的命令解释器而容易造成语法混乱。
关键发展:
- 命令历史——可以重复执行以前执行的命令,在重新执行前还可以编辑命令。
- 别名——可以为一条命令创建一个短的别名。别名是Bourne Shell函数的一种简化形式。
- 文件命完整——可以只输入文件名的几个字符而让C Shell自动完整文件名。
- 任务控制—— C Shell可以让用户使用job命令执行多个进程并对其进行控制。
C Shell在多数机器上通常安装在/bin/csh下。
3、Korn Shell
Bourne Shell使用来编程的而C Shell用于交互式使用。为了改变这种状况,则产生了Korn Shell,即ksh,把C Shell中所有交互式特征移入Bourne Shell的语法中。因此,Korn Shell受到了用户的喜爱。
ksh通常被安装在/bin/ksh或/usr/bin/ksh下。
ksh通常被认为与sh完全兼容,但其中一些区别使脚本并不能正确实现功能。
Korn Shell带给Bourne Shell的一些额外特征:
- 命令历史和历史替换
- 命令别名和函数
- 文件名完整
- 数组
- 内置的整数运算
还有三种主要的ksh版本可供使用:
- Official版(ksh)
- Public Domain版(pdksh)
- Desktop版本(dtksh)
对于程序员来说,Official版和Public Domain版的ksh之间没有区别——在一个版本下能运行的所有脚本在另一个版本下也能运行。
4、Bourne Again Shell
Bourne Again Shell,即bash,是作为GNU工程的一部分开发的,它已在Linux这样的基于GNU的系统中取代了Bourne Shell。所有主要的Linux产品,包括Red Hat、Slackware和Caldera,都用bash代替了sh。
bash仍然保留了Bounre Shell的语法兼容,于是可以运行几乎所有的Bourne Shell脚本。(bash很容易移植,一般安装在/bin/bash中)
bash中的一些Korn Shell所没有的特征如下:
- 对变量名、用户名、主机名、命令和文件名的名字完整功能
- cd命令中的路径名拼写修改
- 无大小限制的数组。
- 2~64之间任何进制的整数运算