【SHELL编程】shell变量
变量操作
创建变量
在当前bash中创建一个变量,使用 “变量名=变量值”即可,如:var=123
注意:等号两端不能有空格,否则就不是赋值了。
也可以使用declare声明一个变量并设置变量的属性
# 声明变量
declare var=123
# 声明整型变量,本质为字符串,但当做数字进行运算
declare -i var=0
# 声明只读环境变量
declare -rx PI=3.1415
#参数说明
+/- "-"可用来指定变量的属性,"+"则是取消变量所设的属性。
r 将变量设置为只读。
x 指定的变量会成为环境变量,可供shell以外的程序来使用。
i [设置值]可以是数值,字符串或运算式。
-f 仅显示函数。
使用变量
变量的使用有两种引用形式,$var 或 ${var}
大多数情况下,两种形式都可以,但是涉及到变量名边界的时候,必须带上大括号,如下面例子:
[root@localhost ~]# a=123
[root@localhost ~]# b=456
[root@localhost ~]# echo $a
123
[root@localhost ~]# echo $b
456
[root@localhost ~]# echo $ab
[root@localhost ~]# echo ${a}b
123b
[root@localhost ~]# echo a$b
a456
[root@localhost ~]# echo a${b}
a456
删除变量
撤销变量(释放变量)可以使用unset命令,语法为:unset 变量名
;
unset命令也可以撤销函数,语法为:unset -f 函数名
如下例子,当变量被释放之后,再次echo输出为空:
[root@localhost ~]# var=123
[root@localhost ~]# echo $var
123
[root@localhost ~]# unset var
[root@localhost ~]# echo $var
[root@localhost ~]#
脚本中定义的变量在执行完成后会自动撤销,但建议在脚本中及时释放变量,形成良好的编程习惯;
如果常驻后台执行的脚本,最好检查相应变量是否及时释放。
变量类型
本地变量(全局变量和局部变量)
本地变量的作用域:本地变量只在当前bash进程中有效,对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;
局部变量的作用域:局部变量只对当前函数或代码段有效,语法:
local var=value
;
在函数中不使用local关键字,变量将被重新赋值,只有在函数中使用local关键字声明才不会影响到函数外的变量值。
例子如下:
# 不添加local关键字
[root@localhost ~]# cat << EOF > test.sh
> #!/bin/bash
> var=first
> echo $var
> function double() {
> var=two
> echo $var
> }
> double
> echo $var
> EOF
[root@localhost ~]# ./test.sh
first
two
two
# 不添加local关键字
[root@localhost ~]# cat << EOF > test.sh
> #!/bin/bash
> var=first
> echo $var
> function double() {
> local var=two
> echo $var
> }
> double
> echo $var
> EOF
[root@localhost ~]# ./test.sh
first
two
first
环境变量
环境变量的作用域:环境变量的生效范围为当前shell进程及其子进程
使用export关键字指明对应的变量为环境变量,语法为:export var=value
也可以先声明本地变量再导出为环境变量,步骤如下:
var=123abdc
export var
命令行中直接执行的shell脚本在执行时会启动一个shell子进程,子进程会继承当前shell的环境变量;
系统自动执行的shell脚本(非命令行中执行,如cron)需要自定义各种环境变量,或者导入已经存在的环境变量;
使用source命令执行脚本不会启动子进程,而是在当前shell上执行,可以使用本地变量,点(.)是source的另一种写法。
只读变量
语法:readonly pai=3.1415926
- 只读变量相当于常量
- 只对当前bash生效
- 子shell不能使用
- 设置后不可修改,只能读不能改
- 不能使用unset释放
- 退出当前shell才能让只读变量失效
子孙shell要继承当前shell的只读变量,需要将只读变量设置成环境变量,使用如下方法:export readonly pai=3.1415926
特殊变量的用法
特殊变量在脚本中使用的频率比较高,如:$0、$?、$!、$$、$*、$#、$@ 等
变量 | 说明 |
---|---|
$$ |
Shell本身的PID(ProcessID) |
$! |
Shell最后运行的后台Process的PID |
$? |
最后运行的命令的结束代码(返回值) |
$- |
使用Set命令设定的Flag一览 |
$* |
所有参数列表。如"$*"用双引号括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$@ |
所有参数列表。如"$@"用双引号括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 |
$# |
添加到Shell的参数个数 |
$0 |
Shell本身的文件名,执行时包含路径脚本名,如:./test.sh |
$1~$n |
添加到Shell的各位置参数值。$1是第1参数、$2是第2参数…。 |
$?
保留了上一个命令的执行状态返回值(0-255),0为正确执行,非零表示执行错误;1、2、127 为系统预留的错误状态码,其他状态码可自定义;
${@:起点}
表示由起点开始(包括起点),取得后面的所有的位置参数
${@:起点:个数}
表示由起点开始(包括起点),取得指定个数的位置参数
$@ $*
在被双引号包起来才会有差异,"$*"
传递给脚本全部参数合为一个字符串;"$@"
传递给脚本的每个参数都为独立字符串。
位置变量不能被继承 ,只有环境变量可以被继承。