9.2. 变量类型声明:declaretypeset

declaretypeset 内建命令(它们是完全同义的)允许修改变量的属性。这是一种非常弱形式的类型声明,类似于某些编程语言中可用的[1]declare 命令是 Bash 版本 2 或更高版本特有的。typeset 命令也适用于 ksh 脚本。

declare/typeset 选项

-r 只读

(declare -r var1作用等同于readonly var1)

这大致相当于 C 语言的 const 类型限定符。尝试更改 readonly 变量的值将失败并显示错误消息。

declare -r var1=1
echo "var1 = $var1"   # var1 = 1

(( var1++ ))          # x.sh: line 4: var1: readonly variable

-i 整数

declare -i number
# The script will treat subsequent occurrences of "number" as an integer.		

number=3
echo "Number = $number"     # Number = 3

number=three
echo "Number = $number"     # Number = 0
# Tries to evaluate the string "three" as an integer.

对于声明为整数的变量,允许进行某些算术运算,而无需使用 exprlet

n=6/3
echo "n = $n"       # n = 6/3

declare -i n
n=6/3
echo "n = $n"       # n = 2

-a数组

declare -a indices

变量indices将被视为一个 数组

-f 函数

declare -f

一个declare -f在脚本中,不带参数的"declare -f" 行会导致列出该脚本中先前定义的所有 函数

declare -f function_name

一个declare -f function_name在脚本中,仅列出指定名称的函数。

-x export

declare -x var3

这声明一个变量可用于导出到脚本自身环境之外。

-x var=$value

declare -x var3=373

declare 命令允许在设置变量属性的同一语句中为变量赋值。

示例 9-10. 使用 declare 进行变量类型声明

#!/bin/bash

func1 ()
{
  echo This is a function.
}

declare -f        # Lists the function above.

echo

declare -i var1   # var1 is an integer.
var1=2367
echo "var1 declared as $var1"
var1=var1+1       # Integer declaration eliminates the need for 'let'.
echo "var1 incremented by 1 is $var1."
# Attempt to change variable declared as integer.
echo "Attempting to change var1 to floating point value, 2367.1."
var1=2367.1       # Results in error message, with no change to variable.
echo "var1 is still $var1"

echo

declare -r var2=13.36         # 'declare' permits setting a variable property
                              #+ and simultaneously assigning it a value.
echo "var2 declared as $var2" # Attempt to change readonly variable.
var2=13.37                    # Generates error message, and exit from script.

echo "var2 is still $var2"    # This line will not execute.

exit 0                        # Script will not exit here.

Caution

使用 declare 内建命令会限制变量的 作用域

foo ()
{
FOO="bar"
}

bar ()
{
foo
echo $FOO
}

bar   # Prints bar.

然而 . . .

foo (){
declare FOO="bar"
}

bar ()
{
foo
echo $FOO
}

bar  # Prints nothing.


# Thank you, Michael Iatrou, for pointing this out.

9.2.1. declare 的另一个用途

declare 命令有助于识别变量,无论是 环境变量 还是其他变量。这对于 数组 尤其有用。

bash$ declare | grep HOME
HOME=/home/bozo


bash$ zzy=68
bash$ declare | grep zzy
zzy=68


bash$ Colors=([0]="purple" [1]="reddish-orange" [2]="light green")
bash$ echo ${Colors[@]}
purple reddish-orange light green
bash$ declare | grep Colors
Colors=([0]="purple" [1]="reddish-orange" [2]="light green")
	     

注释

[1]

在此上下文中,类型声明变量意味着对其进行分类并限制其属性。例如,声明为或类型为整数的变量不再可用于字符串操作

declare -i intvar

intvar=23
echo "$intvar"   # 23
intvar=stringval
echo "$intvar"   # 0