shell脚本变量基础教程
3 变量
3.1 变量的定义
【定义】变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据
=
3.2 变量类型
变量类型(按定义方式):
- 内置变量,如:PS1,PATH,HISTSIZE
- 用户自定义变量
=
不同的变量存放的数据不同,决定了:
- 数据存储方式
- 参与的运算
- 表示的数据范围
=
变量数据类型:
- 字符
- 数值:整型、浮点型(bash 不支持浮点数)
- -
=
3.3 编程语言分类
静态和动态语言
静态编译语言:使用变量前,先声明变量类型,之后类型不能改变,在编译时检查,如:java,c
动态编译语言:不用事先声明,可随时改变类型,如:bash,Python
强类型和弱类型语言
强类型语言:不同类型数据操作,必须经过强制转换才同一类型才能运算,如java , c# ,python
弱类型语言:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会
自动进行隐式类型转换;变量无须事先定义可直接调用;如:bash ,php,javascript
bash 是动态编译、弱类型语言
- -
=
3.4 Shell 中变量命名法则
- 不能使程序中的保留字(if,for)和内置变量
- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”
- 见名知义,用英文名字,并体现出实际作用
- 统一命名规则:驼峰命名法, studentname,大驼峰StudentName 小驼峰studentName
- 变量名大写
- 局部变量小写
- 函数名小写
- -
=
3.5 变量定义和引用
1 按作用范围分类
根据变量的生效范围划分:
- 普通变量:生效范围为当前shell进程
对其它shell进程(包括当前shell的子shell进程)均无效 - 环境变量:生效范围为当前shell进程及其子进程
- 本地变量:生效范围为当前shell进程中某代码片断,通常指函数
=
2 变量赋值方式
name='value'
# value 可以是以下多种形式
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
# 多行赋值:
name="
[root@centos8/~]# NAME="jack
> tom
> poly
> "
[root@centos8/~]# echo $NAME
jack tom poly
3 变量追加赋值
NAME+= 追加赋值
[root@centos8/data]# NAME+='zhubazi'
[root@centos8/data]# echo $NAME
caokunzizhubazi
=
4 变量引用
引用格式
$name
${name}
# 连续输入变量,为防止混淆误判,必须使用{ }来表示完整变量
比如
[root@centos8/data]# echo $AGE
24
[root@centos8/data]# echo $NAME_$AGE
24
[root@centos8/data]# echo ${NAME}_$AGE
caokunzi_24
# 无特殊要求时,直接输入空格隔开即可
[root@centos8 ~]# NAME=jack
[root@centos8 ~]# AGE=34
[root@centos8 ~]# echo $NAME $AGE
jack 34
=
5 弱引用和强引用
记忆:单引号六亲不认
"$name"
弱引用,其中的变量引用会被替换为变量值'$name'
强引用,其中的变量引用不会被替换为变量值,而保持原字符串
[root@centos8/data]# echo "$NAME"
caokunzi
[root@centos8/data]# echo '$NAME'
$NAME
# 注:反单引号表示单行赋值中的命令引用
=
6 引用命令执行结果
注意加不加引号的区别
[root@centos8 ~]# CMD=`hostname` # 反引号表示执行命令,将执行结果赋值!!!
[root@centos8 ~]# $CMD
-bash: centos8: command not found
[root@centos8 ~]# echo $CMD
centos8
[root@centos8/~]# CMD=hostname # 表示直接将命令本身赋值!!!
[root@centos8/~]# $CMD
centos8
[root@centos8/~]# echo $CMD
hostname
=
7 变量的定义与删除
set 显示已定义的所有变量
unset NAME 删除变量
# 若在子shell中用unset删除自定义环境变量,父shell中不会失效
=wan