1、SHELL工作原理

   shell是操作系统的外壳,为用户提供使用操作系统的接口。如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。 shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。shell将命令或应用程序分解为系统调用并传给Linux内核。当普通用户成功登录,系统将执行一个称为shell的程序,称为守护进程。


守护进程,服务进程:开机时自动启动;                       

交互式进程:shell应用程序         

    广义:GUI,CLI

GUI:基于图形界面

CLI:提供命令提示符

词法分析: 命令,选项,参数

   命令的类型:

         内建命令

         外部命令:查找路径由PATH环境变量定义

        fork() 创建为一个进程;

脚本或程序源文件:文本文件

    把文本文件转换成机器可执行的程序的两种方式:

编译执行:预处理-->编译-->汇编-->链接;需事先编译完成,完成的结果会生成二进制程序文件

例:C, C++

解释执行:由解释器全程参与运行过程,每次读取一行,运行一行;

        Python:编程库

             程序控制结构,调用编程库完成程序编写;

             库文件:功能模块,在编程中可调用;通过其API;

             Bash:编程

程序控制结构,调用机器上命令程序文件进行程序编写;

外部命令:各应用程序提供;

程序:指令+数据

      为了完成复杂工作把指令的运行机制设计成算法,把数据存储为特定格式叫做数据结构

      所以程序也可称为:算法+数据结构

指令程序组织方式:

     过程式编程:以指令为中心,设计算法,数据服务于算法;

     面向对象式编程:以数据为中心,设计数据结构(类),程序服务于数据结构;

bash过程式编程:

      顺序执行:逐个执行

      选择执行:只执行其中一个分支

      循环执行:一段代码要执行0,1或多遍

2、SHELL知识点

编程元素:变量、程序的执行流程、函数

(1)变量:可变化的量,命名内存空间

以作用方式可分为:

      本地变量:当前shell进程;

      环境变量:当前shell进程及其子进程;

      局部变量:某个函数执行过程;

      位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;

      特殊变量:$?, $*, $@, $#, $$

变量类型:数值,字符

      数值:

          整数

          浮点数

      字符:

          ASCII

变量类型的作用:

      存储空间

       运算

       存储格式

语言对变量类型的支持力度:

      强类型:变量类型不允许有任何差池

      弱类型:变量类型不严格区分;

      默认存储机制:bash为字符

bash的变量使用特点:弱类型、无须事先声明;默认为字符串

本地变量:name=value

          name: 变量名

          =:赋值符号

          value:值

[root@centos6 ~]# user=liulong
[root@centos6 ~]# echo $user
liulong

变量名:只能包含数字、字母和下划线;且不能以数字开头;

引用变量:${name}, $name

引用方式:

        弱引用: "", 其内部的变量引用会被替换为变量值;

        强引用:'',其变量的变量引用会保持原有字符;

        命令引用:`COMMAND`, $(COMMAND),引用命令的执行结果;

[root@centos6 ~]# echo "my name is $user"   弱引用
my name is liulong
[root@centos6 ~]# echo 'my name is $user'   强引用
my name is $user

声明为整型:

       declare -i name[=value]

       let name=value

查看所有变量:set

生命周期:从创建开始到销毁结束:

销毁的机制:

          自动销毁:shell进程终止;

          手动销毁:unset name

[root@centos6 ~]# unset user
[root@centos6 ~]# echo $user

环境变量:被“导出”的本地变量

        export name[=value]

        declare -x name[=value]

[root@centos6 ~]# declare -x user=liulong
[root@centos6 ~]# echo $user
liulong
[root@centos6 ~]# bash
Welcome root,your user id is 0.
[root@centos6 ~]# echo $user
liulong
[root@centos6 ~]# pstree
init─┬─anacron
     ├─atd
     ├─auditd───{auditd}
     ├─crond
     ├─dhclient
     ├─login───bash
     ├─5*[mingetty]
     ├─rsyslogd───3*[{rsyslogd}]
     ├─2*[sendmail]
     ├─sshd───sshd───bash───bash───pstree
     └─udevd───2*[udevd]

查看所有环境变量:env, printenv, export

销毁:unset name

(2)脚本:文本文件

运行脚本:事实上是运行一个bash进程,此进程负责从脚本文件中读取一个执行逻辑,而后由bash进程负责解析并运行此逻辑;

启动脚本:

(1) 直接使用bash执行:# bash /PATH/TO/SCRIPT_FILE

(2) 给文本文件一个执行权限:# ./PATH/TO/SCRIPT_FILE 

        shebang:脚本格式

        #!/bin/bash   第一行:顶格给出shebang

        #注释行:

#!/bin/bash
#2015-9-23   liulong   
echo 'hello word!!!'
[root@centos6 tmp]# bash 1.sh 
hello word!!!
[root@centos6 tmp]# chmod +x 1.sh 
[root@centos6 tmp]# ll
total 36
-rwxr-xr-x. 1 root root    57 Sep 22 16:09 1.sh
[root@centos6 tmp]# ./1.sh 
hello word!!!

bash的常用选项:

       -n: 检查脚本中的语法错误;

       -x:调试执行脚本;

[root@centos6 tmp]# vi 2.sh
#!/bin/bash
#Description
#Version
#author
useradd testuser1
echo testuser1 | passwd --stdin testuser1
[root@centos6 tmp]# bash -n 2.sh 
[root@centos6 tmp]# bash -x 2.sh 
+ useradd testuser1
+ echo testuser1
+ passwd --stdin testuser1
Changing password for user testuser1.
passwd: all authentication tokens updated successfully.

命令状态结果:bash进程用于追踪执行的命令成功与否的状态:

          0: 成功

          1-255:失败

特殊变量:$?:上一条命令的执行状态结果;

        布尔型:

             真”:成功

            “假”:失败

自定义脚本的状态结果:exit [n]

注意:脚本中任何位置执行了exit命令即会终止当前shell进程