1.如何运行 shell 程序
1.使文件具有可执行权限,直接运行(chmod +x)
2.直接调用命令解释器执行程序
3.使用 source 执行文件
在使用 source 执行 shell 脚本时,不会创建子进程,而是在父进程中直接执行,语法如下:
source file
. file
source 命令通常也被称为 '点命令',通常用于重新执行刚刚修改的初始化文件,使之立即生效。与其他运行脚本不同的是,source 命令影响shell 进程本身。
在脚本执行过程中,并没有进程的创建和消亡。当需要再程序中修改当前shell本身的环境变量时,使用source命令。
2.shell 命令种类
1.内建命令
就是shell程序本身保护的命令。这些命令集成在 shell 解释器中。部分内建命令的存在是为了改变shell本身的属性设置,在执行内建命令时,
没有进程的创建和消亡;另外一部分内建命令则是IO命令,例如echo命令。
2.shell 函数
shell 函数是一系列程序代码,以shell语言写成,它可以像其他命令一样被引用。
3.外部命令
外部命令是独立于 shell 的可执行程序。例如,find,grep等。命令行shell在执行外部命令时,会创建一个当前shell的复制进程来执行。在执行
过程中,存在进程的创建和消亡。外部命令的执行过程如下:
1.调用POSIX系统 fork 函数接口,创建一个命令行shell进程的复制(子进程)
2.在子进程的运行环境中,查找外部命令在Linux文件系统中的位置。如果外部命令给出了完全路径,则忽略
3.在子进程里,以新程序取代shell拷贝并执行(exec),此时父进程进入休眠,等待子进程执行完毕。
4.子进程执行完毕之后,父进程接着从终端读取下一条命令。
3.shell 变量
shell 并不对变量区分类型,一切都是字符串。
add_1=100
Linux Shell 中的变量都是字符串类型,但是同样可以执行比较操作和整数操作,只要变量字符串是数字。= 号两边不要有任何空格。当包含空格的时候,请加引号。
$with_space 事实上只是 ${with_space} 的简写形式。在某些上下文中,$with_space 可能会引起错误,这时候就需要用 ${with_space} 了。
“” 双引号扩起来的变量替换是不会被阻止的。所以双引号被称为 部分引用,有时候也被称为 '弱引用'。但如果是 '' 单引号的话,变量替换就会被禁止了,变量只会
被解释成字面的意思,所以单引号被称为 '全引用',有时候也被称为 '强引用'。
变量类型:
1.局部变量
2.全局变量
环境变量:
通常情况下,每个进程都有自己的'环境',这个环境是由一组变量组成的,这些变量中存有进程可能需要引用的信息。
每当一个shell启动时,它都将创建适合于自己环境变量的shell变量。更新或者添加一个新的环境变量的话,这个shell都会立即更新它自己的环境,换句话说,
更改或者添加的变量会立即生效,并且所有后续生成的 shell 子进程(即这个 shell 所执行的命令)都会继承这个环境。
如果一个脚本需要设置一个环境变量,那么需要将这些变量 'export'出来,也就是需要通知到脚本本地环境。这就是命令 export 的功能。
一个脚本只能够 export 变量到这个脚本所生产的子进程,也就是说只能够对这个脚本产生的命令和进程起作用。如果脚本是从命令行中调用的,那么这个脚本所
export 的变量是不能影响命令行环境的。也就是说,子进程是不能够 export 变量影响产生自己的父进程的环境的。但是,当使用 source 命令执行脚本的时候,因为
没有子进程产生,此时脚本中的 export 命令将会影响父进程的环境。
export 命令用于设置当前进程的环境变量。但是有效期仅维持到当前进程消亡为止。下次重新登录到命令行shell时,以前对 shell 的 export 设置都无法恢复。
如果想要把对环境变量的设置永久保存,则可以将 export 命令至于 shell 登录时执行的启动文件中。例如,
export PATH=...
env 与 set:
env 显示的是环境变量,set 函数显示的是所有本地变量,包括用户的环境变量。例如,当用户在命令行中设置 var=123 时,set 函数将显示var变量,env 函数则
不显示(var此时是本地变量,不是环境变量)。如果使用 export var=123命令,则set和 env 函数都可以显示 var 变量。
4.shell 是解释型语言
shell 命令种类:
3.变量