在shell中,内建(builtin)命令declare与typeset用法相同,格式如下:
declare [-aAfFgilnrtux] [-p] [name[=value] ...]
typeset [-aAfFgilnrtux] [-p] [name[=value] ...]
declare命令用于声明变量,可以给变量设置属性。如果没有指定name,则显示相应变量的值。下面介绍declare命令各选项的含义。
“-p”:显示每个name的属性和值,不指定name时,则显示相应的所有变量的属性和值。
“-f”:用于函数,显示函数定义。
“-F”:用于函数,只显示函数名字,不显示函数定义。
“-a”:用于索引(下标)数组。
“-A”:用于关联(键值对)数组。
“-i”:用于整数,可以进行数学运算。
“-n”:用于引用变量,这个变量name的值实际上是变量value的值,value作为一个变量来使用。不能用于数组。
“-l”:对变量赋值时,值的大写字母全部转换为小写。
“-u”:对变量赋值时,值的小写字母全部转换为大写。
“-r”:声明变量只读,不能被修改,也不能unset。
“-g”:在函数中declare命令效果同内置命令local,变量的影响范围是局部的,除非使用了“-g”。
“-x”:等效于内置命令export。
“-t”:给每个name设置trace属性,对函数来说,可以继承调用shell的trap命令的DEBUG和RETURN属性,对变量则没什么意义。
对于上面的选项,可以使用加号“+”代替减号“-”,效果是关闭对应的属性,但是,“+a”和“+r”无效。
下面是declare命令在数学运算中的例子:
$ a=1
$ b=2
$ echo $a+$b
1+2
$ declare -i a=1
$ declare -i b=2
$ declare -i c
$ c=$a+$b
$ echo $c
3
在shell中,内建(builtin)命令local,格式如下:
local [option] [name[=value] ...]
local命令只能用于shell函数,声明变量name为局部变量,只对当前函数或其子进程有效,选项option可以是内建命令declare可以接受的选项。
不在shell函数中使用local命令会出错:
$ local
bash: local: can only be used in a function
在shell函数中使用local命令:
$ cat test.sh
#!/bin/bash
foo=global
echo $foo
bar()
{
echo $foo
local foo=local
echo $foo
}
bar
echo $foo
$ bash test.sh
global
global
local
global
在shell函数中不使用local命令:
$ cat test.sh
#!/bin/bash
foo=global
echo $foo
bar()
{
echo $foo
foo=local
echo $foo
}
bar
echo $foo
$ bash test.sh
global
global
local
local