2017-11-27Linux基础知识(14)bash特性之脚本编程初步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017-11-27Linux基础知识(14)bash特性之脚本编程初步相关的知识,希望对你有一定的参考价值。

  回顾一下我们讲述了用户管理、权限管理以及还介绍了两个命令,一个是install命令,另一个是mktemp,在这里我们并不多做介绍。
  对于用户管理来说,是对权限的资源进行其隔离分配。
  而对于权限来说,是对该系统的登录用户分配给资源所应有的权限。
  那么我们在这一章节当中来讲述bash特性及bash脚本的初级编程。

一、bash是什么

  我们先来看一张图用来解释什么是bash。

技术分享图片

  在这张图中我们可以看到,最内部的是硬件,而后是内核,内核将硬件的复杂性和区别性给隐藏起来,输出成一个统一而又简洁的接口,我们就把它称之为系统调用,在这个外层当中程序员使用该接口就可以无视底层硬件的复杂性,程序员通过系统调用接口来开发程序,但系统调用为了做的足够的简洁,所以它做的非常的底层,只是将复杂的硬件隐藏起来,而后又向外输出,由于系统调用接口太过于底层,所以程序的开发周期会非常的长,而且维护起来也是极为不便的,不过在早期确实有很大的好处,因为要换取较好的性能,不过现在的计算机性能已经大幅度的提升,为了能让程序开发的更快,即使有写冗余的代码也是无所谓的,所以在系统调用上有封装了一个库函数,使得开发程序可直接调用库函数就可以,离人又更进了一步。
  而终端是用户交互的手段,是我们用户最先接触的一个东西,我们使用该终端间接控制内核,用户是不能够对内核进行操作的,因为在这个环节链条上,最薄弱的环节无非就是人类了,而终端的界面我们也称之为shell界面,在之前的第三章我们讲述了shell接口,分别是GUI和CLI,GUI在服务器当中并不常用,而CLI界面是文本界面,是服务器中必须要用它来对系统进行操作的,我们如何查看系统支持那些shell就在/etc/shells中查看。

   # cat /etc/shells 
   /bin/sh
   /bin/bash
   /sbin/nologin
   /usr/bin/sh
   /usr/bin/bash
   /usr/sbin/nologin

二、bash特性

  除了我们之前讲过的bash中的命令补全和命令行展开等,还有其它的特性,我们现在一一列举bash特性:

   命令行展开:~, {}
   命令别名: alias, unalias
   命令历史: history
   文件名通配:glob
   命令环境变量:$PATH
   快捷键:Ctrl+a, e, u, l
   路径补全:

  我们来说一下别名,别名是将原来的命令给隐藏起来,换成用户人为的命令,它是一个shell内部命令,命令格式如下:

   alias [-p] [name[=value] ... ]

  不过在shell中设置的,一退出终端就没有了,所以我们可以写在配置文件里,例如:.bashrc退出终端后即可生效,不过这是个人,并不是全局设置。

2.1 bash特性之命令hash

  我们此前说过命令在$PATH环境变量中查找的过程,我们在shell中输入某个字符,shell会从$PATH中从左往右依次查找该命令,如果找到则停止查找,找不到shell也会提示相应的结果,hash命令就是将$PATH变量中查找到的命令给缓存下来,将命令的查找结果放到内存当中,这样的话缓存下来的命令就不用在$PATH变量中进行查找了。其存储的格式为:key-value。

   key:搜索键
   value:值

  hash命令的选项有:

   hash:列出;
   hash -d COMMAND:删除某个命令;
   hash -r:清空;

2.2 bash特性之变量

  任何一种编程语言都有变量,程序是由指令加数据组成的,指令就是由程序文件来提供,而数据的提供是由IO、文件、管道和变量来提供,所以程序又可以称之为算法加数据结构。
而变量的参与就是将文件的某个数据放入到内存中进行CPU指令运行或运算,其结果放入到另外一个内存中去,最后将其输出出来。
  变量也是提供数据的一种方式,它是内存运行申请的一块空间,而变量名称是内存运行空间的起始地址。所以变量名+指向的空间共同组成。变量的赋值方法我们之前也讲过name=value。
  变量的类型也有很多种,它是指值的存储类型,根据其存储格式(主要是数值还是字符)、表示的数据范围以及参与的运算,主要围绕这几个而展开,定义的变量类型就定义了其存储格式和其能够参与的运算。而编程语言类型来讲,根据类型的要求是否严格,我们大致分为其两类,一种是强类型变量编程语言,不能有一点违反的规则,该是数值就是数值,先编译后执行;另一种是弱类型变量编程语言,边解释边执行。而shell就是弱类型的语言,因为bash把所有的变量统统视作为字符型。而且bash的变量无需事先声明;相当于就是把声明和赋值的过程同时实现。所以说通常变量的声明也就是类型和变量名称。
  我们把变量名出现的地方转换为数据地方叫做变量替换,换句话说是把变量名出现的位置替换为其所指向的内存中的数据,而这个就叫做变量替换。
  那么变量引用就是取得一个变量名所指向的在内存空间中的数据。例如${var_name}, $var_name。
