前言
变量:字面意思就是会变化的量,用来存放数据的容器,可以理解为桶和水的关系,桶就是可量的容器,水就是这个桶需要存放的具体的物体。变量在每个语言中都是非常重要和存在的,不通的语言有不同的用法,但是根本都是一样的,就是一个载体。
1. 变量的规范和格式
1.1 格式
变量名 = 变量值
注:shell 中变量的赋值为直接赋值,直接修改变量的值即可,对变量值的修改,变量是临时的存储在内存中,所以断电或其他使内存数据丢失的行为变量都会消失,除非写入配置文件中。
1.2 变量的规范
-
不能以数字开头,或者纯数字作为变量
# 不正确的写法 1_age=20; 1="zhangsan"
-
不能含除了“_” 以外的特殊字符作为变量
# 不正确的写法 name#="zhangsan" ; @name="姓名"
-
不能使用系统内置变量
-
建议自定义的变量一般为小写,系统变量为大写;
# name='李四'; JAVA_HOME=/app/jdk1.8 ; PATH=$PATH:$JAVA_HOME/bin
-
建议驼峰命名法,简明知意
#驼峰命名
colorStyle='red'; empNum=1010
2.变量的分类
2.1 位置变量
用来指定位置传参使用,一般在执行脚本时参数需要通过外部传输进脚本内,就可以在脚本内使用位置变量来接收外部的入参。
用法:$1,$2,$3,… #这里的数字即代表入参的位置
[root@test ~]# cat positionVar.sh
#! /bin/bash
# 定义三个变量,姓名,年龄,出生日期
uname=$1
age=$2
birth=$3
# 打印上述信息
echo -e "姓名:$uname\n年龄:$age\n生日:$birth"
# 在执行脚本时,脚本后面的参数用空格分隔,对应位置参数1,2,3
[root@test ~]# sh positionVar.sh "小明" 25 "2021-04-07"
姓名:小明
年龄:25
生日:2021-04-07
2.2 预定义变量
bash 内部的变量,可以引用但不可以赋值
示例:
####### 预定义变量如下 ############
$0 # 显示当前脚本名称或者程序名
$$ # 显示当前的进程号 pid
$# # 显示当前位置变量的个数
$? # 显示上一个命令的执行结果:0:成功,非0:失败 -- 常用做命令执行的成功与否
$* # 显示变量的信息
$! # 最近一次执行的进程号
2.3 环境变量
环境变量一般是用于操作系统内部使用的变量,在linux中全局的环境变量配置文件 /etc/profile, 用户家目录下的.bash_profile;如PATH 变量。
2.4 自定义变量
顾名思义用户自定义的变量
name='swuk';emp="wangwu" # 可以使用单引号或者双引号,当使用单引号时里面带有变量名不生效
3.变量的范围与引用
3.1 引号的运用
‘’ # 单引号,会屏蔽特殊符号比如:$
echo '$PATH'
结果:
$PATH
“” # 双引号, 不会屏蔽特殊符号
echo "$PATH"
结果:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
`` # 反引号,命令是输出结果做为值,赋值给变量;
name=`echo zhangsan`
echo $name
结果:
zhangsan
3.2 变量的引用
变量的引用使用$符号
用法:${变量名} 或者 $变量名
# ${变量名} 这种写法在理解和一些特殊场合都可以适用的
x=ab
y=c
echo ${x}${y}
结果:abc
# $变量名
x=ab
y=c
echo $x$y
结果:abc
3.3 变量的范围
全局变量:在当前进程或其他进程中都是有效的,比如PATH等变量,通常被export 关键字修饰的变量都是全局变量。
[root@svr7 ~] # export a=123 #定义全局变量
[root@svr7 ~] # echo $a
123
[root@svr7 ~] # bash #开启一个子进程
[root@svr7 ~] # echo $a
123
局部变量:只在当前进程中有效,未被exprot 关键字修饰的变量
[root@svr7 ~] # a=123 #定义局部变量
[root@svr7 ~] # echo $a
123
[root@svr7 ~] # bash #开启一个子进程
[root@svr7 ~] # echo $a
总结
这里简单的介绍了一下变量的用法,但在时间的工作中位置变量和预定义变量在shell脚本中用得还是比较多的,老铁们有空可以练习记忆一些。