Shell编程 - 03Shell脚本之变量的作用域

167 阅读4分钟

shell 变量的作用域

Shell 变量的作用域(Scope),就是 Shell 变量可以使用的范围 Shell 变量的作用域可以分为三种:

有的变量只能在函数内部使用,这叫做局部变量(local variable); 有的变量可以在当前 Shell 进程中使用,这叫做全局变量(global variable); 有的变量可以在子进程中使用,这叫做环境变量(environment variable)

标题
原理代码输出结果结论其他
Shell 支持自定义函数,但是 Shell 函数和其他编程语言函数的一个不同点就是:在 Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果。#!/bin/bash function func(){} m=99 func echo $m99a 是在函数内部定义的,但是在函数外部也可以得到它的值,证明它的作用域是全局的,而不是仅限于函数内部
要想变量的作用域仅限于函数内部,可以在定义时加上local命令,此时该变量就成了局部变量#!/bin/bash function func(){} local m=99 func echo $m输出结果为空表明变量 a 在函数外部无效,是一个局部变量Shell 变量的这个特性和 JavaScript 中的变量是类似的。在 JavaScript 函数内部定义的变量,默认也是全局变量,只有加上var关键字,它才会变成局部变量。
shell 局部变量

Shell 支持自定义函数,但是 Shell 函数和其他编程语言函数的一个不同点就是:在 Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果。

它的作用域是全局的,而不是仅限于函数内部

要想变量的作用域仅限于函数内部,可以在定义时加上local命令,此时该变量就成了局部变量,

n 在函数外部无效,是一个局部变量

1732793867067.png

Shell 变量的这个特性和 JavaScript 中的变量是类似的。在 JavaScript 函数内部定义的变量,默认也是全局变量,只有加上var关键字,它才会变成局部变量。

shell 全局变量

全局变量的作用范围是当前的 Shell 进程,而不仅仅是当前的Shell 脚本文件,它们是不同的概念。打开一个 Shell 窗口就创建了一个 Shell 进程,打开多个 Shell 窗口就创建了多个 Shell进程,每个 Shell 进程都是独立的,拥有不同的进程 ID。在一个 Shell 进程中可以使用 source 命令执行多个 Shell 脚本文件,此时全局变量在这些脚本文件中都有效。

全局变量的作用范围是当前shell进程 全局变量的作用范围是不仅仅在当前的 Shell 脚本文件

linux shell 中./a.sh , sh a.sh , source a.sh, . ./a.sh 的区别

source ./a.sh source a.sh . ./a.sh在当前shell中执行脚本

sh ./a.sh sh a.sh sh ./a.sh source ./a.sh 启了一个子shell来执行a.sh

用sh和source去执行时, 不要求a.sh有可执行权限, 但单独./a.sh这样去搞时,需要可执行权限

脚本 知识点

执行方式 结果

shell 环境变量

全局变量只在当前 Shell 进程中有效,对其它 Shell 进程和子进程都无效。如果使用 export 命令将全局变量导出,那么它就在所有的子进程中也有效了,这称为“环境变量” 当 Shell 子进程产生时,它会继承父进程的环境变量为自己所用,所以说环境变量可从父进程传给子进程.不难理解,环境变量还可以传递给孙进程。 传子不传父

使用 env 可以查看所有环境变量!

默认情况下,a 在 Shell 子进程中是无效的;使用 export 将 a 导出为环境变量后,在子进程中就可以使用了。

export a 这种形式是在定义变量 a 以后再将它导出为环境变量,如果想在定义的同时导出为环境变量,可以写作 export a=22.

shell 配置文件

那如何让一个变量在所有 Shell 进程中都有效,不管它们之间是否存在父子关系呢?只有将变量写入 Shell 配置文件中才能达到这个目的!Shell 进程每次启动时都会执行配置文件中的代码做一些初始化工作,如果将变量放在配置文件中,那么每次启动进程都会定义这个变量。