shell介绍
既然说到bash编程,那就先从程序设计开始吧,先说什么是程序?个人的话解释:程序就是对数据的加工处理过程。那么,程序设计构成就可以写成这个等式:程序=数据结构+指令算法。
数据结构:即非数值计算的程序设计问题中的计算机的操作对象以及它们之间的关系和操作 指令算法:即对特定问题求解步骤的一种描述,是对指令的有序序列
程序根据在编程过程中对数据和指令的侧重点不同,可以将程序分为两种类型:
1、面向过程的编程:以指令为中心,设计算法,数据服务于算法; 2、面向对象的编程:以数据为中心,设计数据结构(类),程序服务于数据结构;
根据编程命令集,接口以及程序运行过程,将程序语言分类为:
1、汇编语言:汇编语言的实质和机器语言是相同的,都是直接对硬件操作 2、脚本语言:脚本语言是解释运行而非编译 3、机器语言:全部机器指令的集合构成计算机的机器语言,是用二进制代码0和1描述的指令 4、高级语言:高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行
系统编程写的程序源码是无法被内核直接运行的,需要对程序源码进行编译或解释成机器语言。再通过系统内核去运行程序。两种方式:
1、编译执行 步骤:需要编译器,汇编器等来事先将源码编译汇编生成可运行的二进制代码程序文件。 2、解释执行 步骤:由解释器全程参与,解释器每次读取一行,运行一行。
对编程的定义和分类有了初步了解,将shell编程对号入座。知道shell属于脚本语言,运行方式是解释执行,就会很容易理解shell编程的运行过程和原理了。
shell定义
英文shell区别于kernel,是用来人机交互的一类交互式程序。计算机最初的编程需要程序员根据硬件厂商提供的机器码来编写程序(即汇编),而每个硬件厂商的硬件架构和机器码都是不同的。这就造成程序编写的重复性和复杂性,为了解决这个问题,kernel应运而生,kernel的作用就是为不同的硬件厂商提供一个统一的对外接口规则,其实就是操作系统。同一个操作系统不就是能够跑在不同硬件厂商的电脑上?然后,用户对操作系统的操作都是统一的操作集。想想,是不是这么回事!好了,明白kernel了,那用户操作电脑,还是需要人机交互,而shell就是为解决人机交互而产生的一种接口程序,它是工作在kernel的基础之上的。
广义上,人机交互分为图形和命令行两种接口类型。即shell交互接口程序也是分为GUI和CLI两种类型的,就像windows的桌面和dos。GUI顾名思义,就是基于图形的操作方式;CLI则是提供一个命令提示符,在提示符上键入运行需要的命令来达到人机交互的目的。Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。他是命令语言、命令解释程式及程式设计语言的统称。Linux下的shell作用就是:
1、它是用户操作系统内核,用户与内核交互操作的接口,接收用户的操作命令; 2、它是命令解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心 3、是一个解释型的程序设计语言
当普通用户成功登录,系统将执行一个称为shell的程序。正是shell进程提供了命令行提示符。作为默认值(TurboLinux系统默认的shell是BASH),对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。一旦出现了shell提示符,就可以键入命令名称及命令所需要的参数。shell将执行这些命令。
shell命令分类:
内部命令:shell自己内建的shell命令集 外部命令:是存在于文件系统中某个目录下的单独的程序
shell工作原理:
shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序,即外部命令。然后shell在搜索路径里寻找这些应用程序(搜索路径就是由系统环境变量定义的一个能找到可执行程序的目录列表,如PATH)。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。如图:
说完什么是编程,以及shell和shell的工作原理。下面进入bash编程的正题。哦,在这之前先说下bash脚本的一些特性或者说是一些比较零散琐碎的知识点。
1、脚本的编写,运行
首行顶格#!/path/to/shell_file 声明选择使用那种shell 运行需要一个执行权限,而执行: ./shell_script或者/path/to/shell_file shell_script 注释行:#
2、命令状态结果,bash进程可追踪执行命令成功与否的状态
0:成功 1-255:失败 $?:显示紧临上次命令行的执行结果
3、bash常用选项
-n:检查脚本中的语法错误,只能是语法错误 -x:调试执行脚本
4、特殊设备:
/dev/null: 空,bit buckets,吞下所有数据,并直接丢弃; /dev/zero:吐出一堆0;
OK,先总结这些,有新发现以后再加。
本文出自 “从头再来” 博客,请务必保留此出处http://4708705.blog.51cto.com/4698705/1695669
原文地址:http://4708705.blog.51cto.com/4698705/1695669