Bash中如何解析类字典字符串数组为字典并读取指定键值
问题说明
当前拿到的解码后配置为KEY='VALUE'格式的字符串数组,需要读取指定键(例如FOO)的对应值,不需要强制把全量内容解析为字典结构,根据使用场景选对应方案即可。
实现方案
方案1:单键快速匹配(无需全量解析,推荐iOS构建Pre-action脚本使用)
如果只需要读取1-2个指定键的值,不需要做全量字典转换,直接遍历匹配目标键前缀即可,兼容性好(适配macOS自带的低版本bash)、执行效率高,找到目标值就可以终止遍历:
# 原有DART_DEFINES解码逻辑 function entry_decode() { echo "${*}" | base64 --decode; } IFS=',' read -r -a define_items <<< "$DART_DEFINES" for index in "${!define_items[@]}" do define_items[$index]=$(entry_decode "${define_items[$index]}"); done # 读取指定键的值,示例为读取FOO TARGET_KEY="FOO" TARGET_VALUE="" for item in "${define_items[@]}"; do # 匹配当前项是否为目标键开头 if [[ $item == "${TARGET_KEY}="* ]]; then # 截取等号后的内容,去除首尾包裹的单引号 TARGET_VALUE=${item#*=} TARGET_VALUE=${TARGET_VALUE#\'} TARGET_VALUE=${TARGET_VALUE%\'} break fi done # 此时$TARGET_VALUE即为对应键的存储值 echo "读取到${TARGET_KEY}的值:${TARGET_VALUE}"
方案2:全量解析为关联数组(适合多键频繁读取场景)
如果后续需要读取3个及以上配置项,可以一次性把所有内容解析为bash原生关联数组,后续直接按键取值即可。注意该方案依赖bash 4.0及以上版本,macOS系统默认自带的bash为3.2版本,需要提前升级bash才能正常使用:
# 声明关联数组结构 declare -A define_dict # 解码+解析存入字典 function entry_decode() { echo "${*}" | base64 --decode; } IFS=',' read -r -a define_items <<< "$DART_DEFINES" for index in "${!define_items[@]}" do item=$(entry_decode "${define_items[$index]}") # 拆分键、值 key=${item%%=*} value=${item#*=} # 去除值首尾的单引号 value=${value#\'} value=${value%\'} define_dict[$key]=$value done # 后续直接按键取值即可 echo "FOO值:${define_dict[FOO]}" echo "BAR值:${define_dict[BAR]}"
提示:如果配置值本身包含单引号,需要根据实际转义规则调整字符串截取逻辑,常规无特殊字符的配置场景下上述代码可以直接使用。
内容的提问来源于stack exchange,提问作者user9836706
相关产品推荐
相关产品推荐

