declare
declare [-aAfFgilnrtux] [-p] [name[=value] …]
既可以声明并初始化变量name,也可以为已存在的变量赋值或设置变量的属性,还可以用来显示变量。
$ declare foo=bar abc=123
$ echo ${foo} ${abc}
bar 123
没有给name时,显示所有变量。
$ declare
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
...
- -p 不仅显示变量的值,还显示变量的属性
$ declare -p BASH
declare -- BASH="/bin/bash"
$ declare -p
declare -- BASH="/bin/bash"
declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath"
declare -i BASHPID
declare -A BASH_ALIASES=()
declare -a BASH_ARGC=([0]="0")
...
$ declare foo=bar abc=123
$ declare -p foo abc
declare -- foo="bar"
declare -- abc="123"
- -f 显示shell函数,包括函数的定义
$ declare -f quote
quote ()
{
local quoted=${1//\'/\'\\\'\'};
printf "'%s'" "$quoted"
}
- -F 只显示函数的名字和属性
$ declare -F quote
quote
- -g 赋予变量全局属性;+g 关闭该属性
在函数中使用declare时,如果不使用-g选项,声明的都是局部变量,其作用如同local命令
$ foo ()
> {
> declare -g bar
> declare abc
> }
$ foo
$ declare -p bar
declare -- bar
$ declare -p abc
-bash: declare: abc: not found
- -a 声明索引数组变量
- -A 声明关联数组变量
- -i 赋予变量integer属性;+i 关闭该属性
$ declare -i var=1+2
$ echo $var
3
$ declare abc=1+2
$ echo $abc
1+2
- -r 赋予变量只读属性
$ declare -r foo
$ echo $foo
123
$ foo=456
-bash: foo: readonly variable
- -l 赋给变量的值,所有大写字符都将转换为小写。 大写属性被禁用。+l 关闭该属性
$ declare -l abc=ABCD
$ echo $abc
abcd
$ declare +l abc
$ abc=ABCdef
$ echo $abc
ABCdef
- -u 赋给变量的值,所有小写字符都将转换为大写。 小写属性被禁用。+u 关闭该属性
$ declare -u abc=abcd
$ echo $abc
ABCD
$ declare +u abc
$ abc=ABCdef
$ echo $abc
ABCdef
- -n 给变量提供nameref属性,使其成为对另一个变量的引用。
$ foo=abc
$ declare -n bar=foo
$ echo $bar
abc
$ bar=123
$ echo $foo
123
nameref属性不能用于数组变量。
- -t 赋予变量trace属性。trace属性对变量没有特殊含义。
- -x export变量
如下情况,declare命令的返回值(return status)不为0:
- 非法的option
- 使用‘-f foo=bar’定义函数
- 为只读变量赋值
- 没有使用复合赋值语法为数组变量赋值
- 声明非法的shell变量名
- 试图关闭只读变量的只读属性
- 试图关闭数组变量的数组属性
- 用-f显示不存在的函数