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特性之脚本编程初步的主要内容,如果未能解决你的问题,请参考以下文章