目录
概念
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
变量基础
常见shell变量的类型包括:
自定义变量:由用户自己定义,修改和使用
环境变量:由系统维护,用户设置工作环境
只读变量:只可以读取不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:bash中内置的一类变量,不能修改 规定好的变量放在那里让你使用
系统内置变量:PATH,UID,HOSTNAME,USER
命名要求
区别大小写
不能使程序中的保留字和内置变量:如:if,for,hostname 命令a=
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线“_”,和主机名相反
不要使用内置变量,使用英文尽量使用词义通俗易懂,PATH
大驼峰StudentFirstName
小驼峰studentFirstName
下划线student_name
1、赋值时使用双引号("")可以直接调用变量
2、赋值时使用单引号('')$只会被认为是字符$不会调用变量
3、赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结果和$( ) 用法相同
4、{}可以分隔变量值
read
可以使用bash的内置命令read来给变量赋值。read命令用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入一行内容,并以空格为分隔符,江都入的各字段挨个赋值给指定的变量(多余的内容赋值给最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量。
- -p 提示信息
- -t 输入等待时间(单位默认为秒)
变量作用范围
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
例如:直接执行bash进入一个新的子shell脚本后,将无法引用父级shell环境中定义的Product、Version等变量。
可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用。
方法:
1、格式1:export 变量名
2、格式2:export 变量名=变量值
可以使用pstree查看shell环境
输入bash进入子shell
ctrl+D组合exit退出子shell
整数运算
expr只能进行整数的运算
格式:expr变量1 运算符 变量2 [运算符 变量3]
运算符:
运算符 | 意义 |
++-- | 增加及减少,可前置也可以放到结尾 |
\* / % | 乘法、除法、取余 |
+ - | 加法、减法 |
< <= > >= | 比较符号 |
== != | 等于与不等于 |
& | 位的与 |
^ | 位的异或 |
| | 位的或 |
&& | 逻辑的与 |
|| | 逻辑的或 |
?: | 条件表达式 |
= += -= *= /= %= &= ^= <<= >>= |= | 赋值运算符a+=1 相当于a=a+1 |
需要注意的是乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符。
[root@mjy ~]# X=35
[root@mjy ~]# Y=16
[root@mjy ~]# expr $X+$Y
35+16
[root@mjy ~]# expr $X + $Y
51
[root@mjy ~]# expr $X - $Y
19
[root@mjy ~]# expr $X \* $Y
560
[root@mjy ~]# expr $X / $Y
2
[root@mjy ~]# expr $X % $Y
3
#加减乘除前后有空格
使用expr进行运算时,变量必须是整数,不能是字符串,也不能含小数,否则会出错(命令的退出状态为非0)
[root@mjy ~]# i=hi
[root@mjy ~]# expr $i + 58expr
expr: 非整数参数
[root@mjy ~]# echo $?
2
[root@mjy ~]#
1、let var=算术表达式
let sum=1+2
sum=1+2
2、$((var=算术表达式))和上面等价
((sum=1+2))
echo $sum
3、var=$[算术表达式]
4、var=$((算术表达式))
5、var=$(expr arg1 arg2 arg3 ...)
6、var=`expr arg1 arg2 arg3 ...)
7、echo '算术表达式' | bc
let
支持加加减减 使用较多
[root@mjy ~]# i=1
[root@mjy ~]# let i++
[root@mjy ~]# echo $i
2
[root@mjy ~]# i=1;let i++;echo $i
2
[root@mjy ~]# i=1;let ++i;echo $i
2
[root@mjy ~]# i=6;let j=i++;echo $i $j
7 6
[root@mjy ~]# i=6;let j=++i;echo $i $j
7 7
#i++ 先赋值给j后再加 ++i是加后再赋值
特殊变量
1、环境变量
是指处于运行需要而由linux系统提前创建的一类变量,主要用于设置用户的工作环境,环境变量值由Linux系统自动维护,会随着用户状态的改变而改变。
使用env命令可以查看到当前工作环境下的环境变量。
[root@mjy ~]# env 选取部分内容
USER=root
#表示用户名称
HOME=/root
#表示用户的宿主目录
HOSTNAME=mjy
#表示主机名
LANG=zh_CN.UTF-8
#表示语言和字符集
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#表示可执行用户程序的默认路径
PWD=/root
#表示当前所在工作目录
SHELL=/bin/bash
#表示shell 路径
PATH变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux系统将在PATH变量指定的目录范围查找对应的可执行,如果找不到则会提示“command not found”。例如,first.sh脚本
环境变量的全局配置文件
在Linux系统中,环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。除此之外,每个用户还有自己的独立配置文件(~ /.bash_profile)。若要长期变更或设置某个环境变量,应在上述文件中进行设置。
2、位置变量
执行操作命令行操作时,第一个字段表示命令或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
使用$1、$2、$3、...、$9表示。$0表示命令或脚本本身的名称,虽然$0与位置变量格式相同,但$0属于预定义变量而不是位置变量。
3、预定义变量
由bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,不能创建新的预定义变量,也不能为预定义变量赋值
- $#:表示命令行中位置参数的个数
- $*:表示所有位置参数的内容
- $?:表示前一条命令执行后的返回状态,返回值 0 表示执行正确, 返回任何非 0值均表示执行出现异常
- $0:表示当前执行的脚本或程序的名称 当前脚本的名字
- $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
- $$:当前bash的进程id
- $!: 后台任务最后一个id