问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

启动所有配置文件shell脚本怎么写

发布网友 发布时间:2022-04-22 09:30

我来回答

1个回答

热心网友 时间:2023-09-08 09:37

key=value 文本格式配置

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

例子 1:ntp 配置文件

$ cat /etc/sysconfig/ntpd
# Drop root to id 'ntp:ntp' by default.
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"

# 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="yes"
HOSTNAME="xx.com"
而且,要注意得是,一般 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="CLUSTER_A"
c_cluster_type=1
在脚本中,我们可以这样来导入相应集群的配置:

function load_config()
{
local cluster_name="$1"

if [ -f "conf.d/$cluster_name" ]; then
. conf.d/$cluster_name
fi
}

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

# cat global.conf
g_conf_dir=conf.d # 配置文件目录
g_version="0.1" # 全局配置
脚本相应调整下:

GLOBAL_CONF=/etc/xxx/global.conf

if [ -f "$GLOBAL_CONF" ]; then
. $GLOBAL_CONF
fi

if [[ "$g_conf_dir" != /* ]]; then # 如果是相对路径
g_conf_dir="$(dirname $GLOBAL_CONF)/$g_conf_dir"
fi

function load_config()
{
local cluster_name="$1"

if [ -f "$g_conf_dir/$cluster_name" ]; then
. $g_conf_dir/$cluster_name
fi
}

load_config CLUSTER_A
类 ini 配置格式

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

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

[DEFAULT]
g_version="0.1" ; 全局配置

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

$ cat cluster.conf
# global config
g_version="0.1" # 全局配置

function section_cluster_a()
{
c_cluster_name="CLUSTER_A"
c_cluster_type=1
}

function section_cluster_b()
{
c_cluster_name="CLUSTER_B"
c_cluster_type=1
}
配套的配置文件解析库:

$ cat config.sh
#!/bin/echo Warnning, this library must only be sourced!

if [ ! -f "cluster.conf" ]; then
exit 0 # or print error before exit
fi

. cluster.conf

function load_config()
{
local cluster_name=$(echo "$1" | tr A-Z.- a-z__) # 特殊符号转换
section_$cluster_name &>/dev/null # 执行函数,将集群的配置赋值给对应的全局变量
}

function option()
{
local opt_name="$1"

if [[ "$opt_name" != c_* ]]; then # no "c_" prefix
opt_name="c_$opt_name"
fi

echo "${!opt_name}" # indirect reference by variable name
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么是诸葛亮 卧龙,凤雏,冢虎,幼麟得一可安天下,为啥刘备失败? 潮州老式粿汁的做法 求一篇六百字作文。题目大概是:找一个话题跟父母展开一次朋友式的... 老师让以某个话题,给父母进行一次朋友式的书信往来, 急急急!! 与父母进行一次朋友式的通信。 我该怎样和室友相处呢,我们宿舍很糟糕,很差? 京东商城我的用户上有钱怎么用用户上的钱买东西啊 我在我朋友那个京东账户里有钱可他没实名怎么可以用那些钱来买... 上海市护士延续注册怎么办理 如何调制各种火锅底汤 写一个shell脚本,往脚本传一个配置文件路径,脚本去扫描配置文件内容,配置文件内容是若干个文件名 想在家吃火锅,请教如何调制火锅底料? shell脚本怎样读取文件的值,并赋值给变量 自己在家怎么调清汤火锅底 怎么在用shell脚本读取一个文件中指定的内容 清汤火锅底料怎么调制 如何用shell脚本读取文件的内容 火锅底自己在家怎么做 写一个shell脚本,往脚本传一个配置文件路径,脚本去扫描配置文件内容,配置文件内容是若干个文件名 怎么调制火锅底料呢? shell脚本读取配置文件中指定的内容 如何获取? shell脚本执行中如何自动读取需要配置的文件? shell脚本读取配置文件 iPhone xs 屏幕间歇性失灵? iphone xs屏幕失灵了不管用要怎么办? 脚上脱皮很痒怎么办;想知道用什么啊 脚痒脱皮用什么药好;有没有什么法 脚痒脱皮用什么药? 脚上起水泡脱皮很痒怎么办? shell脚本 读取文件 执行 火锅汤底怎么弄 怎么在shell脚本里读取另一个properties文件的变量? 自己在家怎么做火锅的锅底呢? 如何创建百度百科? 如何调配火锅底料 怎么在shell脚本里读取另一个properties文件的变量 如何从一个文件读取shell脚本执行参数 火锅底料如何调制? 如何在shell脚本里读取另一个properties文件的变量 怎么调制味道好的火锅底料 shell 读取一个文件,要按一定格式截取并读取其值 编写的意思 shell脚本中,我要在配置文件写入东西,但是截取的内容可能没有,我想如果没有填入其他的东西 linux脚本中要读取一个配置文件的参数,该怎么实现? 日本豆腐有股臭味 日本豆腐有膻味正常吗 日本豆腐 是什么味道 日本豆腐一股腥味怎么办 日本豆腐和中国豆腐有什么区别?