侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

标题 Linux local命令教程:如何在函数中定义局部变量(附实例详解和注意事项)

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命令。
0

评论区