批处理脚本 – 本地 VS 全局变量
在本文中,我们将看到 bash 脚本中局部变量和全局变量之间的区别。
变量:用于在程序中存储值的内存位置的名称称为变量。它存储可以在程序中任何需要的地方调用和操作的信息。
范围:程序的部分或范围,其中变量可访问或被认为是活动的。
根据变量的范围,它有两种类型:
局部变量:作用域在声明它的函数内的那些变量(可以在程序中声明的块或函数内访问)
全局变量:这些变量可以在整个程序中全局访问。
本地 VS 全局变量:
Local variable | Global variable |
---|---|
The ‘local’ keyword is used to declare the local variable. | No keyword is used. |
It is declared inside the function | It can be declared outside the function anywhere in the program. |
It doesn’t prove the data sharing | It provides data sharing |
These are stored on the stack | These variables are stored in the fixed memory location by the compiler. |
Parameters passing is necessary | Parameters passing is not necessary |
Garbage value is stored if not initialized. | Zero is stored by default if not initialized. |
If modified inside one function that modification will not get reflected in other function. | If modified in one function that modification will be visible in whole program. |
使用局部变量的优点
- 它确保变量的值在任务运行时保持不变。
- 在多任务环境中,每个任务都可以更改变量的值。它不会产生不良结果,因为每个任务都可以创建自己的局部变量实例。
- 相同的变量名可以用于不同的任务。
- 它一执行就释放内存。
使用局部变量的缺点
- 它使调试成为一个复杂的过程。
- 由于模块间数据共享的限制,公共数据需要反复传递。
- 它们的范围非常有限。
使用全局变量的优点
- 它可以从程序的所有功能或模块中访问。
- 只需要在模块外声明一次全局变量。
- 它用于存储常量值以保持一致性。
- 当许多函数可以访问相同的数据时,它很有用。
使用全局变量的缺点
- 在程序内部声明的所有全局变量都保留在内存中,直到执行完成。这可能会导致内存不足问题。
- 数据修改很容易,任何任务或函数都可以轻松修改。这会在多任务环境中产生不良结果。
- 由于重构而中断全局变量将导致更改所有关联模块的问题。
让我们看一些例子来更好地理解全局变量和局部变量。
函数
该函数是可以多次调用的命令集。它用于避免一次又一次地编写相同的代码块。
句法:
function_name () {
commands
}
OR
function function_name {
commands
}
两种编写函数的格式在 bash 脚本中都是正确的。
示例 1:创建局部变量
局部变量在变量名前使用关键字声明
#!/bin/bash
function first () {
local x="HelloNew"
echo "Inside first function x=$x"
}
first
echo "Outside first function x = $x"
输出:
Inside first function x=HelloNew
Outside first function x =
示例 2:创建全局变量
#!/bin/bash
function first () {
x="Hello Geek"
echo "Inside first function x= $x"
}
first
echo "Outside first function x = $x"
输出:
Inside first function x=Hello Geek
Outside first function x = Hello Geek
示例 3:程序中的多个局部和全局变量
#!/bin/bash
function first () {
local x="Hello Geek"
local y= "Enjoy"
echo "Inside first function x= $x"
echo "Inside first function y= $y"
}
x="Hello Romy"
y="good to see you!"
first
echo "Outside first function x = $x"
echo "Outside first function y= $y"
输出:
Inside first function x= Hello Geek
Inside first function y=
Outside first function x = Hello Romy
Outside first function y= good to see you!
变量的覆盖
请参见下面的示例:
#!/bin/bash
x="Hellooooo!!"
echo " Outside first function x =$x"
function first () {
x="Hello Geek"
}
first
echo "After overwriting, x = $x"
输出:
Outside first function x =Hellooooo!!
After overwriting, x = Hello Geek
从示例中,我们可以看到 x 的值被覆盖。为了防止变量被覆盖,我们可以通过在变量声明之前写'declare -r'来使我们的变量只读。
例子:
#!/bin/bash
x="Hellooooo!!"
echo " Outside first function x =$x"
function first () {
declare -r x="Hello Geek"
}
first
echo "After overwriting, x = $x"
输出:
Outside first function x =Hellooooo!!
After overwriting, x = Hellooooo!!