我需要对使用关联数组的脚本进行更改,以便该脚本可以在不支持关联数组的旧版本(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"