Linux学习第二十一篇--了解bash Shell(局部变量和全局变量)

来源:互联网 发布:redis数据穿透 编辑:程序博客网 时间:2024/06/04 17:41

什么是shell?

个人觉得,接触linux的人,或多或少接触过shell名词,但是如果要问到shell具体是个什么东西,相信很多人,比如我,说不出一个子丑寅卯来.
这一篇blog的目的就是好好学习一下什么是bash shell.
我们先看一下维基上对shell的介绍.


看上面的介绍,我们可以很简单的就能够理解命令行界面,但是什么是壳层呢?


注意看被红框圈起来的地方,shell是指操作系统中,提供访问内核服务的程序.

我们此处说的shell就是这个壳层,根据上文壳层的定义,我们可以理解为只要能够访问内核服务的都是shell.
比如.我们常用的vi命令,emacs,chmod等等.
我们看一下下图:

这张图就是我理解的工作流程.
用户操作应用程序的时候,应用程序将用户的操作转换成一个个指令,然后内核接收这些指令并调用硬件进行处理.

就和种类繁多的语种一样,shell也可以分为很多个版本.

上图是在wiki上截取的一段内容,可见shell种类之繁多,那么,我们该学习哪一个呢?

Bash Shell

虽然,shell的种类很多,但是linux内置的是Bash shell,所以此处学习的bashshell.
如果想要知道在我们linux机器上可以使用shell.可以查看/etc/shells文件.

上图是我的linux系统支持的shells.

bashShell的基本操作

在我们使用linux过程中,我们可以通过上下键来查看最近执行过的命令.
这个功能就是bash提供的,他可以记忆我们之前使用过的命令.而这些历史命令实际上存放在用户家目录下的.bash_history文件内.

类似于查看历史命令,还有我们常用的tab补全功能,同样是由bash提供的,如果tab紧跟在一串指令的第一个词汇后面,那么此时tab命令的作用是补全命令,否是则是补全文件名了.

别名(alias)

在bash shell中我们可以给一组指令指定一个别名,当我们使用这个别名的时候,实际执行的是这组指令.
类似于,我们可以给一个人起一个绰号,当我们叫这个绰号的时候,大家都知道是在叫他.
而别名的作用,就类似于此.当我们给一组命令定义一个别名的时候,当调用别名时,实际执行的确实这组指令.
比如我们定义一个命令panda,当我们使用panda命令的时候,控制台打印"熊猫好帅"
首先,我们看一下,当前并没有panda这个命令.

然后,我们定义别名

最后,执行panda,命令

这就是别名的作用.

指令的三类型

我们之前学习linux的时候,说过可以用man 命令 的形式来查看命令的帮助文档.
但是我们之前并不了解,其实指令也是分类型的,
一种是类似于cd这种命令,他是内建于bash shell中的,故被称为内建指令.
还有一种是ifconfig这种命令,是我们自己安装的命令,被称为外部指令,
最后一种就是我们刚才写的"panda"这种,被称为别名.
当然这种划分是我划分的(我并不知道有木有这种划分)...为了好记忆...
如果我们想要知道某一个命令属于哪种类型的指令,我们可以使用type命令来进行查看.

//+-/
type命令可以用来查看指令的相关信息.
比如使用type cd

这样我们就可以知道cd命令是bash]shell内嵌的命令.
当然type还有一些可用的选项.
比如-t选项时,只显示指定命令的类型.
加上-P选项的时候,所有这个包含该命令的文件.
加上-a选项的时候,可以显示在环境变量$PATH路径下,所有关于该命令的文件(包括别名).

bashshell变量

在了解bashshell变量之前,我们有必要了解一下何为变量.
假设.在古代有一个九品芝麻官叫张三,这个张三虽然官小,但是他贪啊.
不仅他贪,他身边的人也贪,有一年,他们所在的地方发生天灾,就洪涝好了.
国家就批了一大批赈灾的物资来救济灾民,之前说了,这地界,不仅张三贪,他身边的人也贪.于是好好的赈灾物资,就被张三这种人瓜分了,到了灾民手里,百不足一.
很多百姓被活活饿死了.易子而食的事情,时有发生,于是,理所当然的有人反了.
这时候,国家开始方了,为了安抚灾民的情绪,于是,皇帝派了一位钦差大人来查灾银贪污案.
这时候,张三这种人开始慌了,于是,他们派出精锐,冒充灾民,在路上袭杀了钦差.但是他们漏出了马脚,这事被皇帝知道了.于是,皇帝再次派了一位钦差过来,而且,这位钦差武功高强,身边也有很多好手,加上家族背景深厚.所以,他还是被杀了...然后就没有然后了...我们是来学习的,不是听故事的...
bashShell中变量,我们就可以理解为这位钦差,没有人在意这位钦差是谁,张三这种贪官只在意一点,就是这位钦差是来查灾银的,让这位钦差查出来,大家都要死.
而,bashShell中的变量也是如此,我们不用关心这个变量的内容.只关心变量本身,
就和故事中钦差被杀又来了一位钦差一样,变量顾名思义也不是一成不变的,他能够在bashshell运行期间,被改变内容.

比如,我们登录网站的时候,往往会显示用户自定义的头像,每个用户的头像是不同的.
也就是,具体头像对应的内容是不一样的,于是我们是不是可以写一个钦差(变量),当用户真正登录的时候,我们再把变量的具体内容附上.
这也就是变量的用法.
当然,这些都只是比较笼统的说法,如果总结起来,变量就是以一组文字或符号等,来取代一串保留的数据.
忘了之前有没有提到过echo这个命令了,这里再说一次吧,
echo命令由于输出一行文本.这里只要了解这么一丢丢就好.当用到他的其他功能,再说.
刚才.说的都是变量的一些概念,其实如果是有编程基础的人,基本都知道变量...
下面说下变量的应用吧.
我们可以通过echo来读取变量的内容.
比如echo $PATH就是读取PATH变量的内容,前面的$符号是必须的,表名这是个变量.
接下来,我们试一下.


