在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}
关于我如何测试这个问题的任何想法?
答案 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