初识Shell脚本

说起Shell,我们并不陌生,但很多人又不能很准确的说出Shell到底是什么,所以准确认识Shell的定位,是很有必要的。

一:Shell的初识
Shell的定位:
Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁,是一种与内核交流的外壳应用程序的统称。
这个应用程序提供了一个界面,用户通过该界面与操作系统内核交流。
Shell既是一种命令语言,又是一种编程语言。

Shell和bash的关系:
很多人搞不清Shell与bash的关系是什么,举个例子:
Shell:媒婆
bash:王婆(一个优秀的媒婆)
用户:单身男
操作系统:隔壁美女

单身男看上了隔壁美女,想要隔壁美女的微信,但他由于种种原因,不好意思直接去找隔壁美女,所以单身男找来王婆,把自己想要隔壁美女的微信这个要求告诉王婆,由王婆去找隔壁美女要微信;隔壁美女通过王婆知道了单身男的要求,但她不愿意把微信给单身男,她同样是通过王婆把不给微信的回应带给单身男。
通过这例子,简单说明了Shell是用户使用Linux桥梁,它把用户的命令告诉操作系统,再把操作系统的回应告诉用户。

Shell脚本与Shell开发环境:
Shell脚本是一种为Shell编写的脚本程序。
Shell编程只要有一个能编写代码的文本编辑器与一个能解释的脚本解释器的可以。

Shell的特点:
解释非编译型;
弱类型;
执行模式有交互式和批处理式。

单看这三个特点,相信大部分人是蒙的,没关系,以下通过代码来说明Shell的三个特点到底是什么。

二:编写简单的Shell脚本

现在的要求是要在当前目录下创建五个文件:
1.在命令行输入
touch file1
touch file2
….
touch file5
这就是交互式,采用命令行的形式:
这里写图片描述

2.采用批处理式,把命令写入Shell脚本:
①文件名最好以“.sh”为后缀,
②第一行必须以“#!”(蛇棒)开头,后指明解释器,告诉操作系统这个脚本需要什么解释器来执行,除第一行外,其他行的’#’代表注释,我们通过which bash来找到解释器的位置:
这里写图片描述

现在来编写代码实现在当前目录创建五个文件:
这里写图片描述
该脚本实现了在当前目录下创建五个文件,那么如何运行呢?
运行Shell脚本:
①chmod u+x test.sh,使其作为可执行程序:
这里写图片描述
②:作为解释器参数:直接运行解释器,参数为脚本的文件名
这里写图片描述

现在有一个最大的问题是,一个文本文件怎么能被执行呢?
Shell会fork一个子进程,子进程通过exec执行./test.sh这个程序;
exec有一种机制,如果执行的是一个文本文件,并且第一行用蛇棒指明了解释器,则用解释器程序的代码段替当前 进程,并且解释器从开始一个一个执行,这个文本文件被当作命令行参数传给解释器。
上面的/bin/bash test.sh,实际上就是父bash调用了execl(“bin/bash”,”bash”,”test.sh”,NULL);
举个例子,如果脚本里只有一个命令,那么父bash会创建子进程,子bash通过exec执行该命令,然后命令只有一行,子bash又会创建孙子bash来执行这一句命令。
以上就说明Shell是解释非编译型。

但是有一个奇怪现象是:

这里写图片描述
这个现象是,在脚本里执行cd ..之后,目录发生改变,实际真实的目录没有变化,这是很好理解的,因为bash要创建子进程来执行,与父进程不影响。
这里写图片描述
但是直接在命令行cd .,实际目录是发生了改变的。

实际上,执行命令,不一定要创建子进程,这些不需要创建子进程的命令叫做内置命令,是由父bash亲自执行,可以看做是Shell的内部函数。
至于第一个例子,把cd ..写入脚本,因为执行文本必须先fork。

那么有没有方法,在执行命令的时候规定:父bash必须亲自执行呢?
这里写图片描述
这里写图片描述
用 . 或者 source 修饰脚本,则命令由父bash亲自执行。

三:Shell变量
Shell具有弱变量的特点,Shell变量不需要定义,需要时直接使用。
规定:
1.定义变量时不能加空格,否则会被解释器认为命令加命令行参数。
2.使用变量时,前面必须加‘$’。
3.bash把所有变量当成字符串。
这里写图片描述
echo命令用于向窗口输出文本。

关于括号的问题:
这里写图片描述
我期望输出,hehehaha heihei,但是Shell将mystring和haha当成了一个全新的变量名,这个变量名没有被定义,所以为空。
解决办法就是:加括号(花括号)
这里写图片描述
加花括号标明了边界,就可以解决该问题。

猜你喜欢

转载自blog.csdn.net/han8040laixin/article/details/81141566