23. 使用 Declare 声明变量


注意typesetdeclare内置函数是相同的,但是使用declaretypeset已被弃用,仅用于向后兼容。

对于正常情况,您不需要声明变量类型即可使用它。

total=3
name=ramesh
echo $total
echo $name

但是,bash 允许您声明整数、只读、数组、关联数组和导出类型变量。

使用declare -i声明一个整数:

declare -i variablename

无论您是否将变量声明为整数,以下内容都将起作用。

total=3
let total=total+2
echo $total

当您将变量声明为整数时,您不能使用该变量来存储其他类型的值。 例如,不能将字符串值存储到声明为整数的变量中。

未声明的变量 total 可用于存储数字或字符串:

$ total=3
$ echo $total
3
$ total="Some string value"
$ echo $total
Some string value

当您尝试将字符串值存储到整数变量时,以下示例会显示错误消息。

$ declare -i total
$ total=3
$ echo $total
3

$ total="Some string value"
-bash: Some string value: syntax error in expression (error token is "string value")
$ echo $total
3

declare -r variablename

当您想要为不允许更改的变量分配值时,请使用此选项。

在以下示例中,使用声明命令将变量 BESTSHELL 定义为只读。 在同一个声明语句中分配一个值。

$ declare -r BESTSHELL=Bash
$ echo $BESTSHELL
Bash

一旦定义了只读变量,就无法更改其值,因为 bash 将抛出错误消息:

$ BESTSHELL=Korn
-bash: BESTSHELL: readonly variable

shell 中定义的变量不会传递给子进程。 例如,如果您在命令行中定义变量,则从命令行执行的 shell 脚本将无法使用该变量,因为 shell 脚本会生成一个新的 bash 来执行该脚本。

在以下示例中,在命令行中定义了一个全局变量。

$ global=world
$ echo $global
world

如果生成新的 bash shell,则不会定义全局变量的值。

$ bash
$ echo $global

当您返回到父 shell 时,您可以再次看到全局变量。

$ exit
$ echo $global
world

要将变量导出到子 shell 或子进程,请使用declare -x。 在以下示例中,变量 global 使用 -x 声明。

$ declare -x global=world
$ echo $global
world

注意:您还可以使用export命令来实现此目的。

现在,当您生成新的 bash shell 时,全局变量的值仍然可用,因为它是在父 shell 中使用declare -x声明的。

$ bash
$ echo $global
world

注意:这是一个单向过程,即父 shell 可以将值发送到子进程,但子进程中对其所做的任何更改都不会发送回父进程。 子进程有自己的变量副本。

在子进程中修改global的值,并退出到父进程查看该值。

$ global=country
$ echo $global
country
$ exit
$ echo $global
world

注意:当不带任何参数使用declare命令时,它将显示环境变量和用户定义的局部变量。

Bash 允许您声明数组(-a选项)或关联数组(-A选项)。 我们稍后会详细讨论这些内容。