变量名的命令规定为:变量名只能包含数字、字母和下划线,但不能以数字开头。而变量名的命名我们也要尽可能做到其见名知义,命名机制遵循某种法则;不能够使用程序的保留字,例如:if, else, then, for等。

2.3 bash变量类型

  这里的bash的变量类型是指的它的作用域的变量类型,共有三类,分别是本地变量、环境变量和局部变量,还有位置参数变量以及特殊变量。总结如下:

   本地变量:作用域仅限为当前shell;
   环境变量:作用域为当前shell进程及其子shell进程;
   局部变量:作用域仅为某代码片段(通常用于函数上下文当中);

   位置参数变量:向执行脚本的shell进程传递参数;
   特殊变量:shell内置的有特殊功用的变量;
	   例如:$?
	  	  0:成功
		  1-255:失败

  我们现在来看一下本地变量的使用方法,主要查看如何变量赋值和引用,以及查看变量和撤销变量。

   变量赋值:name=value
   变量引用:${name}, $name
	   "":变量名会替换其值;
	   '':变量名不会替换为其值;
   查看变量:set
   撤销变量:unset name
	   注意:此处非变量引用;

  而环境变量的使用方法也是和本地变量也是基本相同的,不过在作用域上范围比本地变量大一些。

   变量赋值:
	   (1) export name=value
	   (2) name=value
	     export name
	   (3) declare -x name=value
	   (4) name=value
	     declare -x name
	
	   注意:导出时不要在变量前加$,因为这是一种处理机制,而不是应用。
       变量引用:${name}, $name

   注意:bash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境
	   PATH, HISTFILE, HISTFILESIZE, HISTCONTROL, SHELL, HOME, UID, PWD, OLDPWD等;

   查看环境变量:export, declare -x, printenv, env

  我们还可以定义只读变量,但只读变量是无非重新赋值,并且也不支持撤销;存活时间为当前shell进程的生命周期,说明它是随着shell进程而终止的。

   (2) readonly name

2.4 bash特性之多命令执行

  多命令执行是指在同一个命令行当中执行多条命令,如果你的命令没有什么逻辑关系,只是先后依次运行,用;分隔开即可;无论执行正确或错误,将所有的命令依次执行完成。

   # COMMAND1; COMMAND2; COMMAND3; ...

  还有就是根据逻辑运算之间来进行多命令执行,根据布尔型来得到其结果,就是真或假。

   真(true, yes, on, 1)
   假(false, no, off, 0)

  不过,对于命令的状态返回结果来讲,真表示为0,所以说逻辑的运算结果:0表示真。有以下逻辑表达运算方式,分别是与、或、非,那么与就是乘法,除以任何数都等于0,非就是加法,1加上0等于1,而非就是取反。

   与:(乘法)
	   1 && 1 = 1
	   1 && 0 = 0
	   0 && 1 = 0
	   0 && 0 = 0
   或:(加法)
	   1 || 1 = 1
	   1 || 0 = 1
	   0 || 1 = 1
	   0 || 0 = 0
   非:
	   ! 1 = 0
	   ! 0 = 1

  那么我们说一下短路法则,我们以一下案例来说明:

   # COMMAND1 && COMMAND2

  这个意思就是COMMAND1的执行结果如果为真,就必须执行COMMAND2;如果COMMAND1执行状态结果为假时,则COMMAND2不会执行,这个我们称之为串联。

   # COMMAND1 || COMMAND2

  这个就是COMMAND1执行状态结果为真时,则COMMAND2不会被执行,但如果COMMAND1执行状态结果为假时,COMMAND2就会被执行。这个我们称之为并联。
  示例:

   id $username || useradd  $username


以上是关于2017-11-27Linux基础知识(14)bash特性之脚本编程初步的主要内容,如果未能解决你的问题,请参考以下文章

2017-11-27

2017.11.27T19_B3_U3

2017.11.27T19_8

2017.11.27T19_8zuoye

微信公众号基础02_获取accessToken和用户信息

2017.11.27