Bash 点滴

任何操作系统的核心称之为 kernel,这里完成一个操作系统最中心的各类任务,同时,其也是操作系统最重要、最“柔软”的部分,当然应当重点保护,为此,各种操作系统都在其 kernel 的外部,部署一个“坚硬”的外壳对其 kernel 进行保护。这个壳在英文中即称为 shell。shell 这个名字借用比喻的手法,起的非常的形象,就像蜗牛坚硬的外壳保护蜗牛柔软的躯体一样,shell 用来保护操作系统“柔软”的 kernel 不直接应对外界刺激干扰。

不同操作系统与用于应用层与内核通信、保护内核的 shell 各不相同,bash 即是 linux 系统所使用的典型 shell 之一。

各种命令通过 bash 与 linux 内核进行沟通,bash 要想完美充当好命令与操作系统内核的“中介”,必须具备几个典型的特点:

  1. 首先,它要能够读懂各种命令,并将其顺利下达给 kernel;
  2. 其次,它应有能力安排各种命令之间的执行顺序,使其有条不紊;

所以,bash 也可以称作“命令语言解释器(command language interpreter)”,其读取来自标准输入或文件的命令,并执行这些命令,完成任务(bash 手册语)。如果我们把 bash 环境中可以执行的众多命令看成一个更大语言的元素集的话,则 bash 可以被认为是这个更大语言的“解释器” — 即由众多命令组成语言的解释器。

一、bash的使用基础

bash 就是为处理各种命令,组织各种命令而生的。

1. 命令基本信息获取

那么,首当其冲的一个问题就是:在 bash 看来,到底有多少种类型的命令?这些命令都从哪里来,即存放在什么地方?

linux 提供了解决这些问题的手段 — type命令

type — “官方命令”的“魔镜”,提供命令的“反射机制”

这里借用程序设计语言中“反射”的概念。

linux 的 bash 环境下有诸多命令,安装新的软件又会带来许多新的命令,如何知道该命令属于哪一类命令?这个命令文件在哪个目录下存储?是我们使用命令的经常关心的问题。而type为查看各个命令的“元数据”提供了手段,使得我们得以查看一个命令自身的基本状态。

  • 一个命令到底是 “ 外部命令/别名/bash shell内置命令”?
  • 如是外部命令,存储路径是什么?

藉由利器type的帮助,我们可以对bash shell下准备使用的任何命令有一个基本的认识。
值得注意的一点是,type能找到在PATH变量路径集合中的命令,在“官方路径集合”之外的命令,type是找不到的。

2. 变量

要想为各命令的控制提供足够的灵活度,变量的设计必不可少。bash 中当然也包含变量。

1) 变量如何表示?

bash 中用“ $ + 字符串 ” 表示一个变量,如 $name$age$PATH 等都是bash中的变量。

2) 变量如何定义?

bash 中变量定义具有典型的弱语言特征,直接对变量进行赋值即完成定义。

3) 变量有多少种类型?

bash 的主要任务是处理各种命令,其变量类型的设计当然也是紧紧围绕这一目的。各命令都是用字符串来表示的,理所当然,字符串类型是 bash 变量最主要的变量类型,也是默认的变量类型。除此之外,变量类型还有 integer 类型、array 类型、map/dict类型。

a) 如何“设置”变量类型

在 bash 中,一个变量具有多种属性,变量类型是一个变量众多属性中的一种,设置变量类型,本质上就是为变量添加对应类型的属性。

在 bash 中,如何修改变量属性呢?

通过内置命令 declare 。declare 命令本质上是为变量添加各种属性,变量的这些属性包括变量的类型、变量作用范围等。核心操作方法是:

declare   – attr_1   var_name   为变量 var_name 添加属性 attr_1
       + attr_1   var_name   为变量 var_name 删除属性 attr_2

具体变量类型设置方法如下:

declare  -i  var_name   设置 integer 类型变量
declare  -a  var_name   设置 array 类型变量
declare  -A  var_name   设置 map 类型变量
declare  -r  var_name   设置 readonly 变量

b)如何“查看”变量类型

查看变量类型,本质就是查看一个 bash 变量是否具有相应类型的属性。在 bash 中,内置命令 declare 同样提供了变量属性查看的方法。具体操作操作方法如下:

declare   -p   var_name   显示变量 var_name 的属性信息(当然包括类型信息)
declare   -p         显示所有变量的属性信息

4) 变量的作用范围(环境变量与自定义变量)

bash 变量作用于 bash 进程内,依变量的作用范围而言(主要指能否在 bash 及其子进程之间共享),bash 的变量分为两大类:环境变量用户自定义变量。环境变量可视为全局变量,用户自定义变量可视为局部变量,两者之间可以通过命令进行身份的转换。

对于环境变量,值得注意的是,一个 bash 的环境变量仅仅适用于该 bash 及其子进程的操作环境,这一点对于用户在某个 bash 环境中自定义的环境变量尤其重要,这些自定义的环境变量仅仅适用于该 bash 及其子进程,对其它不相关的 bash 环境不起作用。

  • 显示所有环境变量 — env、export
  • 显示所有变量(包括环境变量和自定义变量)– declare、set
  • 环境变量与自定义变量转换
    • 利用 export 内置命令

      export   var_name   将自定义变量 var_name 转换成环境变量

    • 利用 declare 内置命令
      利用 declare 设置变量的作用域,就是为变量添加环境(全局)属性。变量加上环境属性就是环境变量,删除环境属性就是自定义变量。

      declare   -x   var_name    将自定义变量 var_name 转换成环境变量
      declare   +x   var_name   将环境变量 var_name 转换成普通变量

二、 bash对命令的组织协作

三、 bash的核心战斗力 — 对字符串的处理能力

发表评论

电子邮件地址不会被公开。 必填项已用*标注