Shell命令while和IFS

moonjerx
2024-09-06 / 0 评论 / 18 阅读 / 正在检测是否收录...
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:]')

逐行解析

  1. IFS='='

    • IFS (Internal Field Separator) 是 Shell 的一个环境变量,用于定义字段分隔符。
    • 设置 IFS='=' 表示将等号 = 作为字段分隔符。
  2. read -r key value

    • read 命令用于从标准输入中读取一行。
    • -r 参数防止 read 命令将反斜杠 \ 解释为转义字符。
    • key value 表示从输入行中读取两个字段,并分别赋值给 keyvalue 变量。
  3. case $key in

    • case 命令用于模式匹配。
    • $key 是从输入行中读取的第一个字段(配置项的键)。
    • ;; 用于结束每个模式匹配分支。
  4. 模式匹配分支

    • 每个 ;; 前面的部分表示一个模式匹配条件。
    • 如果 $key 匹配某个模式,则执行对应的命令。
  5. "${C:-$value}"

    • ${C:-$value} 是 Shell 的参数扩展语法,表示如果 C 已经设置了值,则保留其值;否则使用 $value 的值。
    • 这种写法确保即使 $value 为空也不会覆盖已有的非空值。

进程替换

  • <(grep -v '^#' "$INFO_FILE" | awk -F '=' '{print $1 $2}' | tr -d '[:space:]')
  1. grep -v '^#' "$INFO_FILE"

    • grep 是一个用于文本模式搜索的工具。
    • -v 参数表示反转选择,即显示不匹配模式的行。
    • '^#' 是一个正则表达式,表示以 # 开头的行。
    • "$INFO_FILE" 表示从 info.txt 文件中读取数据。
    • 整个命令的意思是从 info.txt 中过滤掉所有以 # 开头的注释行。
  2. awk -F '=' '{print $1 $2}'

    • awk 是一个用于文本处理的工具。
    • -F '=' 设置字段分隔符为等号 =
    • '{print $1 $2}' 指定输出第一个和第二个字段(即等号两边的内容)。
    • 整个命令的意思是从前面过滤出来的行中提取配置项的键和值,并去除等号。
  3. tr -d '[:space:]'

    • tr 是一个用于翻译或删除字符的工具。
    • -d 参数表示删除某些字符。
    • '[:space:]' 是一个字符类,表示空白字符(包括空格、制表符等)。
    • 整个命令的意思是删除从 awk 输出的行中的所有空白字符。

结合起来

这段脚本的目的是从 info.txt 文件中读取配置项,并更新相应的变量。具体步骤如下:

  1. 读取配置项

    • info.txt 文件中读取每一行,并去除注释行。
    • 提取每行中的键和值,并去除空白字符。
  2. 解析配置项

    • 使用 IFS='=' 将每行分割成键和值。
    • 使用 read 命令将键和值分别赋值给 keyvalue 变量。
  3. 更新变量

    • 根据键名更新相应的变量。
    • 如果变量已有值,则保留原值;否则使用新读取的值。

示例

假设 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

评论 (0)

取消

您的IP: