您的位置:首页 > 运维架构 > Shell

9-13 shell工作原理和编程中知识点总结

2015-09-22 10:08 555 查看
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

注意:脚本中任何位置执行了exit命令即会终止当前shell进程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息