shell的定义
Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。shell是人与内核交互的程序接口,人通过程序接口发出指令,通知内核kernel,让硬件进行作业。
Shell执行命令的方式
- 交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。
- 批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。
shell的种类
- /bin/sh:sh 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。
- /bin/bash:bash由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的缩写,是Linux标准默认的shell。它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。
- /bin/ash:ash shell 是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令。
- /bin/tcsh:csh是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。
- /bin/ksh:ksh 是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。
/bin/bash的简介
大多数linux系统默认使用的就是/bin/bash这个shell。
功能简介:
- 命令记忆功能
登陆后,输入的命令暂时记录再内存中,当关机后,存储在当前用户主目录的.bash_history。最多能记录1000条命令。
注:只有当正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中。
格式:
- 命令和文件名补全和查看功能
按tab键 一下或者两下 - 命令别名设置功能
命令: alias
- 通配符功能
- 进行前后台切换
- 编程语言功能
shell支持编程语言的功能。如变量,分支,循环,数组等编程语法。
变量类型
- 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。 - 环境变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。( 使用 env、export、set三个命令可查看环境变量) - shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
变量的命名规则
- 可以使用英文字母,数字,下划线
- 首个字符必须为字母
- 变量名通常大写
- 不能使用空格,其他符号
- 不能使用bash中的关键字(可用help命令查看保留关键字)
变量的使用规则
- 没有类型区别,直接写变量名。
- 使用"=“赋值,但是”="前后不能有空格
- 必须使用 $ 连接变量名。
- 方式两种:$变量名 和 ${变量名}
- 已定义的变量可以被重新定义(使用 readonly 命令定义的变量除外)
例:
只读变量和删除变量
只读变量
使用readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
格式:readonly [变量名]
例:
说明:未使用readonly定义前的变量可以重定义,并且修改对应值,使用readonly定义之后的变量,不能对其进行修改。
删除变量
使用 unset 命令可以删除变量。
格式:unset [变量名]
注意:只读变量不能被删除
例:
说明:使用readonly定义的可读变量,不能被unset删除
环境变量
shell环境变量是所有shell程序都会接收的参数,shell程序运行时,都会接收一组变量,这组变量就是环境变量。
使用 env、export、set三个命令查看环境变量
常见的环境变量:
- PATH:就是可执行文件搜寻的路径,目录与目录中间以冒号(:)分隔,包含一系列路径名
- HOME:代表使用者的主文件夹,用户home的路径名,也是cd命令的默认参数
- HISTSIZE:命令历史文件中最多包含的命令条数
- SHELL:shell的路径名,即linux当前正在使用的shell
PS1命令的应用
-
参数说明:
\d :可显示出“星期 月 日”的日期格式,
\H :完整的主机名称。
\h :仅取主机名称在第一个小数点之前的名字
\t :显示时间,为 24 小时格式的“HH:MM:SS”
\T :显示时间,为 12 小时格式的“HH:MM:SS”
\A :显示时间,为 24 小时格式的“HH:MM”
@ :显示时间,为 12 小时格式的“am/pm”样式
\u :目前使用者的帐号名称
\v :BASH 的版本信息
\w :完整的工作目录名称,由根目录写起的目录名称。但主文件夹会以 ~ 取代;
\W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。
# :下达的第几个指令。
$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ -
示例:
环境变量与自定义变量的区别
父子进程
当你登录linux并取得一个bash之后,你的bash就是一个独立的进程。接下来你在这个bash下面所执行的任何命令都是由这个bash所衍生出来的。那些被执行的命令都被称为子进程。
子进程仅会继承父进程的环境变量,不会继承父进程的自定义变量。
区别
该变量能否被子进程所引用。
环境变量
进入个人配置信息文件
配置环境变量
查看环境变量是否生效??
如果此时在配置文件中,更改信息,不会立即生效,需要重新打开shell窗口。如果不想切换窗口,可以使用 source命令或者是. 命令来使之生效
格式:source filename/ . filename
自定义变量
声明并赋值的自定义变量,在当前shell环境下,可以使用;当bash之后进入子进程之后,变量不生效。
如果需要自定义变量在子进程中依然生效,可以使用export命令
格式:export 自定义变量
使用export在shell命令行下修改的自定义变量,对当前的shell或其子shell有效,并且修改后的shell关闭后,变量就失效了,再打开新的shell时就没有这个变量
shell环境配置
当使用命令提示符界面,或者是远程终端时,输入正确的用户名和密码后,会自动获取默认的bash环境(读取相应的配置信息),从而得到工作环境
配置信息
- 系统配置信息
/etc/profile 通常不对这个文件进行设置。 - 用户配置信息
~/.bash_profile
~/.bashrc
shell环境
根据登陆后使用的bash环境读取的配置文件不同而不同。分两类:
-
login shell环境
一定是经过输入用户名和密码后登录获取的bash环境在输入密码回车后,会先读取系统配置文件/etc/profile,根据用户id来决定是否要加载sbin下的命令。
继续读取 /etc/profile.d/里面的多个脚本,加载系统配置信息。
之后会读取个人配置信息(~/.bash_profile) -
non-login shell环境
从图形化界面进入终端界面,此时获取的bash环境称之为 non-login shell环境
会直接读取个人配置信息 (~/.bashrc),根据条件加载/etc/bashrc.
shell特殊变量
shell脚本语言与编译型语言的差异
解释型语言(shell脚本语言)
解释型语言也被称作“脚本编程语言”。执行这类程序时,源代码(source code)不是直接翻译成机器语言,而是先翻译成中间代码(object code),再由解释器对中间代码进行解释运行。
优点:多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象;
缺点:程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。
不过权衡之下,通常使用脚本编程还是值得的:花一个小时写成的简单脚本,同样的功能用C或C++来编写实现,可能需要两天,而且一般来说,脚本执行的速度已经够快了,快到足以让人忽略它性能上的问题。脚本编程语言的例子有awk、Perl、Python、Ruby与Shell。
编译型语言
很多传统的程序设计语言,例如C、C++、Java、Fortran、Ada、Pascal,都是编译型语言。这类语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”。
优点:运行程序时,直接读取目标代码(object code)。由于编译后的目标代码(object code)非常接近计算机底层,因此执行效率很高。
缺点:由于编译型语言多半运作于底层,所处理的是字节、整数、浮点数或是其他机器层级的对象,往往实现一个简单的功能需要大量复杂的代码。