在逗号分隔列表中从pair中提取命名值

时间:2018-05-14 04:01:17

标签: bash shell

我正在尝试从bash中的逗号分隔变量字符串中按名称(var1var2var3)提取变量的值:

var1=foo,var2=bar,var3=baz 

我还想防止因为在上游脚本中设置变量而存在重复项的情况。如果存在重复变量,我想仅返回第一个实例的值。因此,以下示例将返回0

var1=0,var2=baz,var3=foo,var1=2

我想将值限制为0,1或2之一。因此,请使用[0-2]{1}之类的内容进行验证。

示例字符串:

export labels="zone_index=1,node_type=infra,customer=internal"

我的解决方案似乎有效,但看起来很蹩脚:

echo "$labels" | grep -oE -m1 'zone_index=[0-2]{1}' | cut -f2 -d= | head -n 1

将从示例字符串输出1。是否有更优雅和/或更强大的解决方案?

1 个答案:

答案 0 :(得分:1)

您不需要任何第三方工具来完成这项工作,只需本机shell内置插件就足够了。 shell确实为其~运算符提供了内置的正则表达式支持(从bash v3.0开始)

re='zone_index=([[:digit:]]{1,}).*'

if [[ $labels =~ $re ]]; then
    printf '%s\n' "${BASH_REMATCH[1]}"
fi

此正则表达式适用于您列出的所有案例。

  • 对于第一个

    中出现搜索字符串的情况
    labels="zone_index=1,node_type=infra,customer=internal"
    [[ $labels =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}"
    1
    
  • 对于搜索字符串重复的情况

    labels="zone_index=1,node_type=infra,zone_index=2,customer=internal"
    [[ $labels =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}"
    1
    
  • 对于搜索字符串不在开头的情况

    labels="node_type=infra,customer=internal,zone_index=2"
    [[ $labels =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}"
    2