Chinaunix首页 | 论坛 | 博客
  • 博客访问: 114865
  • 博文数量: 47
  • 博客积分: 1960
  • 博客等级: 上尉
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-18 14:52
文章分类

全部博文(47)

文章存档

2010年(47)

我的朋友

分类:

2010-02-18 15:14:42

变量的分类

变量有两种分类方式:
按照变量作用域, 可分为环境变量和局部变量

1, 环境变量: 对所有的bash进程有效, 可使用下面的命令来显示全局变量:
$ env or: $ printenv
全局变量名默认大写的字母组成.

2, 局部变量: 只对当前bash进程有效, 可用set命令来显示它们:
$ set

set除显示局部变量外, 还会显示shell函数.

按照变量类型, 可分为: 1, 字符窜变量; 2, 整数变量; 3, 常数变量; 4, 数组变量.


变量的定义

关于变量的命名: 变量名对字母的大小写是敏感的, 一般而言, 对于你自己创建的局部变量, 一般以小写字母命名. 变量名中只能含有字母(可大小写混用)和数字, 且不能以数字开头.

一般而言, 环境变量(全局变量)名全为大写字母或特殊字符组成; 局部变量由小写字母组成.

变量以这样的格式定义: (export) VARNAME="value".

定义局部变量

VARNAME="value"形式定义的变量为"局部变量": 它只对当前shell可见, 而对当前shell的子shell是透明的.

注意=号两边不能有空格. 而且最好将变量值用""引用起来, 如果变量值中含有空格, 一定要被引用, 否则bash将把字符串空格之后的部分当作命令来解释.

实际上, 还有一种给变量赋值的方法, 即使用"read"命令.
$ read great
hello, world!
$ echo $great
hello, world!
使用这种方法, 即便变量值中含有空格, 也不需要引用. read用在脚本中, 可用于读取用户的输入!

未被声明, 即不存在的变量被假设为null, 即"". 用echo输出它们时, 显示的是一个空行.
被声明但未被初始化的变量, l或被初始化, 但被unset的变量值也是null.

定义环境变量

在上面创建变量的例子中, VARNAME="value", 此时VARNAME的值只对当前shell可见, 所以该变量被称为"局部变量". 在当前shell中新开一个子shell ,该变量对子shell是不起作用的. 要使定义的变量对子shell有效, 必须"输出(export)"它. 此时的变量就成为了"环境变量".
格式: export VARNAME="value" : 变量的定义和输出只需要一条语句, 在定义语句之前加上export.

子shell能够够更改父shell给它输出的环境变量, 但该更改只对子shell本身有效.

bash中存在一些默认保留的环境变量, 可以使用echo查看它们的值:

$HOME    当前用户的home目录.
$PATH      默认可执行命令目录, 它们之间由:分隔.
$PS1       命令提示符, 一般在$之前显示一些用户, 系统, 当前目录信息.
$PS2       2级命令提示符, 一般为>
$IFS         用来分隔输入, 一般为空格, tab, 回车
$0           脚本名称. (注意使用不同的方法运行脚本, 显示的脚本名称不一样)
$#           传递参数的个数
$$           当前脚本的进程号. 通常用来产生唯一的临时文件名.

四, 位置参数变量

若执行脚本时给它传递了参数, 还会伴随地创建一些参数变量.
$#          参数个数, 即便未传递参数, 它也存在,, 为0.
$1, $2...  对应的第n个䒈参数
$*           所有参数
$@         同$*, 但它不使用IFS来分隔参数.

$ set one two three
$ echo $1 $2
one two
$ IFS=''
$ echo "$*"
onetwothree
$ echo "$@"
one two three

五, shell保留的变量

六, 特殊参数
The shell treats several parameters specially. These parameters may only be referenced; assignment to them is not allowed.


变量的引用

定义变量后, 通过美元符号"$"来用变量值替换变量名. 实际上$var是${var}的简化形式, 在$var出现问题的情况下,可以尝试用${var}, 默认还是用$var.

这里要注意''和""的引用. 一般而言, 我们最好把想用echo输出的字符窜用引号引用起来. 在这种情况下, 是用'', 还是""呢?
''和""的区别: ''是强引用(全引用), ""是弱引用(部分引用).