努...就这么简单的输出了PATH和LANG变量的内容.
那么,我们如何设定变量呢?貌似也很简单...  变量=内容,比如panda=帅哥
这样就定义了一个变量panda,他的内容是帅哥.

当然变量的定义是有一定的规则的
,比如变量和变量内容之间使用等号链接,且等号两边不能直接跟空格.
如果变量内容含有空格,可以使用单引号或者双引号括起来.
当然使用单引号和使用双引号是有区别的,
如果使用双引号,那么如果内容里面有特殊字符比如$LANG,那么将会被解析成对应的数据.
如果使用单引号,则不会解析.
如果我们的确需要在内容中输入$之类的特殊符号,可以使用转义字符[\]通过转义字符+特殊字符的形式使用特殊符号.
如果,我们的变量内容中需要包含其他命令提供的信息,可以使用`(这个不是单引号,而是1号键左边的按键)包含内容.但是比较推荐的形式是使用$(内容)的形式.
比如 


比较推荐使用$(内容)这种形式,比较直观.PS.我之前写我的第一个shell的时候,在网上查到资料就是用的`内容`这种形式,我以为是用单引号包裹的...搞了很久...
如果,我们拿到一个变量,不是想给这个变量重新赋值而是想给这个这个变量添加新的内容我们可以通过 变量=变量+内容的形式来修改.

貌似也挺简单的...
当然,我们定义变量的时候,最好还要遵循一点:因为系统默认的变量是大写的,所以我们自定的变量最好是小写的.免得和系统变量发生冲突.
好了,说了这么多,我们还不知道如何删除一个变量呢.
如果我们需要删除一个变量,可以使用命令unset来进行.方式也比较简单,比如,unset 变量名即可.

看 这样我们就删除了panda这个变量.

全局变量

在了解全局变量这个概念之前,我们先看两个简单的脚本文件.
我们先写第一个文本文件
echo -e '#!/bin/bash\necho $panda'>one.sh
解释一下上面的命令echo的e选项用于允许转义\标记的内容.
#!/bin/bash 这是一个脚本文件开头的声明.
而后面的内容则用于创建一个one.sh文件,并向里面添加内容.

然后,写第二个shell
echo -e '#!/bin/bash\npanda=熊猫\necho $panda\n./one.sh'>two.sh

我们看一下文档里面的内容定义了一个panda变量,内容是熊猫,然后输出了这个变量,然后调用了one.sh这个shell.
PS.在执行脚本文件的时候,我们需要注意通过.或者./等方式造成的结果可能不同,具体内容戳我,这个也是我学习时候遇到的问题,找了很久,才定位到原因.
然后,我们给这两个脚本添加执行权限
chmod u+x one.sh  two.sh

然后我们执行一下two.sh,看一下结果(需要注意的是,最好在执行two.sh之前,先unset掉之前定义的panda变量).

注意看上图红框的部分,这一部分是我们调用one.sh打印$panda变量内容的语句.
咦!?是不是很奇怪,为什么不能输出panda变量?
这就是我们要说的问题,全局变量和局部变量.
还记得我们之前提到过张三那个贪官的故事吗.如果当时来的并不本国的钦差,而是一个其他国家的钦差,那么张三他们还会这么紧张吗?
张三他们不会紧张,因为如果不是本国的钦差,那对于张三来说,这个钦差的身份没有一点用,甚至说,张三不把他当成间谍抓了就是万幸了.
这里其实也是一样的道理.我们之前在one.sh里面定义了panda这个属性,其实就相当于在one.sh定义了一个钦差.这个钦差的作用也就只能在one.sh里面.
出了one.sh,不好意思...大家不承认...
这也是为什么我们在命令行里面直接读取panda变量的时候,读取不到的原因.那么,有没有办法panda这个钦差出了one.sh这个王国依然有威慑力呢?
当然有.那就是全局变量.
还是贪官张三的那个故事,在张三那个效果上面其实还有一个大帝国,这个帝国下辖着无数小国,而贪官张三所在的国家只不过是这个帝国无数附属国之一而已.
话说,张三他们连着杀了两个钦差,皇帝受不住了,于是向帝国请求援助,于是帝国派了以为钦差,同时这位钦差还带着十万大军.
这下张三他们怂了,没办法,只能连夜逃走.这位钦差解决了这个国家的事情后,顺道又去了另一个小国喝了杯茶,然后才回到帝国.
这里的这位钦差,其实就相当于全局变量,不仅仅张三这个国家要承认这位钦差的身份,其他国家也要承认他的身份.
我们稍微修改一下刚才的two.sh.通过vi编辑器,我们将第二行的panda=熊猫,改成export panda=熊猫
然后我们再试试.

这样当我们在two.sh调用one.sh中就能够输出$panda的内容了.

当然,只需要大概理解这个概念即可了,具体的一块,我还要在开一片blog来理清楚他,主要是关于运行脚本时候线程问题.

有一点需要声明的是,上面故事讲得内容和实际上线程内存分配有些差异,这里主要是用来方便记忆,在后面的学习笔记中,我会再具体的记录这一部分,
PS:最后补充一点,这篇blog很久之前就写好了,但是因为需要返校毕业,所以,今天才补充了后面的部分,也导致了十天木有更新我的blog了.
唉....毕业的一瞬间,感觉自己就不是小孩了,瞬间变成了老年人...宝宝心里苦,宝宝非得说...

原创粉丝点击