1、shell的历史
shell起源于古老的Unix系统。
1964年,美国的AT&T公司的贝尔实验室、麻省理工学院MIIT和美国通用电气,共同研发一套可在大型机上运行的“多用户、多任务”操作系统,
Multics(MULTiplexed Information and Computing System),结果无疾而终。
后来(1969,1970),参与其中的:肯·汤普森(Kenneth Lane Thompson)和丹尼斯·里奇(Dennis MacAlistair Ritchie) 启动了另外一个”多用户、多任务“的
操作系统项目,称之为”UNICS“(Uniplexed Information and Computing System)。后来,人们取其谐音,把该项目称之为UNIX。
最初的UNIX由汇编语言编写,因此移植性很差,于是,1973年,汤普森和里奇使用C语言重写了UNIX。通过这次编写,使得UNIX可以移植到其他小型机上。
1979年,第一个重要的标准UNIX Shell在1979年年末在UNIX的第七版中推出。作者是史蒂夫·伯恩(Stephen Bourne),因此称之为 Bourne Shell。
shell顾名思义,壳。在UNIX以及Linux中,shell就是套装操作系统内核外面的一层壳。
shell称之为命令解析器,它能够识别用户输入的各种命令,并传递给操作系统。
2、shell的分类
Bourne Shell:sh
Bourne-Again Shell: Bash
Korn Shell:ksh
C Shell:csh
。。。。。。
3、作为程序设计语言的shell
shell的角色:
a、充当用户与UNIX或Linux交互的角色
b、可以作为一种程序设计语言
shell脚本程序可分为两种:
a、交互式:用户可以依次输入一些列命令,交互式的执行它们;
b、脚本式:将多个shell命令写在一个脚本文件中执行
4、向shell脚本传递参数
常用的与参数传递相关的系统变量
变量名 | 说明 |
$n | 表示传递给脚本的第n个参数,n从1开始 |
$# | 命令行参数的个数 |
$0 | 当前脚本的名称 |
$* | 以”参数1 参数2 参数3.。。。“的形式返回所有参数的值。所有参数作为一个字符串 |
$@ | 以”参数1“ ”参数2“ ”参数3“ 。。。的形式返回所有参数 |
$_ | 保存之前执行的命令的最后一个参数 |
$? | 最后一条命令的退出状态 |
$$ | shell的进程id。PID |
5、第一个shell程序。世界的问候:Hello,Bash Shell
#! /bin/bash
#print string
echo "Hello. Bash Shell!"
shell脚本的组成:
a、指定命令的解释器
b、注释
c、可执行语句
当用户在命令行中执行一个脚本的时候,shell会首先判断用户是否拥有该程序的执行权限。
如果没有,shell会给出“Permission Denied”的提示;
如果有,shell会创建一个新的进程,解释并执行shell程序中的语句。
6、如何执行shell程序
三种方法:
a、授权给用户该脚本程序的执行权限,使得程序能够直接执行。./***.sh
b、通过调用shell脚本解释器来执行。 /bin/sh ***.sh
c、通过source命令来执行。source ./***.sh
前两种方法a、b本质是一样的,shell会创建子进程来执行shell文件。
a需要将脚本设置为可执行权限,b手动指定shell脚本的解析器。
第三种方法与前两者的区别在于:简单的读取脚本里的语句,并且依次在当前shell里面执行,并不会创建子shell进程。
6、shell脚本的退出状态
在Unix和Linux中,每个命定都会返回一个退出状态码,退出状态码是一个0~255的整数。
通常情况下,成功返回0,失败返回非0值。
shell脚本中的函数和脚本本身也会返回退出状态码,其状态码由函数或脚本中最后一条命令决定。
另外,用户也可以通过“exit”语句来指定退出状态码传递给shell。
shell中,系统变量“$?”保存了最后一条命令的退出状态。