浅谈 Shell 脚本配置文件格式

2026/1/27 20:09:03

浅谈 Shell 脚本配置文件格式

开发过程中为了减少 hardcode,不可避免的需要提供配置文件给用户定制。对于高级编程语言来说,因为有丰富的第三方库,可供选择的配置文件格式有很多,比如 xml、jsno、ini、yaml 等等。

key=value 文本格式配置

而对于 linux shell,基本上很难使用前面提到的各种格式。所以在 unix 系统上,很多 shell 脚本的配置文件都是纯粹的 key=value 文本格式,例如绝大多数的开机服务启动脚本、网络配置文件等。 例子 1:ntp 配置文件

$ cat /etc/sysconfig/ntpd

# Drop root to id 'ntp:ntp' by default. OPTIONS=\

# Set to 'yes' to sync hw clock after successful ntpdate SYNC_HWCLOCK=no

# Additional options for ntpdate NTPDATE_OPTIONS=\

例子 2:网络配置文件

$ cat /etc/sysconfig/network NETWORKING=\HOSTNAME=\

而且,要注意得是,一般 key=value 的等号两边不应该有空格,因为大多数脚本都是直接 source 配置文件的(当然,也有部分脚本是会自己处理配置文件格式),使用起来很简单,基本上没有解析的操作:

$ cat /etc/init.d/network

if [ ! -f /etc/sysconfig/network ]; then exit 0 fi

. /etc/sysconfig/network

理所当然,这种格式无法满足更复杂的配置文件需求,比如 ini 格式的 section。那么,在 shell 中除了满世界去找一个解析库之外,能有什么方法可以实现呢?

扩展 key=value 文本格式配置

假设,我们管理着 n 个集群,每个集群配置项都是一样的,我们需要在 shell 脚本中,可以根据集群的名称来导入对应的配置。

下面我们介绍一种最简单的方法,只需要针对第一种格式扩展下即可。我们创建一个配置文件目录conf.d,在这个目录下存放各个集群的配置文件。每个集群对应一个配置文件,文件名为集群名称,例如:

$ cat conf.d/CLUSTER_A c_cluster_name=\c_cluster_type=1

在脚本中,我们可以这样来导入相应集群的配置:

function load_config() {

local cluster_name=\

if [ -f \ . conf.d/$cluster_name fi }

load_config CLUSTER_A

因为各个集群的配置文件相互独立,所以如果包含一些全局范围的配置项,需要在每个配置文件中都增加。或者,再增加一个入口的配置文件:

# cat global.conf

g_conf_dir=conf.d # 配置文件目录 g_version=\全局配置

脚本相应调整下:

GLOBAL_CONF=/etc/xxx/global.conf

if [ -f \

. $GLOBAL_CONF fi

if [[ \如果是相对路径 g_conf_dir=\fi

function load_config() {

local cluster_name=\

if [ -f \ . $g_conf_dir/$cluster_name fi }

load_config CLUSTER_A

类 ini 配置格式

第二种方法,基本上已经可以解决我们之前假设中提出的需求,简单而且实现方便,不足的是配置文件比较零散,管理上可能不是很方便。如果,你仍然倾向于一种类似 ini 格式的配置,可以试试下面这种方法。

在这种场景下,每个集群应该是一个独立的 section,所以转换成 ini 格式,配置文件应该是这样的:

[DEFAULT]

g_version=\全局配置

[CLUSTER_A]

c_cluster_name=\c_cluster_type=1

但是,我们前面提到过,原生的 shell 是很难去解析 ini 格式的配置文件的,所以上面的形式还得变化下,我们用 shell 中的函数来模拟 section:

$ cat cluster.conf # global config

g_version=\全局配置

function section_cluster_a()

{

c_cluster_name=\ c_cluster_type=1 }

function section_cluster_b() {

c_cluster_name=\ c_cluster_type=1 }

配套的配置文件解析库:

$ cat config.sh

#!/bin/echo Warnning, this library must only be sourced!

if [ ! -f \

exit 0 # or print error before exit fi

. cluster.conf

function load_config() {

local cluster_name=$(echo \特殊符号转换 section_$cluster_name &>/dev/null # 执行函数,将集群的配置赋值给对应的全局变量 }

function option() {

local opt_name=\

if [[ \ opt_name=\ fi

echo \}

测试脚本:

$ cat test.sh . config.sh

load_config CLUSTER_B

option cluster_name # puts CLUSTER_B

在 PET 运维工具中,我是采取了第三种方式来维护集群的配置文件,基本上可以满足绝大多数需求。大家也可以晒晒你们是怎么设计 shell 的配置文件的?


浅谈 Shell 脚本配置文件格式.doc 将本文的Word文档下载到电脑
搜索更多关于: 浅谈 Shell 脚本配置文件格式 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219