如何在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无法正常运行的核心原因:
file.txt的格式不是bash可直接识别的数组定义,source后无法生成EDF[var2]这类变量[[与$EDF[var2]之间缺少空格,违反bash语法规范-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
相关产品推荐
相关产品推荐