强引用''会将字符串中的特殊字符屏蔽, 如同在特殊字符之前加上了转义字符/.

弱引用""不会屏蔽特殊字符. ""中的变量前如果有$, 变量将被替换为相应的值. 而''中$和之后的变量名不会被替换.
比如:
$ name=zp
$ echo "my name is $name"
my name is zp
$ echo 'my name is $name'
my name is $name
$ echo my name is /$name
my name is $name
实际上, $ echo my name is $name 也能得到正确的结果, 但不推荐这样做, 如果有多个空格分隔的字符窜, 应该把它们引用起来.
我们看看这一句:
$ echo "my '$name' is $name"
会输出这样的结果:
my 'zp' is zp
$ echo "my /$name is $name"
my /zp is zp
可以看到, ""引用中的$var会被替代成变量的内容, 不管它是否被强引用符引用.

一般而言, 应该遵循这样的规则: 如果字符窜中包含变量, 则用""引用, 否则, 用''引用.

notes
1, "$var"和$var有什么区别?
看看这个例子: hello=a b c d    e
$ echo $hello
a b c d e
$ echo $"hello"
a b c d    e
加上了""引用, 变量中的空格将保留, 否则多个空格被bash读取为一个空格.

2, 将变量值设为null与unset它有什么区别?
注意: 对于未定义的变量, 它的值为null. 若这样定义: $ var= , 或者赋予它一个不存在的变量值, $ var=$nonexistval.那它的值也被设置为null.
注意: 不要尝试使用未被赋值的变量! (在算术运算中可以使用,但这样做不好).


关于变量的高级主题

变量类型
前面提到, 按照变量类型,可分为: 字符窜变量, 整数变量, 常数变量, 数组变量.

虽然变量可以分为这些类型, 但在给变量赋值时可以给一个变量赋任意类型的值:
$ VAL=10
$ echo $VAL
10
$ VAL=hello
$ echo $VAL
hello
可以把整数, 字符窜赋予同一个变量.

在某些情形下, 需要将变量限制为某个特定的类型, 这就需要使用bash内嵌的declare命令了.

declare OPTION(s) VARIABLE=value

option:
-a 变量是一个数组
-f 只使用函数名
-i 变量被视为一个整数, 当它被赋值后, 可以对变量进行算术运算.
-p 显示变量是如何被声明的, 当-p使用时, 其他的option被忽略.
-r 变量是只读的, 这些变量不能被赋新值, 也不能被unset.
-t 赋予变量trace属性.
-x 将变量输出为环境变量.

$ declare -i VAL=12
$ echo $VAL
12
$ VAL=hello
$ echo $VAL
0
$ declare -p VAL
declare -i VAL="0"

注意, 上述的hello会被bash当作一个整数值(0).

上面的这些option只用于声明一个数值变量, 对于字符窜变量, 不使用option.

$ VAL1=10
$ declare -p VAL1
declare -- VAL1="10"

将表中的-改为+, 则关闭这些属性.
针对上面的VAL:
$ declare +i VAL=hello
$ echo $VAL
hello
$ declare -p VAL
declare -- VAL="hello"

如果declare被用在函数中, 则声明一个局部变量.

声明常量 (constant)
常量被声明后不能被修改, bash中使用readonly这个内嵌命令来声明常量:

readonly OPTION VARIABLE(s)

If the -f option is given, each variable refers to a shell function. If -a is specified, each variable refers to an array of variables. If no arguments are given, or if -p is supplied, a list of all read-only variables is displayed. Using the -p option, the output can be reused as input.

$ readonly VAL2=100
$ VAL2=100
bash: VAL2: readonly variable

变量的扩展

算术扩展
在脚本中进行算术操作有两种方式:
1, 使用expr命令, 例如, 要将x的值加1, 可采用下列的命令:
$ x=1
$ x=$(expr $x + 1)
$ echo $x
也可使用 $ x=`expr $x + 1`. 实际上这就是将expr命令执行的结果赋予x了.

2, 使用算术扩展: $ ((...)), 下面的命令可以达到上述命令的效果, 并且速度更快:
$ x=1
$ x=$((x+1))
$ echo $x

注意 $((...))和$ (...)的区别, 前者用于算术扩展, 后者用于执行命令, 并输出结果.



阅读(409) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~