使用 Bash 解析配置文件

将配置文件与代码分离,使任何人无需特殊的编程技能即可更改其配置。
39 位读者喜欢这篇文章。
bash logo on green background

Opensource.com

将程序配置与代码分离非常重要。它使非程序员能够在不修改程序代码的情况下更改配置。 对于编译后的二进制可执行文件,这对于非程序员来说是不可能的,因为它不仅需要访问源文件(我们通过开源程序可以获得),还需要程序员的技能。 很少有人具备这些条件,而且大多数人不想学习。

对于像 Bash 这样的 Shell 语言,源代码访问在定义上是可用的,因为 Shell 脚本不会被编译成二进制格式。 尽管具有这种开放性,但对于非程序员来说,在 Shell 脚本中查找和更改它们并不是一个特别好的主意。 即使是知识渊博的开发人员和系统管理员也可能进行意外更改,从而导致错误或更糟的情况。

因此,将配置项放入易于维护的文本文件中可以提供分离,并允许非程序员编辑配置元素,而无需担心对代码进行意外更改。 许多开发人员对用编译语言编写的程序执行此操作,因为他们不希望用户成为开发人员。 出于许多相同的原因,对解释型 Shell 语言执行此操作也是有意义的。

通常的方式

与许多其他语言一样,您可以编写 Bash 程序的代码,该程序读取和解析 ASCII 文本配置文件,读取变量名,并在程序代码执行时设置值。 例如,配置文件可能如下所示

var1=LinuxGeek46
var2=Opensource.com

该程序将读取该文件,解析每一行,并将值设置到每个变量中。

执行 (Sourcing)

Bash 使用一种更简单的方法来解析和设置变量,称为执行。 从可执行 Shell 程序执行外部文件是一种简单的方法,可将该文件的内容完整地包含到 Shell 程序中。 从某种意义上说,这非常像编译语言的 include 语句,它在运行时包含库文件。 这样的文件可以包括任何类型的 Bash 代码,包括变量赋值。

与往常一样,演示比解释更容易。

首先,创建一个 ~/bin 目录(如果它尚不存在),并使其成为当前工作目录 (PWD)。 Linux 文件系统分层标准~/bin 定义为用户存储其可执行文件的合适位置。

在此目录中创建一个新文件。 将其命名为 main 并使其可执行

[dboth@david bin]$ touch main
[dboth@david bin]$ chmod +x main
[dboth@david bin]$

将以下内容添加到此可执行文件中

#!/bin/bash
Name="LinuxGeek"
echo $Name

并执行此 Bash 程序

[dboth@david bin]$ ./main
LinuxGeek
[dboth@david bin]$

创建一个新文件并将其命名为 ~/bin/data。 此文件不需要是可执行文件。 将以下信息添加到其中

# Sourced code and variables
echo "This is the sourced code from the data file."
FirstName="David"
LastName="Both"

将三行添加到 main 程序,使其看起来像这样

#!/bin/bash
Name="LinuxGeek"
echo $Name
source ~/bin/data
echo "First name: $FirstName"
echo "LastName: $LastName"

重新运行程序

[dboth@david bin]$ ./main
LinuxGeek
This is the sourced code from the data file.
First name: David
LastName: Both
[dboth@david bin]$

关于执行,还有一件非常酷的事情要知道。 您可以使用单个点 (.) 作为 source 命令的快捷方式。 更改 main 文件以将 . 替换为 source

#!/bin/bash
Name="LinuxGeek"
echo $Name
. ~/bin/data
echo "First name: $FirstName"
echo "LastName: $LastName"

然后再次运行程序。 结果应与上次运行完全相同。

启动 Bash

每个使用 Bash 的 Linux 主机(实际上几乎所有发行版都使用 Bash 作为默认 Shell)都包含一些出色的内置执行示例。

每当启动 Bash Shell 时,必须对其环境进行配置才能使其可用。 有五个主要文件和一个目录用于配置 Bash 环境。 它们在此处列出及其主要功能

  • /etc/profile:系统范围的环境和启动程序
  • /etc/bashrc:系统范围的函数和别名
  • /etc/profile.d/:包含用于配置各种命令行工具(例如 vimmc)以及系统管理员创建的任何自定义配置脚本的系统范围脚本的目录
  • ~/.bash_profile:用户特定的环境和启动程序
  • ~/.bashrc:用户特定的别名和函数
  • ~/.bash_logout:用户注销时要执行的用户特定命令

尝试跟踪通过这些文件的执行序列,并确定它为非登录 Bash 初始化与登录 Bash 初始化使用哪个序列。 我在我的 Linux 培训系列的第一卷第 17 章中做了这件事,使用和管理 Linux:从零到系统管理员

我会给你一个提示。 一切都从 ~/.bashrc 脚本开始。

结论

本文探讨了将代码和变量赋值提取到 Bash 程序中的执行。 这种从配置文件解析变量的方法快速、简单且灵活。 它提供了一种将 Bash 代码与变量赋值分离的方法,以允许非程序员设置这些变量的值。

接下来阅读

您离不开的 Bash 别名

厌倦了一遍又一遍地输入相同的长命令? 您是否觉得在命令行上工作效率低下? Bash 别名可以带来翻天覆地的变化。

标签
David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。 自 1996 年以来,他一直从事 Linux 和开源软件的工作,自 1969 年以来一直从事计算机工作。 他是“系统管理员的 Linux 哲学”的坚定支持者和传播者。

2 条评论

好文章!

为什么要使用“.”而不是“source”,因为“.”是当前工作目录,执行脚本时您不需要位于 /bin/data 中吗? 如果您使用“source”,它会跟随路径,无论您在执行脚本时位于哪个目录。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.