bash笔记-02-变量
时间:2006-07-15 来源:zzzppp
变量的分类
变量有两种分类方式:
按照变量作用域, 可分为环境变量和局部变量
1, 环境变量: 对所有的bash进程有效, 可使用下面的命令来显示全局变量:
$ env or: $ printenv
全局变量名默认大写的字母组成.
2, 局部变量: 只对当前bash进程有效, 可用set命令来显示它们:
$ set
按照变量类型, 可分为: 1, 字符窜变量; 2, 整数变量; 3, 常数变量; 4, 数组变量.
变量的定义
关于变量的命名: 变量名对字母的大小写是敏感的, 一般而言, 对于你自己创建的局部变量, 一般以小写字母命名. 变量名中只能含有字母(可大小写混用)和数字, 且不能以数字开头.
变量以这样的格式定义: (export) VARNAME="value".
定义局部变量
以VARNAME="value"形式定义的变量为"局部变量": 它只对当前shell可见, 而对当前shell的子shell是透明的.
注意=号两边不能有空格. 而且最好将变量值用""引用起来, 如果变量值中含有空格, 一定要被引用, 否则bash将把字符串空格之后的部分当作命令来解释.
实际上, 还有一种给变量赋值的方法, 即使用"read"命令.
$ read great
hello, world!
$ echo $great
hello, world!
使用这种方法, 即便变量值中含有空格, 也不需要引用. read用在脚本中, 可用于读取用户的输入!
定义环境变量
在上面创建变量的例子中, 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命令了.
option:
$ 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这个内嵌命令来声明常量:
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
变量有两种分类方式:
按照变量作用域, 可分为环境变量和局部变量
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
注意 $((...))和$ (...)的区别, 前者用于算术扩展, 后者用于执行命令, 并输出结果. |
相关阅读 更多 +