shell第七课:declare 声明和查看变量

2015年08月25日 12:58 by:唠吧小站

  1. shell 声明变量和查看已有变量的命令用 declare 

declare命令用于声明和显示已存在的shell变量。当不提供变量名参数时显示所有shell变量。declare命令若不带任何参数选项,则会显示所有shell变量及其值。declare的功能与typeset命令的功能是相同的。

语法:

declare(选项)(参数)

选项

  • + / -:"-"用来指定变量的属性,"+" 则是取消变量所设的属性; 

常用参数

-p显示变量的值

格式:declare 或 typeset

格式:declare -p  或 typeset -p

显示所有变量的值。

 

格式:declare -p var

格式:typeset -p var

显示指定变量var的值。

 

格式:declare var=value

格式:typeset var=value

格式:var=value

声明变量并赋值。

-i 定义整数

格式:declare -i var

格式:typeset -i var

将变量var定义成整数。在之后就可以直接对表达式求值,结果只能是整数。如果求值失败或者不是整数,就设置为0。

 -r 将变量声明为只读

格式:declare -r var

格式:typeset -r var

格式:readonly var

将变量var声明为只读变量。只读变量不允许修改,也不允许删除。

 -a 声明数组变量

格式:declare -a var

格式:typeset -a var

将变量var声明为数组变量。但这没有必要。所有变量都不必显式定义就可以用作数组。事实上,在某种意义上,似乎所有变量都是数组,而且赋值给没有下标的变量与赋值给"[0]"相同。

 -f 显示所有自定义函数

格式:declare -f

格式:typeset -f

显示所有自定义函数,包括名称和函数体。

格式:declare -f func

格式:typeset -f func

只显示指定函数func的函数定义。

 -F 显示所有自定义函数的名称

格式:declare -F

格式:typeset -F

显示所有自定义函数名称。

-x 将函数定义成环境变量

格式:declare -x var 或者 typeset -x var

将变量var设置成环境变量,这样在随后的脚本和程序中可以使用。

declare -x var=value

export var=value

将变量var设置陈环境变量,并赋值为value。

 

使用示例

示例一 declare是内建命令

  1. [root@web ~]#type -a declare 
  2. declare is a shell builtin
  3. [root@web ~]#
  4. [root@jfht ~]#type -a typeset 
  5. typeset is a shell builtin
  6. [root@jfht ~]#
  7.  

示例二 declare -i之后可以直接对表达式求值

  1. [root@web ~]#x=6/3 
  2. [root@web ~]#echo $x 
  3. 6/3
  4. [root@web ~]#declare -i x 
  5. [root@web ~]#echo $x    
  6. 6/3
  7. [root@web ~]#x=6/3 
  8. [root@web ~]#echo $x 
  9. 2

如果变量被声明成整数,可以把表达式直接赋值给它,bash会对它求值。

  1. [root@jfht ~]#x=error 
  2. [root@jfht ~]#echo $x 
  3. 0

如果变量被声明成整数,把一个结果不是整数的表达式赋值给它时,就会变成0.

  1. [root@jfht ~]#x=3.14 
  2. -bash: 3.14: syntax error: invalid arithmetic operator (error token is ".14")
如果变量被声明成整数,把一个小数(浮点数)赋值给它时,也是不行的。因为bash并不内置对浮点数的支持。 
  1. [root@web ~]#
  2. [root@jfht ~]#declare +i x

此命令的结果是取消变量x的整数类型属性。 

  1. [root@jfht ~]#x=6/3 
  2. [root@jfht ~]#echo $x 
  3. 6/3

因为变量x不是整型变量,所以不会自动对表达式求值。可以采用下面两个方式。

  1. [root@jfht ~]#x=$[6/3] 
  2. [root@jfht ~]#echo $x
  3. 2
  4. [root@jfht ~]#x=$((6/3)) 
  5. [root@jfht ~]#echo $x  
  6. 2
  7. [root@jfht ~]#

 

示例三 声明只读变量

  1. [root@jfht ~]#declare -r r 
  2. [root@jfht ~]#echo $r 

  3. [root@jfht ~]#r=xxx 
  4. -bash: r: readonly variable
  5. [root@jfht ~]#declare -r r=xxx 
  6. -bash: declare: r: readonly variable
  7. [root@jfht ~]#declare +r r   
  8. -bash: declare: r: readonly variable
  9. [root@jfht ~]#
  10. [root@jfht ~]#declare +r r 
  11. -bash: declare: r: readonly variable
  12. [root@jfht ~]#
  13. [root@jfht ~]#unset r 
  14. -bash: unset: r: cannot unset: readonly variable
  15. [root@jfht ~]#

 

示例四 声明数组变量(实际上,任何变量都可以当做数组来操作)

[root@jfht ~]#declare -a names 
[root@jfht ~]#names=Jack 
[root@jfht ~]#echo ${names[0]} 
Jack
[root@jfht ~]#names[1]=Bone 
[root@jfht ~]#echo ${names[1]} 
Bone
[root@jfht ~]#echo ${names} 
Jack
[root@jfht ~]#echo ${names[*]} 
Jack Bone
[root@jfht ~]#echo ${#names} 
4

直接引用names,相当于引用names[0] 
[root@jfht ~]#echo ${#names[*]} 
2

[root@jfht ~]#echo ${names[@]} 
Jack Bone
[root@jfht ~]#echo ${#names[@]} 
2

[root@jfht ~]#declare -p names   
declare -a names='([0]="Jack" [1]="Bone")'
[root@jfht ~]#