变量
变量就是⽤⼀个简单的好记的字符串,来取代⽐较复杂或者容易变动的数据。变量分类:预定义变量、环境变量、自定义变量、位置变量。
1、变量的设定规则
- 变量名与变量内容以⼀个等号 = 的连结,且等号两边不能有空格。
- 变量名称只能是英⽂字⺟与数字,但是开头字符不能是数字。
name1=xiaobai #正确示例
2name=xiaobai #错误示例
name3 = xiaobai #错误示例
2、变量的使用
- 变量内容中若有空格可以使⽤双引号或单引号(一定是英文符号)将变量内容组合起来,双引号内的特殊字符仍保有原本的特性,单引号内则全部视为普通字符。
#双引号
name=xiaobai #定义name为变量
name2="I am $name" #使用双引号并定义一个新的变量
echo $name2
I am xiaobai #新变量的结果
#单引号
name3='I am $name' #单引号定义新变量
echo $name3
I am $name #新变量的结果
- 感叹号在shell命令⾏⾥不可以用在双引号⾥,但是可以在脚本中使⽤。
- 可⽤转意符 \ 将特殊符号(如 [Enter] , $ , \ , 空格符 , 等)变成⼀般字符。
- 在一串命令中,还需要藉由其他的命令提供的信息,可以使⽤反单引号 `命 令` 或 $(命 令),(注意:反引号不是单引号)。
version=$(uname -r)
echo $version
3.10.0-957.el7.x86_64 #version的值就是uname-r查看的值
- 增加变量的内容时,则可⽤ "$变量名称"字符串 或 ${变量}字符串累加内容。
PATH="$PATH":/home/bin
PATH=${PATH}:/home/bin
- 若该变量需要在其他⼦程序执⾏,则需要以 export 来使变量变成环境变量(export+变量名 或者 export+定义的变量),只能向下继承。
- 取消变量使⽤unset(unset+变量名)
#上诉示例
[root@xiaobai] n=1
[root@xiaobai] echo $n
1
[root@xiaobai] unset n
[root@xiaobai] echo $n
#unset是删除变量的值
[root@xiaobai] name=xiaobai
[root@xiaobai] age=20
[root@xiaobai] info=$name$age
[root@xiaobai] echo $info
xiaobai20
#此时要在xiaobai和20中间加个is
[root@xiaobai] info=$nameis$age
[root@xiaobai] echo $info
20
#我们发现只有20一个值,这是因为系统会认为nameis是一个变量,我们加个大括号再试试
[root@xiaobai] info=${name}is$age
[root@xiaobai] echo $info
xiaobaiis20
#我们可以在用引号引起来,加上空格方便查看
[root@xiaobai] info="${name} is $age"
[root@xiaobai] echo $info
xiaobai is 20
[root@xiaobai] path=${PATH}
[root@xiaobai] echo $path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@xiaobai] echo ${path%:*} #删除值的最后一个
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
#最后一个值被删掉了
[root@xiaobai] echo ${path#*:} #删除值的第一个
/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
% 从字符串的后面开始进行匹配删除,匹配到的第一个就删除并停止匹配
# 从字符串的前面开始进行匹配删除,匹配到的第一个就删除并停止匹配
:* 需要匹配的字符,:为普通字符,*为通配符表示任何数量的任意字符
变量的替换与删除
环境变量
常见的环境变量有PATH(存储所有命令所在的路径)、HOME、MAIL、SHELL、PWD 、USERNAME、UID、ID。(HOME、UID、MAIL会根据用户的不同而改变其值),总体都可以根据环境变量文件中的设置而改变。
echo $RANDOM #会随机生成一个数字且不会重复,可以在脚本中使用
位置变量
位置变量一般用于脚本中
预定义变量
预定义变量是默认就有的,值不需要我们重新定义,且值会根据程序的变化而变化
$? #上一个命令的返回值,返回0则表示成功,非0则表示不成功
$$ #当前进程号PID
$! #最近一个后台任务的进程号
Bash环境变量的文件
longin shell:取得shell时需要完整的登入流程;特点是登入时需要用户账号和密码
no-longin shell:取得shell时不需要再次输入账号和密码的情况下,所得到的shell
longin shell会读取以下两个文件
/etc/profile
系统整体设定,最好不要修改
~/.bash_profile
或~/.bash_login
或~/.profile
:属于个人的配置文件
/etc/profile
会主动义序调用以下的脚本文件
/etc/inputrc
:定义快捷键/etc/profile.d/*sh
:定义bash的操作接口颜色、语系、命令别名等(添加全局变量,推荐在/etc/profile.d
下创建以 .sh 结尾的文件,不建议去/etc/profile
里修改)/etc/locale.cof
:定义系统的默认语系
bash在读完/etc/profile
后,接下来会读取以下 3个文件,且只会读取一个,会按照以下顺序优先读取
~/.bash_profile
会调用~/.bashrc
,也会有新的环境变量在下面的文件中添加~/.bash_login
~/.profile
最终~/.bashrc
才是最后被读入到系统环境中的文件
键盘输入给变量赋值
read -t 5 -p "你的名字:" name
-p:后面接提示字符
-t:后接等待的时间,单位秒
试验一下(可以写在脚本中,也可以在命令行中执行)
[root@xiaobai] read -p "你的名字:" name
你的名字:xiaobai
[root@xiaobai] echo $name
xiaobai
[root@xiaobai] read -t 5 -p "你的名字:" name
你的名字:
这次我们等待5秒什么也不输入,也不敲回车,5秒后会自动结束这个进程
[root@xiaobai] echo $name
我们会看到刚刚我们没有输入,所以name被赋予了一个空值
时间运算
[root@xiaobai] date #查看时间
Sat May 2 09:44:37 CST 2020 #本白的机器时间与宿主机是不同步的
[root@xiaobai] date +%T -d '3 hours' #3个小时后是几点
12:44:50
[root@xiaobai] date +%F -d "20200505 1 day" #20200505后一天的日期
2020-05-06
[root@xiaobai] date +%F -d "20200505 -1 day" #20200505前一天的日期
2020-05-04
[root@xiaobai] d1=$(date +%s -d 20200505)
[root@xiaobai] d2=$(date +%s -d 20200501)
[root@xiaobai] echo $(((d1-d2)/86400)) #86400为一天的秒数
4
#4为天数