ITEEDU

第 10 章 变量进阶

摘要

在本章,我们会讨论变量和参数的高级使用。完成之后,你将能够:

  • 声明并使用一个变量的数组

  • 指定你想使用的变量的顺序

  • 使变量只读

  • 使用 set 对一个变量进行赋值

10.1. 变量的类型

10.1.1. 普通的变量赋值

就像我们已经看到的,Bash理解许多种变量和参数。迄今,我们还没有对进行赋值的变量的种类太操心,所以我们的变量可以存放任何我们赋予的值。一个简单的命令行证明了这个:

[bob in ~] VARIABLE=12

[bob in ~] echo $VARIABLE
12

[bob in ~] VARIABLE=string

[bob in ~] echo $VARIABLE
string

有些情况下我们想防止这种行为的产生,比如需要存放电话号码和其他数字。除了整数和变量,你也可能向指定一个变量为常量。一个常量的值的声明,通常在脚本的开始处。之后,只有指向常量的引用,所以当常量需要改变的时候,只需要做一次。一个变量也可以是一系列任何类型的变量,所谓的变量的 数组 (VAR0VAR1, VAR2, ... VARN).

10.1.2. 使用 declare 内建命令built-in

使用一个 declare 语句,我们可以限制赋给变量的值。

以下是 declare 的语法:

declare OPTION(s) VARIABLE=value

下列选项用来确定变量能存放的数据的类型和分配给它的属性:

表 10.1. declare 内建命令的选项

选项 含义
-a 变量为数组。
-f 仅使用函数名。
-i 把变量当作整数来对待;变量被赋值之后就进行算术计算(参见 第 3.4.6 节 “算术扩展”)。
-p 显示每个变量的属性和值。当使用 -p 选项,其他选项就被忽略。
-r 使得变量变为只读。这些变量不能被后来的赋值与语句赋值,同样也不可以unset。
-t 给于每个变量 trace 属性。
-x Mark each variable for export to subsequent commands via the environment.

使用 + 代替 - 来关闭属性。当使用在函数中时,declare 建立本地变量。

以下例子显示了对一个变量怎样赋于类型来影响它的值。

[bob in ~] declare -i VARIABLE=12

[bob in ~] VARIABLE=string

[bob in ~] echo $VARIABLE
0

[bob in ~] declare -p VARIABLE
declare -i VARIABLE="0"

注意Bash有一个选项来声明一个数字值,但是却没有选项用来声明字符串。这是因为,默认下,如果没有特别指明,变量可以拥有任何类型的数据:

[bob in ~] OTHERVAR=blah

[bob in ~] declare -p OTHERVAR
declare -- OTHERVAR="blah"

只要你限制了对变量的赋值,那它只能存放那种类型的数据。可能限制是整数,常量或者数组。

参见Bash信息页面来获得更多关于返回状态的信息。

10.1.3. 常量

在Bash中,常量是通过建立一个只读变量创建的。readonly 内建命令使每个指定的变量成为不能改变的。语法是:

readonly OPTION VARIABLE(s)

这些变量的值就不能再被后来的赋值改变了。如果带 -f 选项,每个变量指向一个shell函数;参见 第 11 章 函数。如果指定 -a 选项,每个变量指向一个变量数组。如果没有给出任何参数,或者如果提供 -p 选项,就会显示所有的只读变量的列表。使用 -p 选项,输出能被当作输入重用。

除非指定一个非法的选项,其中一个变量或者函数不存在,或者 -f 提供给一个变量名而不是一个函数,否则返回状态就是0。

[bob in ~] readonly TUX=penguinpower

[bob in ~] TUX=Mickeysoft
bash: TUX: readonly variable