回顾:

         用户管理,权限管理,install mktemp

 

用户管理:无非就是计算机来实现资源隔离的一种工具

         linux用户是只有两级结构的,虽然我们可以把它分为三级,但是事实上他只有两级层次,无非就是管理员和普通用户

         普通用户分为:

                   系统用户

                   登录用户

用户所属的组有多个,用户必须有一个基本组,另外还可以有附加组,

 

权限管理:

         mode  ownership(从属关系)

mode:

         user

         group

         other

 

         rwx

 

命令: install 可以创建目录,但是不能复制目录

                   mktemp:创建临时文件,创建临时文件的好处在于,将来在一个程序运行时,仅仅是用到一个文件的话,我们就可以创建一个临时文件,而且这个文件就算不立刻删除,这个临时文件也会在一段时间之后系统自动进行删除。

        

创建临时文件需要一个模板:mktemp.XXXX    //注意的是,后面的叉是大写

 

 

 

bash特性及bash脚本编程初步:

 

计算机系统的组成:

 

wKiom1gcINrBoU_PAASBM55foT4284.png

由上图可知,计算机最内部的是硬件,再外层是内核,内核将硬件的各种复杂性和区别进行隐藏了,使用统一的接口进行向外输出,这样就使的不管我们的硬件是什么样的类型,内核就能将其输出位统一的接口,这就是系统调用,系统调用为了做的足够简洁,所以他一定要做的非常底层,但是为了加快程序开发速度,以后就出现了库函数。

         高级语言,不是代表他的特性有多好,只是说他距离用户近,所以使得用户的开发时间非常短。但是开发出的程序他的运行时间,和运行消耗是比较大的。

         要想将程序运行起来,我们应该考虑一个问题,程序的启动方式有两种,一种是从内核启动,然后完成系统启动引导,第二种是从shell接口启动

        

         终端,附着在终端的接口程序:

                   GUIKDE,GNome,Xfce

                   CLI/etc/shells

 

bash的特性:

         命令行展开:~{}

         命令别名:aliasunalias

         命令历史: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变量类型:

 

spacer.gif         本地变量:   作用范围仅为当前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

         变量赋值:三种方法

                   1export  name=value

                   2name=value

                            export  name

                   3declare  -x name=value

                   4name=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进程终止时,才会撤             销。

         两种方法:

                   1declare  -r name

                   2readonly  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.......   //表示执行完前一个命令,在执行后                                                                                                               一个命令,命令之间没有逻辑关系

 

 

逻辑运算:

         运算数:真(trueyeson1

                            假:(falsenooff0

 

与:乘法

         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    //表示前面的创建目录的命令成功执行了,则执行后面的命令,如果没有成功,则不会再执行后面的命令。