shell脚本学习(一)

来源:互联网 发布:中国出境旅游数据统计 编辑:程序博客网 时间:2024/04/30 09:05

本文内容概述:
1>shell概述;
2>shell脚本的编写和shell的运行过程;
3>内置命令概述以及分析
4>shell中的变量和符号。


在学习linux最基础的指令部分的时候,我们大致了解到了执行一条指令的过程。我们向终端输入自己要执行的指令,然后shell就会fork出一个子进程去执行这个命令,而不是自己去执行。这应该就是我初次接触到shell这个名词的时候了。


shell概述

shell的作用就是解释用户要执行的命令,用户输入一条命令,shell就会执行一条,这种一次执行一条命令的方式被称为交互式,当然我们也可以一次处理多条命令,即就是将要处理的命令一条一条的写到一个文件中,然后去执行,这种执行命令的方式就是批处理方式。


shell脚本编写以及shell的执行原理:

这里写图片描述

shell是一种脚本语言,我们知道语言分为解释型语言和编译型语言,编译型语言就比如是C语言,C++这类写好代码不能执行拿去执行的语言,需要经历 预处理-编译-汇编-连接 这些过程;而解释型语言就不需要这些过程,它们都有自己的解释器,直接运行(如果没有执行权限,直接加权限即可),而shell的解释器就是bash。shell脚本一般是以 # 进行注释的,但是第一行的#!/bin/bash却不是注释,它是用shebang指定的解释器。

shell的执行过程:shell会fork出一个子进程,并调用exec去执行./myshell.sh,exec系统调用就会把子进程的代码替换成./myshell.sh这个程序的代码段,并从它的_start开始执行,但是myshell.sh是一个文本文件,没有代码段和_start函数。exec系统调用还有一种处理机制,就是如果要执行的是一个文本文件,并且第一行用shebang指定了解释器,那么就用解释器程序的代码段替换当前的进程,并且从解释器的_start开始执行,文本文件的内容当做命令行参数传递给解释器。

图形解释:
这里写图片描述

如果我将myshell.sh中的内容进行更改,再看>
这里写图片描述

解释:cd是内置命令,为什么cd是内置命令呢?bash创建的任何一个进程都是bash的子shell来执行该进程,子进程执行程序,父进程等待子进程退出,但是改变子进程的任何属性都不会返回给父进程。然而cd是改变shell的当前路径,如果shell是外部命令,子进程改变了路径,但是父进程并没有察觉到这种路径的改变,所以shell的路径还是没有改变。所有改变当前环境的命令都必须设置为内置命令,如果是外部命令就不可能达到自己想要的效果。

下边我们在系统中查找一下cd命令,看结果>
这里写图片描述

内置命令是内建在shell内部的命令,是由shell自己来完成的。
下边我对上上一幅图片进行说明:shell会fork出一个子进程去执行shell脚本,由于shell脚本没有代码段和_start函数,所以exec会用解释器的代码替换掉当前的进程,而cd是一条内置命令,所以cd的执行不是由孙子进程来执行,而是由子进程执行,而子进程的执行结果不会影响shell,所以,最后的pwd得出的结果还是当前路径。
这里,我就想到我实现一个简单的shell的时候,也就是有些命令不可以执行,这些不能执行的命令是内置命令。实现shell的链接如下:
http://blog.csdn.net/peiyao456/article/details/56038655


shell的基本知识

1>shell变量:shel的变量由大写字母和下划线组成,并且不需要定义,直接使用。shell变量有两种,一种是环境变量,一种是本地变量。
以下的定义来源于网络>


环境变量 是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。环境变量相对于给系统或用户应用程序设置的一些变量。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。


复习 环境变量的定义,删除等命令:
这里写图片描述

set命令会打印出环境变量和本地变量,set,unset,export等都是内置命令。
这里写图片描述

当然上述的赋值语句和导出为环境变量的语句合为一句:export VALUE=100
需要注意的是:VALUE=100,等号左右两边坚决不能有空格,如果有空格,就会被解释为一条命令。
环境变量可以被继承,而本地变量不会别继承。
证明本地变量不会被继承,环境变量可以被继承:
这里写图片描述

变量的引用:这里的引用不是面向对象C++中的引用,而是读出变量的值。看看下边的示例:
这里写图片描述
2>shell中的符号
文件名代换
这里写图片描述

命令替换(反引号`和$()):
这里写图片描述

区别:
这里写图片描述

总结(反引号和()1\\使2\\=\2()不需要考虑\的问题,\=\。
下边我再分析eval命令>
eval命令会对后边的命令进行2次,如果第一次扫描,该命令是一个普通命令,则执行该命令;如果命令中含有变量的间接引用,则保证间接引用的语义,也就是说,eval命令会首先扫描命令行进行的所有置换,然后再执行该命令。
总结来说,eval执行有以下2个步骤:
执行变量替换,类似于C语言预编译阶段的宏替换;
执行替换后的命令串。
举例如下:
这里写图片描述
eval先进行变量的替换,再执行命令。它还可以查看传给shell的最后一个参数。举例如下:
这里写图片描述

转义字符:
学习C语言阶段,我们知道 %d格式输出一个整形数字,但是如果想要输出\n这个转义字符,直接printf(“\n”);是会输出一个空行,printf(“\n”);才会输出\n.这就是转义字符的意义所在。
这里写图片描述

\的另一种含义:就是折行的意思,告诉系统这个命令还没有输入完成。这个可以自己试一下。

单引号’:
和C语言中不一样,在shell中,单引号和双引号中间的内容都是字符串。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。如果输入的字符串只有前单引号没有后单引号,执行之后,系统就认为你没有输入完成,等待继续输入。
这里写图片描述
双引号:
保持引号内所有字符的字面值,回车也不例外,但是以下情况除外(如图所示)>
这里写图片描述

参考文档:
http://www.cnblogs.com/hazir/p/understanding_linux_cd_command_with_examples.html
http://www.cnblogs.com/Lynn-Zhang/p/5769403.html

关于shell的基本知识就先到这里~~

13 7
原创粉丝点击