Linux local命令介绍
local(local variable)命令用于在shell函数中定义局部变量,这些变量只在函数内部有效,不会影响全局变量的值。local命令只能在函数中使用,否则会报错。local命令可以指定变量的类型,如整数、数组等,也可以指定变量的属性,如只读、导出等。local命令可以同时定义多个变量,也可以在定义变量时赋值。
Linux local命令适用的Linux版本
local命令是bash的内置命令,因此适用于所有安装了bash的Linux系统。如果你的系统没有安装bash,你可以使用以下命令来安装:
- 对于基于Debian的系统,如Ubuntu,你可以使用apt命令:
[linux@bashcommandnotfound.cn ~]$ sudo apt update
[linux@bashcommandnotfound.cn ~]$ sudo apt install bash
- 对于基于Red Hat的系统,如CentOS,你可以使用yum或dnf命令:
[linux@bashcommandnotfound.cn ~]$ sudo yum update
[linux@bashcommandnotfound.cn ~]$ sudo yum install bash
或者
[linux@bashcommandnotfound.cn ~]$ sudo dnf update
[linux@bashcommandnotfound.cn ~]$ sudo dnf install bash
- 对于基于Arch的系统,如Manjaro,你可以使用pacman命令:
[linux@bashcommandnotfound.cn ~]$ sudo pacman -Syu
[linux@bashcommandnotfound.cn ~]$ sudo pacman -S bash
Linux local命令的基本语法
local命令的基本语法格式如下:
local [选项] [变量名[=值]] ...
Linux local命令的常用选项或参数说明
local命令的常用选项或参数如下表所示:
选项 | 说明 |
---|---|
-a | 将变量定义为数组类型 |
-i | 将变量定义为整数类型 |
-l | 将变量的值转换为小写 |
-n | 将变量名作为间接引用 |
-r | 将变量定义为只读属性 |
-u | 将变量的值转换为大写 |
-x | 将变量定义为导出属性 |
Linux local命令的实例
实例1:定义一个局部变量并打印其值
[linux@bashcommandnotfound.cn ~]$ foo=global # 定义一个全局变量foo
[linux@bashcommandnotfound.cn ~]$ echo $foo # 打印全局变量foo的值
global
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> local foo=local # 在函数内部定义一个局部变量foo
> echo $foo # 打印局部变量foo的值
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
local
[linux@bashcommandnotfound.cn ~]$ echo $foo # 再次打印全局变量foo的值
global
从上面的实例可以看出,局部变量foo的值只在函数func内部有效,不会影响全局变量foo的值。
实例2:定义一个整数类型的局部变量并进行算术运算
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> local -i num=10 # 定义一个整数类型的局部变量num并赋值为10
> echo $((num+5)) # 打印num加5的结果
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
15
从上面的实例可以看出,使用-i选项可以将变量定义为整数类型,这样可以直接进行算术运算,而不需要使用expr或bc等命令。
实例3:定义一个数组类型的局部变量并打印其元素
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> local -a arr=(a b c) # 定义一个数组类型的局部变量arr并赋值为(a b c)
> echo ${arr[0]} # 打印arr的第一个元素
> echo ${arr[@]} # 打印arr的所有元素
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
a
a b c
从上面的实例可以看出,使用-a选项可以将变量定义为数组类型,这样可以使用数组的语法来操作变量,如使用下标访问元素,使用@符号访问所有元素等。
实例4:定义一个只读属性的局部变量并尝试修改其值
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> local -r name=bing # 定义一个只读属性的局部变量name并赋值为bing
> echo $name # 打印name的值
> name=google # 尝试修改name的值
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
bing
bash: name: readonly variable
从上面的实例可以看出,使用-r选项可以将变量定义为只读属性,这样就不能再修改变量的值,否则会报错。
实例5:定义一个导出属性的局部变量并在子进程中访问其值
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> local -x msg=hello # 定义一个导出属性的局部变量msg并赋值为hello
> bash -c 'echo $msg' # 在子进程中打印msg的值
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
hello
从上面的实例可以看出,使用-x选项可以将变量定义为导出属性,这样就可以在子进程中访问变量的值,否则子进程无法继承变量的值。
实例6:定义一个间接引用的局部变量并打印其值
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> local -n ref=foo # 定义一个间接引用的局部变量ref并赋值为foo
> foo=bar # 定义一个全局变量foo并赋值为bar
> echo $ref # 打印ref的值
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
bar
从上面的实例可以看出,使用-n选项可以将变量定义为间接引用,这样变量的值就是另一个变量的名字,打印变量的值时就会显示另一个变量的值。
实例7:定义一个局部变量并将其值转换为大写或小写
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> local -u upper=bing # 定义一个局部变量upper并赋值为bing,并将其值转换为大写
> local -l lower=GOOGLE # 定义一个局部变量lower并赋值为GOOGLE,并将其值转换为小写
> echo $upper # 打印upper的值
> echo $lower # 打印lower的值
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
BING
google
实例8:定义一个局部变量并在函数内部使用source命令执行另一个文件中的命令
[linux@bashcommandnotfound.cn ~]$ cat test.sh # 查看test.sh文件的内容
#!/bin/bash
echo $foo # 打印foo的值
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> local foo=bar # 定义一个局部变量foo并赋值为bar
> source test.sh # 在函数内部使用source命令执行test.sh文件中的命令
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
bar
从上面的实例可以看出,使用source命令可以在当前shell中执行另一个文件中的命令,这样就可以访问函数内部定义的局部变量的值。
实例9:定义一个局部变量并在函数内部使用eval命令执行一个字符串中的命令
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> local foo=bar # 定义一个局部变量foo并赋值为bar
> cmd='echo $foo' # 定义一个字符串变量cmd并赋值为'echo $foo'
> eval $cmd # 在函数内部使用eval命令执行字符串变量cmd中的命令
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
bar
从上面的实例可以看出,使用eval命令可以执行一个字符串中的命令,这样就可以访问函数内部定义的局部变量的值。
实例10:定义一个局部变量并在函数内部使用exec命令执行一个新的shell进程
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> local foo=bar # 定义一个局部变量foo并赋值为bar
> exec bash # 在函数内部使用exec命令执行一个新的bash进程
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
[linux@bashcommandnotfound.cn ~]$ echo $foo # 在新的bash进程中打印foo的值
从上面的实例可以看出,使用exec命令可以执行一个新的shell进程,这样就会替换当前的shell进程,函数内部定义的局部变量的值就会丢失。
Linux local命令的注意事项
- local命令只能在函数中使用,如果在函数外部使用,会报错:
[linux@bashcommandnotfound.cn ~]$ local foo=bar
bash: local: can only be used in a function
- local命令定义的变量只在函数内部有效,如果在函数外部访问,会显示空值:
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> local foo=bar # 定义一个局部变量foo并赋值为bar
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
[linux@bashcommandnotfound.cn ~]$ echo $foo # 在函数外部打印foo的值
- local命令定义的变量不会覆盖全局变量的值,如果在函数内部需要修改全局变量的值,可以使用declare命令:
[linux@bashcommandnotfound.cn ~]$ foo=global # 定义一个全局变量foo并赋值为global
[linux@bashcommandnotfound.cn ~]$ func() { # 定义一个函数func
> declare foo=local # 使用declare命令修改全局变量foo的值为local
> }
[linux@bashcommandnotfound.cn ~]$ func # 调用函数func
[linux@bashcommandnotfound.cn ~]$ echo $foo # 在函数外部打印foo的值
local
- 如果你在使用local命令时遇到bash: local: command not found的错误,说明你的系统没有安装bash,你可以按照上面的方法来安装bash,然后再使用local命令。
评论区