回顾:
用户管理,权限管理,install, mktemp
用户管理:无非就是计算机来实现资源隔离的一种工具
linux用户是只有两级结构的,虽然我们可以把它分为三级,但是事实上他只有两级层次,无非就是管理员和普通用户,
普通用户分为:
系统用户
登录用户
用户所属的组有多个,用户必须有一个基本组,另外还可以有附加组,
权限管理:
mode ownership(从属关系)
mode:
user
group
other
rwx
命令: install 可以创建目录,但是不能复制目录
mktemp:创建临时文件,创建临时文件的好处在于,将来在一个程序运行时,仅仅是用到一个文件的话,我们就可以创建一个临时文件,而且这个文件就算不立刻删除,这个临时文件也会在一段时间之后系统自动进行删除。
创建临时文件需要一个模板:mktemp(.XXXX) //注意的是,后面的叉是大写
bash特性及bash脚本编程初步:
计算机系统的组成:
由上图可知,计算机最内部的是硬件,再外层是内核,内核将硬件的各种复杂性和区别进行隐藏了,使用统一的接口进行向外输出,这样就使的不管我们的硬件是什么样的类型,内核就能将其输出位统一的接口,这就是系统调用,系统调用为了做的足够简洁,所以他一定要做的非常底层,但是为了加快程序开发速度,以后就出现了库函数。
高级语言,不是代表他的特性有多好,只是说他距离用户近,所以使得用户的开发时间非常短。但是开发出的程序他的运行时间,和运行消耗是比较大的。
要想将程序运行起来,我们应该考虑一个问题,程序的启动方式有两种,一种是从内核启动,然后完成系统启动引导,第二种是从shell接口启动
终端,附着在终端的接口程序:
GUI:KDE,GNome,Xfce
CLI:/etc/shells
bash的特性:
命令行展开:~,{}
命令别名:alias,unalias
命令历史:history
文件名统配:glob
快捷键:ctrl+a,e,u,k,l
命令补全:$PATH
路径补全:
bash特性之:命令hash
命令hash就是为了加速命令载入的
缓存此前的命令查找结果:key-value
kye是键值对,搜索键;
value是值。
命令hash就是把之前查找过的并且执行的命令的程序文件,命令的那个路径记录下来,也就是缓存下来。
缓存命令的文件就叫“命令的hash”
只有外部命令有hash缓存,内部命令没有hash缓存。
[root@centos6 ~]# hash
hits command
1 /usr/bin/man
2 /bin/ls
[root@centos6 ~]#
[root@centos6 ~]# type hash //hash命令是一个内部命令
hash is a shell builtin
[root@centos6 ~]#
hash命令:
hash:列出
hash命令的选项:
-d:删除hash表中指定的某个命令缓存,删除某个命令时,直接是定命令名即可
-r:清空hash表
bash的特性之:变量
程序:指令+数据
指令:由程序文件提供:
数据:标准输入I/O设备,文件,管道,变量,
数组也是变量,只不过是多个连续的变量
程序:算法+数据结构
变量名+指向的内存空间=真正的变量空间
变量赋值:
对于shell来讲:变量赋值name=value
变量类型:存储格式,表示数据范围,参与的运算
编程语言:
强类型变量: C语言就是强类型的
弱类型变量:bash
bash:把所有 变量统统视作字符型;
bash:中的变量无需事先声明;相当于,把声明和赋值过程同时实现;
变量声明:说明变量类型,变量名
变量替换:把变量名出现的位置替换为其所指向的内存空间中数据;
变量引用:${var_name}或$var_name
变量名:只能使用字母,数字,下划线组成,但是不能以数字开头。
变量名:一般要做到,见名知意,命名机制遵循某种法则。
驼峰式:chickenTotal
下划线连接式:chicken_total
变量的类型:
字符型,数值型,布尔型,字符串,
bash变量类型:
本地变量: 作用范围仅为当前shell进程有效;
环境变量: 作用范围为当前shell进程及其子进程
局部变量: 作用范围仅为某代码片段(函数上下文)
位置参数变量: 当执行脚本的shell进程传递的参数;
特殊变量: shell内置的有特殊功用的变量;
$?:
0:成功
1-255:失败
本地变量:
变量赋值:name=value
变量引用:${name},或$name
"":双引号,变量名会替换为其值;
'':单引号,是强引用;变量名不会替换为其值;
查看变量:set
撤销变量:unset 变量名 //注意此处非变量引用,不能加“$”
有一个命令
“pstree”:能够显示我们的进程树。
子shell还可以生成子shell。
在命令行中要想让bash生成一个子shell,那么单独执行“bash”即可
如果退出子shell,则直接直接执行“exit”即可。
验证:
本地变量只在当前shell范围下有效
[root@centos6 ~]# name=xiao
[root@centos6 ~]# echo $name
xiao
[root@centos6 ~]# bash //打开一个子shell
[root@centos6 ~]# echo $name
[root@centos6 ~]# exit //退出子shell
exit
[root@centos6 ~]# !echo //再次查看变量的值,有值。
echo $name
xiao
[root@centos6 ~]#
环境变量:
作用范围为当前shell及子shell
变量赋值:三种方法
(1)export name=value
(2)name=value
export name
(3)declare -x name=value
(4)name=value
declare -x name
变量引用:
${name},$name
注意:bash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境
例如:PATH,HISTFILE,HISTSIZE,HISTFILESIZE,HISTCONTROL,SHELL,HOME,UID,PWD,OLDPWD
查看环境变量:
单独执行: export 或执行: “declare -x” 或执行: “printenv”或者直接执行:“env”
撤销环境变量:
执行命令:unset name //一定要注意不要变量名前不要加$
只读变量:
只读变量无法重新赋值,并且不支持撤销;只有在当前这个shell进程终止时,才会撤 销。
两种方法:
(1)declare -r name
(2)readonly name
演示:
[root@centos6 ~]# echo $name
[root@centos6 ~]# name=haha //定义变量
[root@centos6 ~]# echo $name
haha
[root@centos6 ~]# declare -r name //做只读处理
[root@centos6 ~]# echo $name
haha
[root@centos6 ~]# name=xiao //改变变量的值,发现不能更改了,为只读。
bash: name: readonly variable
[root@centos6 ~]#
[root@centos6 ~]# unset name //不支持撤销
bash: unset: name: cannot unset: readonlyvariable
[root@centos6 ~]#
bash特性之多命令执行:
我们只需在命令行提示符后面分别输入命令,各个命令之间用分号“;”隔开
#COMMAND1;COMMAND2;COMMAND3....... //表示执行完前一个命令,在执行后 一个命令,命令之间没有逻辑关系
逻辑运算:
运算数:真(true,yes,on,1)
假:(false,no,off,0)
与:乘法
1&&1=1 //只用参与运算的两个数都为真,结果则为真
1&&0=0
0&&1=0
0&&0=0
我们叫上面的运算叫短路运算,我们可以提前进行判断。
或:加法
1||0=1
1||1=1
0||1=1
0||0=0
非:
!1=0
!0=1
异或:
两个运算数,相同则为0,不相同则为1;
短路法则:
#COMMAND1&& COMMAND2 //前一个命令失败了,后一个命令就不用再执行了
COMMAND1为假,则COMMAND2不会再执行;
否则:COMMAND2一定要运行
#COMMAND1 || COMMAND2
COMMAND1为真,COMMAND2不再运行
否则COMMAND2一定运行
演示:
[root@centos6 ~]# touch /tmp/test.etc && ls /etc >/tmp/test.etc //表示前面的创建目录的命令成功执行了,则执行后面的命令,如果没有成功,则不会再执行后面的命令。