【问题标题】:Check if associative array element exists in bash检查bash中是否存在关联数组元素
【发布时间】:2018-02-24 17:46:25
【问题描述】:

在 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

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

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

if [[ -v "${new_loc[${locale}]}" ]]
    then
        echo -e "${locale} has a new_loc"
    fi
fi

关于我可以如何测试的任何想法?

【问题讨论】:

    标签: arrays bash associative-array


    【解决方案1】:

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

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

    【讨论】:

    • 你的$BASH_VERSION是什么?
    • 您需要 bash 4.3 或更高版本,-v 才能使用数组索引。
    【解决方案2】:

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

    例子:

    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
    

    【讨论】:

    • -n! -z 相同
    【解决方案3】:

    对于旧版本的 bash(looks like[[ -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
    

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


    来自@chepner 的更好建议:

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

    【讨论】:

    • 使用${name[$locale]+unset},如果$locale是键,则生成非空字符串,否则为空字符串。
    • 如何将此条件放入 if 语句中?
    • if [[ -z "${name[$locale]+unset}" ]]; then echo "no name for $locale"; else echo "name for $locale is ${name[$locale]}"; fi
    猜你喜欢
    • 2020-04-11
    • 2015-08-25
    • 2012-12-31
    • 1970-01-01
    • 2017-09-05
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多