检查bash中是否存在关联数组元素

时间:2017-09-15 13:49:09

标签: arrays bash associative-array

在bash脚本中,我有一个像这样的变量的区域设置

locale=fr_ma

我也有像这样的关联数组

declare -A new_loc_map
new_loc[fr_ma]=en_ma
new_loc[el_gr]=en_gr
new_loc[sl_si]=en_si

我想检查密钥new_loc的{​​{1}}元素是否存在

我认为这应该有用,但它没有:

${locale}

关于我如何测试这个问题的任何想法?

3 个答案:

答案 0 :(得分:2)

-v将(索引的)名称作为其参数,因为您首先要确定扩展是否有意义。

if [[ -v new_loc[$locale] ]]; then
    echo "Locale ${locale} now maps to ${new_loc[$locale]}"
fi

答案 1 :(得分:2)

对于旧版本的bash(版本4.3中引入了looks like [[ -v array[index] ]]),您可以使用${var-word}表单来测试已设置的变量:

$ zz="$RANDOM$RANDOM$RANDOM"
$ echo $zz
270502100415054
$ declare -a name
$ locale=foo

$ [[ ${name[$locale]-$zz} = "$zz" ]] && echo var is unset || echo var has a value
var is unset

$ name[$locale]=""
$ [[ ${name[$locale]-$zz} = "$zz" ]] && echo var is unset || echo var has a value
var has a value

$ [[ ${name[$locale]:-$zz} = "$zz" ]] && echo var is unset or empty || echo var has a value
var is unset or empty

棘手的部分是设计一个$zz字符串,它不会在数组中显示为实际数据。

来自@chepner的更好的建议:

if [[ -z "${name[$locale]+unset}" ]]; then 
    echo "no name for $locale"
else 
    echo "name for $locale is ${name[$locale]}"
fi 

答案 2 :(得分:1)

我设法通过检查变量是否不是空字符串来解决问题。

示例:

locale=fr_ma
declare -A new_loc
new_loc[fr_ma]=en_ma
new_loc[el_gr]=en_gr

if [[ ! -z ${new_loc[$locale]} ]]; then
    echo "Locale ${locale} now maps to ${new_loc[$locale]}"
fi

输出:

Locale fr_ma now maps to en_ma