我们要想能够实现与主机交互,得有一个终端以及附着在终端上的接口程序,接口程序有两大类,分别是GUI(KDE、GNome、Xfce)和CLI(/etc/shells)
bash特性之命令hash
- 缓存此前命令的查找结果,缓存下的内容成为命令哈希
- 执行命令时并不是上来就直接找path环境变量下所给定的各路径下的程序文件,而是先去找缓存,看缓存中是否有直接找到的完整路径的结果,如果有,直接引用缓存中的命令,如果没有才去发起查找操作,这就叫命令哈希
- hash本身是一个内部命令
- hash记住或显示程序位置,确定并记住每一个给定NAME名称的命令的完整路径,如果不提供参数,则显示已经记住的命令的信息
选项
- -d:忘记每一个已经记住的命令的位置
- -l:
- -r:忘记所有记住的位置
hash #列出
hash -d cat #清空cat
hash -r #清空所有
bash的特性之变量
程序就是由指令加数据组成,指令由程序文件提供,数据可以通过IO设备输入、文件、管道、变量
程序也可以说是由算法+数据结构组成
- 变量=变量名+指向的内存空间
- 变量赋值:把要存储的数据存储到变量名所指向的内存空间的过程就叫变量赋值,对于shell而言,变量赋值就是name=value
- 变量类型:指的是变量值的存储类型,一旦确定变量类型或者数据类型,就决定了这些数据如何存储,或者存储格式,且表示了数据范围及能够参与的运算
- 对于编程语言来讲,根据它们对于类型要求是否严格分为弱类型变量和强类型变量编程语言,其中bashshell是一种弱类型变量的编程语言,== 把所有变量统统视为字符型==,另外bashshell不支持浮点数据除非借助外在工具来进行
- bashshell的变量无需事先声明,相当于把声明和赋值过程同时实现,声明意味着声明类型和定义变量名称
- 变量替换:把变量名出现的位置替换为其所指向的内存空间中数据
- 变量引言:${var_name}, $var_name
- 变量名:变量名只能使用字母、数字加下划线组成的字符组合,但不能以数字开头;变量名要见名知义,且命名机制遵循某种法则;不能使用程序的保留字,例如if, else, then, while等,因为它们用于控制程序的执行流程
- bash变量类型:
【1】本地变量:其作用域仅是当前shell进程
变量赋值:name=value
变量引用:${name}, $name,"":变量名会替换为其值,’’:变量名不会替换为其值
查看变量:set
撤销变量:unset,注意此处非变量引用
【2】环境变量:作用域是当前shell进程及其子进程
变量赋值:
(1)export name=value
(2)name = value
export name
(3)declare -x name=value
变量引用:${name}, $name
注意:bash内嵌了许多环境变量(通常为全大写子字符),用于定义bash的工作环境,例如PATH、HISTSIZE、HISTFILESIZE、HISTCONTROL、SHELL、HOME、UID、PWD、OLDPWD
查看环境变量
export #查看环境变量
declare -x #查看环境变量
printenv #显示环境变量
env #显示环境变量
撤销环境变量:unset name
只读变量:只读变量无法重新赋值,并且不支持撤销,存活时间为当前shell进程的生命周期,随shell进程终止而终止
declare -r name
readonly name
【3】局部变量:当前shell进程中的某一个代码片段,比如函数
【4】位置参数变量:向执行脚本的shell进程传递的参数
【5】特殊变量:shell内置的有特殊功用的变量,比如$?:用于保存上一条命令的执行状态结果,0:失败,1-255:成功
bash特性之多命令执行
COMMAND1; COMMAND2; COMMAND3;…#执行顺序是依次执行,命令之间没有逻辑关系
补充:
逻辑运算:
运算数:真(true,yes,on,1)/ 假(false,on,off,0)
注意:对于命令状态的运行结果,0表示真
【1】与
1 && 1 = 1
1 && 0 = 1
0 && 1 = 0
0 && 0 = 0
【2】或
1 || 1 = 1
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0
【3】非
! 1 = 0
! 0 = 1
短路法则:与运算中,前一个命令失败,后一个命令 就不会执行???执行为真不是0嘛????
COMMAND1 && COMMAND2 #将两个命令的执行状态结果做与运算,COMMAND1为假,则COMMAND2必须执行,1为真,2必须执行
COMMAND1 || COMMAND2 #COMMAND1为真,则COMMAND2不会执行,1为假,则2必须执行
id user1 || useradd user1 #若user1不存在则增加用户user1