一、shell脚本变量
1.变量的作用
shell变量用来存放系统和用户需要使用的特定参数,而且这些参数可以根据用户的设定或系统环境的变化而相应变化,通过使用变量,shell程序能够提供更加灵活的功能,适应性更强
1.变量名:使用固定的名称,由系统预设或用户定义
2.变量值:能够根据用户设置、系统环境的变化而变化
2.变量作用范围
新定义的变量默认只能在当前的shell环境中生效,被称为局部变量,当进入子程序或新的子shell环境时局部变量就无法继续使用了,如果想要在子程序或新的子shell环境使用变量可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子shell环境中能够继续使用
export是内部命令
export格式:export 变量名=变量值
临时设置变量:
如果需要永久设置变量,需要在/etc/profile文件中添加:
3.删除变量
删除变量格式:unset 变量名
二、变量的类型
自定义变量:由用户自己定义、修改和使用
特殊变量:环境变量、只读变量、位置变量、预定义变量
环境变量 | 系统维护,用于设置工作环境 |
只读变量 | 只可以读取不可以更改 |
位置变量 | 通过命令行给脚本传递参数 |
预定义变量 | Bash中内置的一类变量,不能修改,有些规定好的变量,放在那里让你使用 |
1.自定义变量
命名要求:
1.区分大小写
2.只能使用数字、字母及下划线且不能以数字开头
3.不要使用内置的变量,使用英文尽量使用词义通俗易懂
4.不能使程序中的保留字和内置变量,如:if、for、hostname等
5.大驼峰:StudentFirstName
6.小驼峰:studentFirstName
7.下划线:student_name
赋值时使用符号:
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:命令替换,提取命令执行后的输出结果,``和$(...)作用相同
{}:分隔变量值
定义变量时中间有特殊字符,如空格,可以使用单引号或双引号
方法一:
方法二:
2.环境变量
env查看当前工作环境中的环境变量:
配置文件:/etc/profile(全局生效)、~/.bash_profile(当前用户环境)
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会有新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用
常用环境变量:
1.$USER:表示用户名称
2.$HOME:表示用户的宿主目录
3.$LANG:表示语言和字符集
4.$PWD:表示当前所在工作目录
5.$PATH:表示可执行用户程序的默认路径
设置系统根据环境变量自动设置可执行程序:
3.只读变量
readonly命令用于定义只读shell变量和shell函数,readonly命令的选项-p可以输出显示系统中所有定义的只读变量
命令格式:readonly 选项 参数
1.变量值不允许修改(重新赋值)的情况
2.无法使用unset删除
3.最快方法重启
4.位置变量
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量
$n:n为任意数字,$0代表命令本身,$1-$9代表一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为${10}
输出对应位置内容(第2.5.10个位置内容)
使用位置变量进行加法运算
5.预定义变量
系统直接定义好的变量,直接使用即可
$* | 表示所有位置参数的内容看成一个整体返回 |
$@ | 表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 |
$? | 表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常 |
$# | 表示命令行中位置参数的总个数 |
$0 | 表示当前执行的脚本或程序的名称,即当前脚本的名字 |
$$ | 当前进程ID |
$! | 后台任务最后一个ID |
三、整数变量的运算
shell默认只支持整数的运算
命令格式:expr 变量1 运算符 变量2 [运算符 变量3]
运算符:+(加法)、-(减法)、\*(乘法)、/(除法)、%(取余)
常见的运算表达式:(result代表自定义变量,可用任意代替)
result=$(expr 变量1 运算符 变量2)
result=$((变量1 运算符 变量2))
result=$[变量1 运算符 变量2]
let result=变量1 运算符 变量2
i++相当于i=$[$i+1] (i++是先赋值再运算)
i--相当于i=$[$i-1]
i+=1相当于i=$[$i+1]
例子:(a=10,b=20)
格式:result=$(expr 变量1 运算符 变量2)
数字运算:i=$(expr 10 \* 20)
变量运算:i=$(expr $a \* $b)
格式:result=$((变量1 运算符 变量2))
数字运算:e=$((10*20))
变量运算:e=$(($a*$b))
格式:result=$[变量1 运算符 变量2]
数字运算:j=$[10*20]
变量运算:j=$[$a*$b]
格式:let result=变量1 运算符 变量2
数字运算:let m=10*20
变量运算:let m=$a*$b