You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中从TXT文件获取指定字符串对应的变量值

需求
  • 在file.txt中搜索指定字符串(如ABC、AME、EDF等)
  • 获取该字符串对应的变量值(例如搜索'EDF'时,获取EDF[var2]的值)

相关文件内容

file.txt

ABC:
  var1: 0
  var2: 0
EDF:
  var1: 0
 var2: 1
AME:
  var1: 0
  var2: dfl
FOk:
  var1: 0
  var2: 1
UMP:
  var1: 0
  var2: +def=

bdf.sh(原脚本存在语法与格式适配问题)

source file.txt

if [[$EDF[var2] -eq 1]]
then 
        echo "--------------------------------------";
else
    echo "=========================================";
fi

解决方案

问题说明

原bdf.sh无法正常运行的核心原因:

  1. file.txt的格式不是bash可直接识别的数组定义,source后无法生成EDF[var2]这类变量
  2. [[与$EDF[var2]之间缺少空格,违反bash语法规范
  3. -eq是数值比较运算符,若变量值为非纯数字会触发错误

方法1:单次提取指定值(用awk)

如果仅需一次性获取某个目标值,直接用awk命令即可:

# 示例:获取EDF的var2值
awk '/^EDF:/{flag=1; next} flag && /^[[:space:]]*var2:/{print $2; exit}' file.txt

执行逻辑:

  • 匹配以EDF:开头的行,标记后续行进入目标块
  • 在目标块内匹配var2行,输出对应的值后立即退出

方法2:批量解析为bash关联数组(适合脚本内多次调用)

如果需要在脚本中多次使用这些变量,可以先将配置文件解析为bash关联数组:

#!/bin/bash

# 解析file.txt为全局关联数组
parse_config() {
    local current_key
    declare -gA config
    while IFS= read -r line; do
        # 识别块标题(如ABC:)
        if [[ $line =~ ^([A-Za-z]+):$ ]]; then
            current_key="${BASH_REMATCH[1]}"
        # 识别块内的var变量行
        elif [[ -n $current_key && $line =~ ^[[:space:]]*(var[12]):[[:space:]]*(.*)$ ]]; then
            local var_name="${BASH_REMATCH[1]}"
            local var_val="${BASH_REMATCH[2]}"
            config["$current_key,$var_name"]="$var_val"
        fi
    done < file.txt
}

# 执行解析
parse_config

# 示例:获取并使用EDF的var2值
target_val="${config[EDF,var2]}"
echo "EDF[var2] = $target_val"

# 条件判断示例(字符串比较兼容非数值场景)
if [[ "$target_val" == "1" ]]; then
    echo "--------------------------------------"
else
    echo "========================================="
fi

使用说明:

  • 数组键格式为块名,变量名,例如config[EDF,var2]即可获取对应值
  • 兼容所有类型的变量值(包括字符串、特殊字符)

内容的提问来源于stack exchange,提问作者user21917643

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:13:22