shell脚本学习(一)

来源:互联网 发布:linux c语言反编译 编辑:程序博客网 时间:2024/04/30 11:58


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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 教练不让我练车怎么办 考三要练车教练不给练怎么办 科目二指纹打卡指纹不清楚怎么办 教练凶你的时候怎么办 人行聘用制3年后怎么办 道路运输从业资格证过期了怎么办 码头如果要危险运输证怎么办? 7座车怎么办载客营运证 商调函到了原单位不配合怎么办 公司车辆超证了怎么办? 准迁证过期了5年怎么办 天津中派木业不发工资怎么办 在香港餐厅嫌冷怎么办 出国读研报到证怎么办 高中后出国留学档案怎么办 爱迪花园拆了怎么办 燕郊房子卖了户口怎么办 强制险单子丢了怎么办 车辆保险贴丢了怎么办 车险原单子丢了怎么办 车险保单丢了该怎么办? 审车保险单丢了怎么办 湖州公积金贷款买房具体信用怎么办 驾驶本扣分满了怎么办 摩托车被扣12分怎么办 驾照被扣12分怎么办 骑摩托被扣12分怎么办 摩托车没有驾照违章被扣分怎么办 高考登录密码丢了怎么办 高中档案遗失里面体检表怎么办 驾校不给补科一成绩单怎么办 外地驾照转广州体检表怎么办 驾照体检表签名签错怎么办 改完名字后护照怎么办 办健康证没有身份证怎么办 身份证掉了怎么办健康证 华师附小不搬了怎么办 健康证快到期了怎么办 老公想去日本打工怎么办 学生没有资产证明怎么办日本签证 在读证明学校不按模版怎么办