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

Mar*_*ski 3 arrays bash associative-array

在 bash 脚本中,我在变量中有一个语言环境,如下所示

locale=fr_ma
Run Code Online (Sandbox Code Playgroud)

我也有一个像这样的关联数组

declare -A new_loc_map
new_loc[fr_ma]=en_ma
new_loc[el_gr]=en_gr
new_loc[sl_si]=en_si
Run Code Online (Sandbox Code Playgroud)

我想检查new_loc带键的元素是否${locale}存在

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

if [[ -v "${new_loc[${locale}]}" ]]
    then
        echo -e "${locale} has a new_loc"
    fi
fi
Run Code Online (Sandbox Code Playgroud)

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

gle*_*man 5

对于较旧版本的 bash(看起来 [[ -v array[index] ]]是在 4.3 版中引入的),您可以使用${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
Run Code Online (Sandbox Code Playgroud)

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


来自@chepner 的更好建议:

if [[ -z "${name[$locale]+unset}" ]]; then 
    echo "no name for $locale"
else 
    echo "name for $locale is ${name[$locale]}"
fi 
Run Code Online (Sandbox Code Playgroud)

  • 使用`${name[$locale]+unset}`,如果`$locale` 是一个键,它将产生一个非空字符串,否则将产生一个空字符串。 (2认同)