我正在尝试从bash中的逗号分隔变量字符串中按名称(var1
,var2
或var3
)提取变量的值:
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
。是否有更优雅和/或更强大的解决方案?
答案 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