while IFS='=' read -r key value; do
case $key in
C)
C="${C:-$value}"
;;
ST)
ST="${ST:-$value}"
;;
L)
L="${L:-$value}"
;;
O)
O="${O:-$value}"
;;
OU)
OU="${OU:-$value}"
;;
CN)
CN="${CN:-$value}"
;;
emailAddress)
emailAddress="${emailAddress:-$value}"
;;
PKCS12Password)
PKCS12Password="${PKCS12Password:-$value}"
;;
esac
done < <(grep -v '^#' "$INFO_FILE" | awk -F '=' '{print $1 $2}' | tr -d '[:space:]')
逐行解析
IFS='='
:IFS
(Internal Field Separator) 是 Shell 的一个环境变量,用于定义字段分隔符。- 设置
IFS='='
表示将等号=
作为字段分隔符。
read -r key value
:read
命令用于从标准输入中读取一行。-r
参数防止read
命令将反斜杠\
解释为转义字符。key value
表示从输入行中读取两个字段,并分别赋值给key
和value
变量。
case $key in
:case
命令用于模式匹配。$key
是从输入行中读取的第一个字段(配置项的键)。;;
用于结束每个模式匹配分支。
模式匹配分支:
- 每个
;;
前面的部分表示一个模式匹配条件。 - 如果
$key
匹配某个模式,则执行对应的命令。
- 每个
"${C:-$value}"
:${C:-$value}
是 Shell 的参数扩展语法,表示如果C
已经设置了值,则保留其值;否则使用$value
的值。- 这种写法确保即使
$value
为空也不会覆盖已有的非空值。
进程替换
<(grep -v '^#' "$INFO_FILE" | awk -F '=' '{print $1 $2}' | tr -d '[:space:]')
:
grep -v '^#' "$INFO_FILE"
:grep
是一个用于文本模式搜索的工具。-v
参数表示反转选择,即显示不匹配模式的行。'^#'
是一个正则表达式,表示以#
开头的行。"$INFO_FILE"
表示从info.txt
文件中读取数据。- 整个命令的意思是从
info.txt
中过滤掉所有以#
开头的注释行。
awk -F '=' '{print $1 $2}'
:awk
是一个用于文本处理的工具。-F '='
设置字段分隔符为等号=
。'{print $1 $2}'
指定输出第一个和第二个字段(即等号两边的内容)。- 整个命令的意思是从前面过滤出来的行中提取配置项的键和值,并去除等号。
tr -d '[:space:]'
:tr
是一个用于翻译或删除字符的工具。-d
参数表示删除某些字符。'[:space:]'
是一个字符类,表示空白字符(包括空格、制表符等)。- 整个命令的意思是删除从
awk
输出的行中的所有空白字符。
结合起来
这段脚本的目的是从 info.txt
文件中读取配置项,并更新相应的变量。具体步骤如下:
读取配置项:
- 从
info.txt
文件中读取每一行,并去除注释行。 - 提取每行中的键和值,并去除空白字符。
- 从
解析配置项:
- 使用
IFS='='
将每行分割成键和值。 - 使用
read
命令将键和值分别赋值给key
和value
变量。
- 使用
更新变量:
- 根据键名更新相应的变量。
- 如果变量已有值,则保留原值;否则使用新读取的值。
示例
假设 info.txt
文件内容如下:
# 国家代码(两个字母)
C=US
# 省份或州
ST=California
# 城市
L=San Francisco
O=Nexus
OU=IT
CN=10.10.12.72
emailAddress=nexus@example.com
# PKCS12 文件密码
PKCS12Password=mysecretpassword
这段脚本会读取 info.txt
文件中的每一行,去除注释行,并更新相应的变量。最终,变量的值将如下所示:
C=US
ST=California
L=San Francisco
O=Nexus
OU=IT
CN=10.10.12.72
emailAddress=nexus@example.com
PKCS12Password=mysecretpassword
评论 (0)