1、declare
命令介绍
Shell中所有变量的默认类型是字符串类型,如果你需要进行特殊数据类型进行运算,使用declare
命令就可以实现声明变量的类型。
declare
命令是一个内置命令,命令如下:
[root@localhost ~]# declare [+/-] [选项] 变量名 选项: -: 给变量设定类型属性。 +: 取消变量的类型属性。 -а: 将变量声明为数组型。 -i: 将变量声明为整数型(integer)。 -r: 将变量声明为只读变量。 注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量, 甚至不能通过+r取消只读属性。 -x: 将变量声明为环境变量。 -p: 显示指定变量的被声明的类型。
注意:
Shell中就识别上边这些数据类型,像日期类型,布尔类型等,Shell中默认是不支持的。
其实这样做的目的都是为了降低Shell的难度。
示例:
# 定义两个变量,进行求和 [root@Lyl tmp]# a=1 [root@Lyl tmp]# b=2 [root@Lyl tmp]# c=$a+$b [root@Lyl tmp]# echo $c 1+2 # 可以看上在Shell中,变量值的默认类型是字符串。 # 如果我们要把1和2变成数字类型,就需要适用declare命令。 # 给变量aa和bb赋值 [root@Lyl tmp]# aa=11 [root@Lyl tmp]# bb=22 # 声明变量cc的类型是整数型,它的值是aa和bb的和。 # 这里注意一下,其实应该把变量aa和bb也通过declare命令声明成数值型, # 但是Shell这点还好,只把最后的和cc声明成数值型,也是能进行计算的。 [root@Lyl tmp]# declare -i cc=$aa+$bb # 输出变量cc [root@Lyl tmp]# echo $cc 33
Shell在数值运算这里确实是比较麻烦,习惯就好了。
2、声明数组变量类型
数组就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的元素,有时也称为下标变量。
用白话说,变量和数组都是用来保存数据的,只是变量只能赋予一个数据值,一旦重复赋值,后边的值就会覆盖前边值。而数组是可以赋予一组相同类型的数据值。
大家可以把变量想象成一个小办公室,这个办公室只能容纳一个人办公,办公室名就是变量名。而数组是一个大办公室,可以容纳很多人同时办公,在这个大办公室的每个人是通过不同的座位号来区分的,这个座位号就是数组的下标,而大办公室的名字就是数组名。
数组的下标是从0开始的,在调用数组值时,需要使用${数组[下标]}
的方式来读取。
数组基本用法示例:
# 我们先来定义一个变量test。 [root@Lyl ~]# test=123 [root@Lyl ~]# echo $test 123 # 修改test变量的值,则直接覆盖原有值。 [root@Lyl ~]# test=456 [root@Lyl ~]# echo $test 456 # 数组 # 定义一个数组,添加西游记四个主人公,并查看 [root@Lyl ~]# declare -a name[0]="tangc" [root@Lyl ~]# declare -a name[1]="sunwk" # 注意:在定义数组的时候,不用写declare -a 系统也能识别你定义的是一个数组, # 因为定义数组的格式比较特殊,不用强制声明。 [root@Lyl ~]# name[2]="zhubj" [root@Lyl ~]# name[3]="shahs" # 查看数组内容 # 如果我们使用查看变量的方式查看数组, # 则会只显示数组用的第一个元素,也就是0号标元素。 [root@Lyl ~]# echo $name tangc # 查看数组元素的标准方式。 [root@Lyl ~]# echo ${name[2]} zhubj # 查看数组中所有的元素 [root@Lyl ~]# echo ${name[*]} tangc sunwk zhubj shahs
提示:
Shell中的数组和Java中的数组,用法上差不多,但是Shell的数组是没有定义数组相关函数的。
可能开发Shell的人认为,Shell不可能用于开发算法类的东西,Shell本意是用来帮助Linux管理员高效的完成工作,降低管理难度的。(如果需要写一些算法,还是用那些高级语言去写。)
因此数组在Shell中的作用就大幅度下降了。
3、声明变量为环境变量
可以使用declare -x
命令把变量声明为环境变量,和export
命令的作用是一样的。
我们通过declare -p
命令,显示所有被declare声明的变量,就可以看到里边有很多被declare -x
命令声明的变量,也就是环境变量。
准确的说export
命令是declare -x
命令的一种简易写法。也就是说,执行export
命令定义一个环境变量,最终也是执行的declare -x
命令。
示例:
# 直接输入`declare -p`命令是查看所有的declare声明的变量。 # 查看指定declare声明的变量, # 就以上边定义的test变量为例。 [root@Lyl ~]# declare -p test declare -- test="456" # 通过`export`命令把test变量声明成环境变量。 [root@Lyl ~]# export test [root@Lyl ~]# declare -p test declare -x test="456" # 通过`declare +x`命令把test变量声明成普通变量。 [root@Lyl ~]# declare +x test [root@Lyl ~]# declare -p test declare -- test="456" # 通过`declare -x`命令把test变量声明成环境变量。 [root@Lyl ~]# declare -x test [root@Lyl ~]# declare -p test declare -x test="456" # 所以`export 变量名` 和 `declare -x 变量名`作用相同。 # export更好记忆。
4、声明只读属性
一旦给变量设定了只读属性,那么这个变量既不能修改变量的值,也不能删除变量,甚至不能使用"+r"
选项取消只读属性。
换种说法,其实就是把Shell中的一个变量,变成了常量。
命令如下:
# 定义一个普通变量test,并通过declare命令查看。 [root@Lyl ~]# declare -p test declare -- test="456" # 将test变量赋予只读属性。 [root@Lyl ~]# declare -r test [root@Lyl ~]# declare -p test declare -r test="456" # 修改test变量的值,发现不能被修改。 [root@Lyl ~]# test=666 -bash: test: readonly variable # test变量也不能取消只读属性。 [root@Lyl ~]# declare +r test -bash: declare: test: readonly variable # test变量也不能删除 [root@Lyl ~]# unset test -bash: unset: test: cannot unset: readonly variable
提示:不过
declare -r
命令是临时生效,所以只要重新登录或重启,这个变量就会消失了。如果是要写在配置文件中只读变量,这个变量就永远不能修改了。
5、补充:
declare
命令其他常用属性,用法同上。
-f 显示函数名及函数定义。 -F 只显示函数名(调试时附加行号和源文件)。 -l 增加小写属性,变量的值将转换为小写。 +l 删除小写属性。 -u 增加大写属性,变量的值将转换为大写。 +u 删除大写属性。