Shell-Shell入门

上一篇 / 下一篇  2015-01-03 20:52:33 / 个人分类:Shell

脚本编程语言与编译型语言的差异
编译形语言写成的程序只要从源代码转换成目标代码便能直接通过计算机来执行。
编译型语言的好处是高效,缺点是他们多半运作与底层,所处理的是字节,整数,浮点数或是其他机器层级的对象。
脚本编程语言通常是解释型的,这类程序的执行,是有解释器读入程序代码,并将其转换成内部的形式,再执行,解释器本身是一般的编译型程序。使用脚本编程语言的好处是他们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象,缺点是,他们的效率通常不如编译型语言。
为什么使用shell脚本 
简单性,Shell是一个高级语言,通过它,你可以简洁地表达复杂的操作
可移植性,使用POSIX所定义的功能,可以做到脚本无须修改就可以在不同的系统上执行
开发容易,可以在短时间内完成一个功能强大又好用的脚本。
who  查看现在系统有谁登陆
wc程序,字数计算程序,它可以算出行数,字数与字符数,
|管道符号可以在两程序之间建立管道,
Who的输出,成了wc的输入,wc所列出的结果就是已登陆用户的个数。
who | wc -l
下一步就是将此管道转变成一个独立的命令,方法是把这条命令输入一个一般的文件中,然后使用chmod为该文件设置执行的权限。
小型shell脚本典型开发周期,
首先,直接在命令行上测试
然后,一旦找到能够完成工作的适当语法,
再将它放进一个独立的脚本里,并为该脚本设置执行的权限,
之后,就能直接使用该脚本。
当shell执行一个程序时,会要求UNIX内核启动一个新的进程,以便在该进程里执行所指定的程序。当Shell要求内核执行它时,内核将无法做这件事,并回应not executable format file的错误信息,Shell收到此错误信息时,会启动一个新的/bin/sh(标准shell)副本来执行该程序。
如果UNIX系统有多个Shell,如何告知UNIX内核应该以哪个Shell来执行所指定的Shell脚本?
通过脚本文件中特殊的第一行来处理,在第一行的开头处使用#!这个字符。当一个文件中开头的两个字符是#!时,内核会扫描该行其余的部分,看是否存在可用来执行程序的解释器的完整路径。中间出现任何空白符号都会略过。此外,内核还会扫描是否有一个选项要传递给解释器,内核会以被指定的选项来引用解释器,再搭配命令行的其他部分。Shell脚本通常一开始都是#! /bin/sh
对#!这一行的长度尽量不要超过64个字符
脚本是否具有可移植性取决于是否有完整的路径名称
别在选项后面放任何空白,因为空白也会跟着选项一起传递给被引用的程序
你需要知道解释器的完整路径名称

UNIX命令行的原理
1 格式简单,以空白(space键或Tab键)隔开命令行中各个组成部分
2 命令名称是命令行的第一个项目通常后面会跟着选项,任何额外的参数都会放在选项后面
3 选项的开头是一个破折号(或减号),后面接着一个字母,选项是可有可无的,有可能需要加上参数,不需要参数的选项可以合并,选项有短选项和长选项 
4 分号(;)用来分隔同一行里的多条命令,Shell会依次执行这些命令。如果使用的是&符号而不是分号,则Shell将在后台执行其前面的命令,意味着Shell不用等到该命令完成,就可以继续执行下一个命令。

Shell识别三种基本命令,内建命令,Shell函数以及外部命令
1内建命令就是由Shell本身所执行的命令。有些命令是由于其必要性才内建的,有一些内建命令是为了效率
2 Shell函数是功能健全的一系列程序代码,以Shell语言写成,他们可以像命令那样引用。
3 外部命令就是Shell的副本(新的进程)=所执行的命令,基本的过程如下:
  1 建立一个新的进程,此进程即为Shell的一个副本
  2 在新的进程里,在PATH变量内所列出的目录中,寻找特定的命令,当命令名称中含有斜杠/符号时,将略过路径查找步骤
  3 在新的进程里,以所找到的新程序取代执行中的Shell程序并执行
  4 程序完成后,最初的Shell会接着从终端读取的下一条命令,或执行脚本里的下一条命令。
Shell变量赋值的方式为,先写变量名称,紧接着=字符,最后是新值,中间没有空格,当想取出Shell变量的值时,在变量名称前面加上$字符,当所赋予的值内含空格时,请加上引号。单行可进行多次赋值。
当变量作为第二个变量的新值时,不需要使用双引号,但是用双引号也没有关系。但是当你将几个变量连接起来时,必须使用双引号。
echo 的任务就是产生输出,可用来提示用户,或是用来产生数据供进一步处理,原始的echo命令只会将参数打印到标准输出,参数之间以一个空格隔开,并以换行符好结尾。
printf 命令可以输出简单的字符串,printf不像echo那样会自动提供一个换行符,必须显式地将换行符执行为\n

程序应该有数据的来源端,数据的目的端,以及报告问题的地方,他们分别被称为标准输入,标准输出以及标准错误输出。许多UNIX程序默认情况下会读取标准输入,写入标准输出,并将错误信息传递到标准错误输出,这类程序叫做过滤器。
在你登录时,UNIX便将默认的标准输入,输出及错误输出安排成你的终端,
IO重定向就是你通过与终端交互,或是在Shell脚本里设置,重新安排从哪里输入或输出到哪里。

重定向与管道
1 以<改变标准输入
2 以>改变标准输出  >重定向符在目的文件不存在时,会新建一个,然而,如果目的文件已存在,他就会被覆盖掉,原本的数据都会丢失。
3 以>>附加到文件 如同>,如果目的文件不存在,>>重定向符就会新建一个,然而,如果目的文件存在,它就不会直接覆盖掉文件,而是将程序所产生的数据附加到文件结尾处。
4 以 |建立管道。管道可以把两个以上执行中的程序衔接在一起,第一个程序的标准输出可以变为第二个程序的标准输入,管道可以使得执行速度比使用临时文件的程序快上十倍,构造管道时,应该试着让每个阶段的数据量变得更少,如果有两个要完成的步骤与先后次序无关,可以让数据变少的那一个步骤放在管道的前面,这样可以提升脚本的整体性能,因为Unix只需要在两个程序间移动少的数据量。
特殊文件 
/dev/null ,也叫位桶,传送到此文件的数据都会被系统丢掉,当程序将数据写到此文件时,会认为它已经成功完成写入数据的操作,但实际上什么也没有做。读取/dev/null会立即返回文件结束符号。
/dev/tty,当程序打开此文件时,UNIX会自动将它重定向到一个终端再与程序结合在程序必须读取人工输入时特别有用,用它来产生错误信息也很方便
$PATH是一个以冒号分隔的目录列表,你可以在列表所指定的目录下找到所要执行的命令,所找到的命令可能是变异后的可执行文件,也可能是Shell脚本。
可以建立自己的bin目录并驾到$PATH中,要让修改永久生效,在.profile文件中把bin目录加入$PATH,每次登陆时Shell都会读取.profile文件
$PATH里的空项目表示当前目录,空项目位于路径值中间时,可以用两个连续的冒号来表示,如果将冒号直接置于最前端或最后段,可以表示查找时最先查找或最后查找当前目录。
位置参数指的就是Shell脚本的命令行参数。他们同时也可以是函数的参数,各参数都有整数来命名。
执行跟踪, 用set -x 命令将执行跟踪的功能打开,用set +x命令关闭它

TAG:

 

评分:0

我来说两句

Open Toolbar