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)
关于如何测试这个的任何想法?
对于较旧版本的 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)