声明:本系列文章是博主根据 “兄弟连新版Linux视频教程”做的笔记和视频截图,只为学习和教学使用,不适用任何商业用途。
PS:文章基于Linux版本CentOS6.9,如果对Linux感兴趣,建议去看《细说Linux》,沈超老师和李明老师的教学风格我很喜欢:)
10.4 Bash变量
视频10.4.1 用户自定义变量
1.变量概念
2.变量设置规则
3.变量分类
用户自定义变量、环境变量、位置参数变量、预定义变量;
其实位置参数变量 也是 预定义变量 的一种,只是数量众多,才取分出来;
4.本地变量(用户自定义变量)
可以通过set命令查看系统中所有变量(包括环境变量、系统变量、用户自定义变量):
视频10.4.2 环境变量
1.环境变量概念
2.设置环境变量
用户自定义变量 与 环境变量的区别:作用域不同。
用户自定义变量只在当前shell环境下生效;
环境变量在当前shell及其子shell环境生效,如果将环境变量写入配置文件,环境变量将在所有shell环境中生效。
使用pstree命令确定进程数:
可以看到当前是使用sshd远程连接后的bash环境。
如果在bash环境下进入sh环境,再使用pstree命令确定进程:
发现当前sh环境是bash的子环境。
例子:
首先,定义两个环境变量一个自定义变量:
定义一个环境变量age:export age=18
定义一个自定义变量hobby,并声明为环境变量:hobby=“play games”,export hobby
set命令查看当前环境的变量,发现都可以看到:
进入bash环境,再查看变量,发现只能看到环境变量了:
与set命令查看所有变量不同,使用env专门查看环境变量:
调用环境变量,同样是$变量名:
3.系统常见环境变量
其实PS1并不是环境变量,使用env命令查不到,只有set命令才能看到,
PS1是系统预留用来定义系统操作环境的变量,是环境变量的子分支:
系统能够直接执行系统命令,是由于在PATH中定义了命令所在路径,如果想要不是用绝对路径直接执行脚本,可以将脚本所在路径添加到PATH环境变量:
PATH=${PATH}:/tmp/test/shell
但是使用命令追加在环境变量地址在重启后都会消失,所以要写入配置文件才能永久生效:
执行echo PS1命令:[\u@\h \W]\$
发现命令展示:
[root@localhost ~]#
[用户名@主机地址 当前目录最后一级目录]如果是root就展示#不是root就展示$
如果要修改PS1的展示方式,使用PS1=’格式’ ,注意要在各式外加单引号。
视频10.4.3 位置参数变量
1.位置参数变量
注意:
在Linux中要想进行数值运算,必须在数值外加双小括号:
例子:
$#代表参数的个数,不包括命令本身;
$* 与 $@ 的区别($*会把所有参数会当做一个整体,$@会将所有参数独立对待):
视频10.4.4 预定义变量
&& 和 || 判断命令是否正确执行时,就是用 $? 来判断上一条命令是否正确执行,是否返回0;
在Linux系统中,如果要将一个进程放在后台,就必须要加&
例子:
执行结果:
2.接收键盘输入
执行:
10.5 Bash的运算符
视频10.5.1 数值运算与运算符
1.declare声明变量类型
export param其实就是声明变量param为环境变量,等同于declare –x param
2.数值运算
3.运算符
优先级从上到下依次递减
视频10.5.2 变量测试与内容替换
10.6 环境变量配置文件
视频10.6.1 环境变量配置文件简介
1.source命令
一般更改配置文件后需要重启服务才能生效,但是使用source 命令可以不用重启服务而使配置文件生效,source 配置文件 与 . 配置文件 效果相同。
2.环境变量配置文件简介
HISTSIZE:历史命令保存条数;
PS1:提示符;
HOSTNAME:主机名;
系统中的环境变量配置文件:
注意:
/etc/路径下的配置文件对每个登录Linux的用户都生效;
~/.bash_profile和~/.bashrc是在登录用户家目录下,只对此登录用户生效;
视频10.6.2 环境变量与配置文件作用
1.环境变量调用的顺序:
2./etc/profile的作用
查看/etc/profile文件:
定义USER/LOGNAME/MAIL:
定义PATH:
这里定义了环境变量PATH的内容:当EUID=0即root用户登录时,PATH中添加/sbin:/usr/sbin:/usr/local/sbin,否则不添加(使用after表示)
定义HOSTNAME(登录名)/HISTSIZE(历史命令保留条数):
定义umask:
当uid用户ID大于(-gt)199时umask设为002(777-002=775),而root的uid=0,所以umask就设为022(777-022=755)
读取:/etc/profile.d/*.sh文件:
其中:etc/profile.d/lang.sh是用于定义系统语言的脚本:
可以看到,从/etc/sysconfig/i18n:文件中读取相关内容:
3.~/.bash_profile的作用
可以看到首先在家目录/.bash_profile文件中调用了~/.bashrc文件,然后在环境变量PATH后追加了$HOME/bin路径,然后声明为PATH:
然后看~/.bashrc文件:
里面有自定义的别名,然后调用了/etc/bashrc文件
4./etc/bashrc的作用
查看/etc/bashrc文件:
发现貌似与/etc/profile文件定义内容相同,但是查看注释,发现只有在非密码登录状态下才生效,如进入子shell模式:
其实,/etc/bashrc文件真正定义的是用户登录提示符:
了解了上述两种调用顺序,只要把想定义的变量或配置放在其中一个配置文件中即可,但是注意:后面调用的配置会覆盖前面的配置,而且/etc/bashrc文件中除了用户登陆提示符,其他配置只有在非密码登录时才生效,~/.bash_profile和~/.bashrc只在此登录用户时生效。
视频10.6.3 其他配置文件和登录信息
注意:写错了,应该是~/.bash_history文件
3.Shell登录信息
1.本地终端欢迎信息/etc/issue
\l 可以显示当前登录的终端号,本地登录推荐加上:
Linux自带的6个本地终端,在不同终端登录时显示的终端号不同(点击ALT+F1~F6切换):
注意:
这个文件的配置只对本地登录生效,远程登录不生效!
2.远程终端欢迎信息/etc/issue.net
打开/etc/ssh/sshd_config文件,找到#Banner none改为 Banner /etc/issue.net,才可以显示/etc/issue.net中的登录信息:
/etc/issue.net:
/etc/ssh/sshd_config:
注意:修改完/etc/ssh/sshd_config文件后要重启ssh服务才能生效:
此时再用远程登录就可以看到登录信息,但是反斜杠\不再有转义功能:
3.登录后欢迎信息/etc/motd:
此欢迎信息不管远程登录还是本地登录都生效:
远程登录:
本地登录: