【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 为系统预留的错误状态码,其他状态码可自定义;

${@:起点} 表示由起点开始(包括起点),取得后面的所有的位置参数

${@:起点:个数} 表示由起点开始(包括起点),取得指定个数的位置参数

$@ $* 在被双引号包起来才会有差异,"$*" 传递给脚本全部参数合为一个字符串;"$@" 传递给脚本的每个参数都为独立字符串。

位置变量不能被继承 ,只有环境变量可以被继承。

posted @ 2021-11-12 11:39  巫安生  阅读(93)  评论(0编辑  收藏  举报