反向移植:有人有模仿 bash 4 关联数组的函数吗?

反向移植:有人有模仿 bash 4 关联数组的函数吗?

我需要对使用关联数组的脚本进行更改,以便该脚本可以在不支持关联数组的旧版本(v4.0 之前)的 bash 中使用。有人可以建议如何使用函数(无需外部命令)来实现这一点吗?

该功能必须支持以下内容:

mimic_associative_array --set __MY_VAR_NAME "my_key01" "my_val01"
mimic_associative_array --get __MY_VAR_NAME "my_key01"

(变量名正则表达式。[a-zA-Z_][a-zA-Z0-9_]* 以及键和值的正则表达式。[[:print:]]*)

最好,函数/脚本不要使用任何临时文件进行中间处理。

答案1

我写了下面的内容,它可以满足我最简单的需求:

#!/bin/bash

declare -a __MIMIC_ASSOC_ARRAY__VARNAME=()
declare -a __MIMIC_ASSOC_ARRAY__VARKEY=()
declare -a __MIMIC_ASSOC_ARRAY__VARVALUE=()
declare -i __MIMIC_ASSOC_ARRAY__INDEX=0

function mimic_associative_array() {

    declare func_arg=""
    declare assoc_array_name=""
    declare assoc_key_name=""
    declare assoc_value=""


    while [[ ${#} -gt 0 ]] ; do
        func_arg="${1}"
        case ${func_arg} in
            -s|--set)
                shift
                assoc_array_name="${1}"
                ## Support only the following regex. type variable names:
                if [[ ! "${assoc_array_name}" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]] ; then
                    echo "[${FUNCNAME[0]}()] Error. Unsupported variable name." >&2
                    return 1
                else
                    __MIMIC_ASSOC_ARRAY__VARNAME[${__MIMIC_ASSOC_ARRAY__INDEX}]="${assoc_array_name}"
                fi
                shift
                assoc_key_name="${1}"
                if [[ ! "${assoc_key_name}" =~ ^[[:print:]]*$ ]] ; then
                    echo "[${FUNCNAME[0]}()] Error. Unsupported key name." >&2
                    return 1
                else
                    __MIMIC_ASSOC_ARRAY__VARKEY[${__MIMIC_ASSOC_ARRAY__INDEX}]="${assoc_key_name}"
                fi
                shift
                assoc_value="${1}"
                if [[ ! "${assoc_value}" =~ ^[[:print:]]*$ ]] ; then
                    echo "[${FUNCNAME[0]}()] Error. Unsupported value." >&2
                    return 1
                else
                    __MIMIC_ASSOC_ARRAY__VARVALUE[${__MIMIC_ASSOC_ARRAY__INDEX}]="${assoc_value}"
                fi
                shift
                let __MIMIC_ASSOC_ARRAY__INDEX++
                return 0
            ;;
            -g|--get)
                shift
                assoc_array_name="${1}"
                shift
                assoc_key_name="${1}"
                declare -i int_counter=0
                while : ; do
                    if [[ "${__MIMIC_ASSOC_ARRAY__VARNAME[${int_counter}]}" == "${assoc_array_name}" && "${__MIMIC_ASSOC_ARRAY__VARKEY[${int_counter}]}" == "${assoc_key_name}" ]] ; then
                        printf "${__MIMIC_ASSOC_ARRAY__VARVALUE[${int_counter}]}"
                        return 0
                    fi
                    let int_counter++
                    if [[ ${int_counter} -gt ${#__MIMIC_ASSOC_ARRAY__VARNAME[@]} ]] ; then
                        break
                    fi
                done
                return 2
            ;;
        esac
    done
}

mimic_associative_array --set __MY_ASSOC03 "key01" "a03:val01"
mimic_associative_array --get __MY_ASSOC03 "key01"

相关内容