变量
简介
变量就是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。变量几乎所有的程序设计语言中都有定义,并且其涵义也大同小异。从本质上讲,变量就是在程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址。
在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的变量名却保持不变。
命名
在Shell中,变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。对于变量名的长度,Shell并没有做出明确的规定。因此,用户可以使用任意长度的字符串来作为变量名。但是,为了提高程序的可读性,建议用户使用相对较短的字符串作为变量名。
在一个设计良好的程序中,变量的命名有着非常大的学问。通常情况下,用户应该尽可能选择有明确意义的英文单词作为变量名,尽量避免使用拼音或者毫无意义的字符串作为变量名。这样的话,用户通过变量名就可以了解该变量的作用。
例如,下面的变量名都是非常好的选择:
PATH=/sbin
UID=100
JAVA_HOME="/usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/../.."
SSHD=/usr/sbin/sshd
变量的类型
Shell是一种动态类型语言和弱类型语言,即在Shell中,变量的数据类型毋需显示地声明,变量的数据类型会根据不同的操作有所变化。准确地讲,Shell中的变量是不分数据类型的,统一地按照字符串存储。 但是根据变量的上下文环境,允许程序执行一些不同的操作,例如字符串的比较和整数的加减等等。
【例1】演示Shell变量的数据类型
#!/bin/bash
x=123 #定义变量x,并且赋值为123
let "x += 1" #变量x加1
echo "x = $x" #输出变量x的值 124
echo #显示空行
y=${x/1/abc} #替换x中的1为abc,并且将值赋给变量y abc24
echo "y = $y" #输出变量y的值 abc24
declare -i y #声明变量y
echo "y = $y" #输出变量y的值
let "y += 1" #变量y的值加1 #abc24不是整形,便将y变为0,0自增为1
echo "y = $y" #输出变量y的值 1
echo #显示空行
z=abc22 #将字符串赋给变量z
echo "z = $z" #输出变量z的值
m=${z/abc/11} #替换变量z中的abc为数字11,并且将值赋给变量m
echo "m = $m" #输出变量m的值
let "m += 1" #变量m加1 #弱类型,自动变为int型
echo "m = $m" #输出变量m的值
echo
n="" #将空串赋给变量n
echo "n = $n" #输出变量n的值
let "n += 1" #变量n加1
echo "n = $n"
echo
echo "p = $p" #输出空变量p的值 #自动赋值为空
let "p += 1" # 变量p加1
echo "p = $p"
上述代码运行结果
[root@localhost ~]# ./test.sh
x = 124
y = abc24
y = abc24
y = 1
z = abc22
m = 1122
m = 1123
n =
n = 1
p =
p = 1
在Shell中,通常情况下用户可以直接使用变量,而毋需先进行定义,当用户第一次使用某个变量名时,实际上就同时定义了这个变量,在变量的作用域内,用户都可以使用该变量。
【例2】演示通过直接使用变量来定义变量
#!/bin/bash
a=1 #定义变量a #类似于 int n=3 这种操作
b="hello" #定义变量b
c="hello world" #定义变量c
通过declare命令声明变量
declare attribute variable(声明变量属性)
-p:显示所有变量的值。
-i:将变量定义为整数。在之后就可以直接对表达式求值,结果只能是整数。如果求值失败或者不是整数,就设置为0。
declare -i t,把t设置为整型
-r:将变量声明为只读变量。只读变量不允许修改,也不允许删除。readonly,
-a:变量声明为数组变量。但这没有必要。所有变量都不必显式定义就可以用作数组。事实上,在某种意义上,似乎所有变量
都是数组,而且赋值给没有下标的变量与赋值给下标为0的数组元素相同. array,矩阵,变长数组
-f:显示所有自定义函数,包括名称和函数体。function
-x:将变量设置成环境变量,这样在随后的脚本和程序中可以使用。
【例3】演示使用不同的方法了声明变量,导致变量在不同的环境下表现出不同的行为
#!/bin/bash
x=6/3 #定义变量x,并将一个算术式赋给它
echo "$x"
declare -i x #定义变量x为整数
echo "$x" #仍为之前的x
x=6/3 #将算术式赋给变量x,自动转变为2
echo "$x" #
x=hello #将字符串赋给变量x
echo "$x" #给整型变量赋hello,不是整数,只能给x赋值为0
x=3.14 #将浮点数赋给变量x
echo "$x"
declare +i x #取消变量x的整数属性
x=6/3 #重新将算术式赋给变量x
echo "$x" #6/3
x=$[6/3] #求表达式的值
echo "$x" #2
x=$((6/3)) #求表达式的值
echo "$x" #2
declare -r x #声明只读变量x
echo "$x" #2
x=5 #尝试为只读变量赋值