1.变量的概念
顾名思义,变量就是一个可以变化的量。从本质来讲,变量就是在程序中保存用户数据的一块内存空间,变量名就是这块内存空间的地址,也就是“键”。用户使用变量就是通过“键”来存取不同的值。
在程序的执行过程中,保存数据的内存空间里面的内容可能会不断的发生改变,但是代表内存地址地址的变量名是始终未变的。
变量是写入内存的,当计算机重启后数据就会丢失,若要数据保存就得写入磁盘。
2.变量的命名
变量的命名简单来说,就是把A的值放到B这个内存空间里面,例如:
如图我们把A的值放到以B为名的内存空间里面,通过echo调用以B为名的内存空间,出现的数据就是A
变量名的命名,没有做明确的规范,只是规定了以字母或下划线开头,由字母数字下划线组成的任意长度字符串,但是为了方便阅读,尽量使用简短明确的单词来命名。
3.变量的类型
shell不同于c语言的数据类型,它不强制要求类型定义。是一种动态类型和弱语言,与python类似,变量无需特别声明数据类型。也可以说shell没有数据类型,任尔东西南北风,我还是一段字符串。
可以看出x的变量类型从整型直接变成了字符串,然后定义成只读后,就不能修改了。
4.变量的定义
前面我们说了,shell的数据是动态的,但是如果我们在程序里有一个变量是贯穿始终的,那么就得给它定义,
例如:declare -i 将变量定义为整型,结果只能是整数,否则会报错。
declare 命令常用属性如下:
序号 | 选项 | 释义 |
1 | -f | 限制动作或显示为只函数名称和定义 |
2 | -F | 限制仅显示函数名称 (以及行号和源文件名,当调试时) |
3 | -g | 当用于 shell 函数内时创建全局变量; 否则忽略 |
4 | -p | 显示每个 NAME 变量的属性和值 |
5 | -a | 使 NAME 成为下标数组 (如果支持) |
6 | -A | 使 NAME 成为关联数组 (如果支持) |
7 | -i | 使 NAME 带有 `integer' (整数)属性 |
8 | -l | 将 NAME 在赋值时转为小写 |
9 | -n | 使 NAME 成为指向一个以其值为名称的变量的引用 |
10 | -r | 将 NAME 变为只读 |
11 | -t | 使 NAME 带有 `trace' (追踪)属性 |
12 | -u | 将 NAME 在赋值时转为大写 |
13 | -x | 将 NAME 导出 |
5.变量的作用域
shell中作用域有四种
1.全局变量
就是在当前shell进程中使用的变量,在脚本中定义的变量都是全局变量,它的作用域从被定义的地方开始,一直到shell脚本结束或被重新赋值。
代码:
输出:
分析输出结果:
1.第一个输出的是x=3(虽然函数写在前面,但是并没有使用这个函数),此时整个shell里x的值为3
2.调用函数后输出,先输出在函数内第一次定义的全局变量x=1,然后我们改变了x的值x=2,此时在x的值没有重新赋值之前,在整个shell里x的值都是2,不管是在函数内还是函数外;
3.我们重新定义了x的值为500,此时全局也就是整个shell内,x的值都是500
加一行,我们重新定义一个函数让他输出x,不出意外的话x的值为500
ok,
2.局部变量
局部变量就是只能作用于函数内部的变量,不能作用于全局,加上local 就变成了局部变量
代码:
输出:
分析:
1.这次先定义了全局变量x=1,然后调用函数func,函数内部定义了,局部变量x=2
2.可以看出函数内x的确是2,但是我们在函数外部调用x的值时x还是1,也就是说我在函数内部给x赋值并不能替换掉全局的x=1,
3.系统变量
shell语言的系统变量主要用在判断脚本和函数的参数,以及脚本和函数的返回值判断时使用,
变量 | 说明 |
---|---|
$n | n是一个参数,从1开始表示参数的位置,例如:$1表示第一个参数,$2表示第二个参数 |
$# | 命令行参数的个数 |
$0 | 当前shell脚本的名称 |
$? | 前一个命令或者是函数的返回状态码,0代表执行成功,非0即失败 |
$* | 以”参数1参数2....“的形式将所有函数通过一个字符串返回 |
$@ | 以”参数1“”参数2“....的形式返回每个参数 |
$$ | 显示本程序的PID(进程ID) |
代码:
输出结果
3.环境变量
shell的环境变量就是所有的shell程序都可以使用的变量。全局变量只在当前 Shell 进程中有效,对其它 Shell 进程和子进程都无效。使用export命令可以将全局变量导出,那么它就在所有的子进程中也有效了,这称为“环境变量”。环境变量被创建时所处的 Shell 进程称为父进程,如果在父进程中再创建一个新的进程来执行 Shell 命令,那么这个新的进程被称作 Shell 子进程。当 Shell 子进程产生时,它会继承父进程的环境变量为自己所用,所以说环境变量可从父进程传给子进程。不难理解,环境变量还可以传递给孙进程。
常见的环境变量
变量 | 解释 |
---|---|
PATH | 命令搜索路径,以冒号为分隔符 |
HOME | 用户主目录的路径名,是cd的默认参数 |
COLUMNS | 定义了命令编辑模式下使用命令行的长度 |
HISTFILE | 命令历史记录 |
HISTSIZE | 命令历史记录中最多可包含的命令条数 |
HISTFILESIZE | 命令历史文件中包含的最大行数 |
IFS | 定义shell使用的分隔符 |
LOGNAME | 当前登录的用户名 |
SHELL | shell的全路径名 |
TERM | 终端类型 |
TMOUT | Shell自动退出的时间,单位为秒,若设为0就是禁止shell自动退出 |
PWD | 当前工作目录 |
导出环境变量实例:
6.变量赋值和清空
变量赋值
用户可以通过变量的赋值操作来实现变量的声明并赋予一个特定的值。并且可以通过赋值语句为一个变量多次赋值,改变其数值。
变量名=*值
如:
x=linux
y='Redhot linux'
z="centos is "
m=123456
如果赋值的这边包含制表符,换行符,空格,就必须用单引号或双引号引用起来,双引号允许变量替换,单引号不可以。
此外,shell只支持包含数字的变量值参与数值运算。
引用变量名
$在前,变量在后面,变量名后面不要紧跟字符
清除变量
unset加变量名
因为unset清除了变量,所以echo返回空值
7.变量的引用
符号 | 解释 |
---|---|
双引号 | (部分引用)除美元,单引号,双引号和反斜线之外,其他字符保持原字面意思 |
单引号 | 全引用(即所有字符原封不动,保持原有意思) |
反引号 | 反引号中的字符串被解释为shell命令 |
反斜线 | 转义字符,屏蔽后面字符的特殊意义 |